Typumwandlung
darkestboba
- javascript
0 Cyx230 Der Martin
0 Cyx23
HILFE...;)
Ich hasse Sprachen, die selber glauben, Typumwandlungen vonehmen zu müssen... wie Javascript...;)
Also, folgendes Beispiel (Das ganze wird eine modulo10-Prüfung): Ich übergebe eine zehnstellige Zahl (die führende und schließende Nullen haben darf) als String an die Funktion a la
<Body onload="Pruefung('0006630008')">
<script language="JavaScript">
function Pruefung(testnummer){
var z=testnummer.length;
//> hier ist noch kein Problem: die Länge des
// Strings ist 10
var testnummer=testnummer.substr(0,z-1);
//> hier ist auch noch kein Problem: ich schneide die
// letzte Ziffer ab
var z=testnummer.length;
//> hier ist auch noch kein Problem: die neue Länge ist 9
var j=2;
var i;
while(z>0){
i=j*(testnummer.substr(z-1,1));
alert(i);
//>> PROBLEM: In der While-Schleife sind die Nullen
// (in dem Falle die hinteren) schon abgeschnitten
// selbst mit dreckigen Tricks a la
// testnummer=testnummer+"";
z--;
}
}
</script>
Vielen Dank für Eure Hilfe,
Falk
Hallo,
//>> PROBLEM: In der While-Schleife sind die Nullen
// (in dem Falle die hinteren) schon abgeschnitten
// selbst mit dreckigen Tricks a la
// testnummer=testnummer+"";
selbst ohne diese forcierte Umwandlung erhalte ich mit üblichen
Browsern bei deinem Code eine offenbar richtige Ausgabe, welche
Nullen sollen fehlen?
Grüsse
Cyx23
Hallo Falk,
Ich hasse Sprachen, die selber glauben, Typumwandlungen vonehmen zu müssen... wie Javascript...;)
das kann ich nachvollziehen; mir sind Sprachen mit einer strengeren Typisierung wie z.B. C auch lieber. Aber was hilft's ...
while(z>0){
i=j*(testnummer.substr(z-1,1));
alert(i);
//>> PROBLEM: In der While-Schleife sind die Nullen
// (in dem Falle die hinteren) schon abgeschnitten
// selbst mit dreckigen Tricks a la
// testnummer=testnummer+"";
Hm, an der Stelle bist du aber selbst schuld. Versuche, den Ausdruck schrittweise anzugehen:
testnummer: string
testnummer.substr(): string
j*testnummer.substr(): number
Erst durch die Multiplikation, die für String-Operanden nicht definiert ist, erfolgt eine implizite Umwandlung in 'number'. Wenn du also mit den String-Eigenschaften arbeiten willst, z.B. dass die führenden Nullen wie eingegeben erhalten bleiben, darfst du keine Operation durchführen, die eine Umwandlung erzwingt.
Vielleicht kannst du aber dein eigentliches Problem etwas anders angehen, so dass diese Widrigkeiten gar nicht ins Spiel kommen? Beschreib doch mal, was du genau vorhast, dann kann man sicher irgendwas geschickt umbauen.
Ciao,
Martin
Hallo Martin,
Hm, an der Stelle bist du aber selbst schuld. Versuche, den Ausdruck schrittweise anzugehen:
Geht es um eine Null zuviel oder hab ich da was übersehen?
var testnummer=testnummer.substr(0,z-1)+"";
Ansonsten 'funzt' alles wunderbar und Nullen werden offenbar nicht
unterschlagen. Es wird "0006630008" übergeben, letzte Stelle entfernt,
dann wird nacheinander jede Stelle (Anzahl der Zeichen ist eins) mal
Zwei ausgegeben.
Grüsse
Cyx23
Hi,
Hm, an der Stelle bist du aber selbst schuld. Versuche, den Ausdruck schrittweise anzugehen:
Geht es um eine Null zuviel oder hab ich da was übersehen?
ich dachte eher, es geht um ein paar Nullen zu wenig.
Ich habe es jedenfalls so verstanden, dass der OP eine Zahl, oder besser, eine Ziffernfolge, stur Ziffer für Ziffer verarbeiten möchte und dabei auch eventuelle führende Nullen beibehalten will. Das geht natürlich nur, solange die besagte Ziffernfolge auch als String vorliegt; sobald das Gebilde tatsächlich in eine Zahl umgewandelt wird, sind ja die führenden Nullen weg. Ja, ich kann sie bei der Ausgabe wieder ergänzen, aber ich weiß dann nicht mehr, wieviele führende Nullen der ursprüngliche Ausdruck hatte.
Deshalb war aus meiner Sicht das Kernproblem, die implizite Typumwandlung durch JS zu vermeiden.
Ansonsten 'funzt' alles wunderbar und Nullen werden offenbar nicht unterschlagen. Es wird "0006630008" übergeben, letzte Stelle entfernt, dann wird nacheinander jede Stelle (Anzahl der Zeichen ist eins) mal Zwei ausgegeben.
Hm, jetzt bin ich auch am Rätseln. Ja, durch den gezeigten Codeausschnitt müsste jede Stelle einzeln mit zwei multipliziert werden (wozu auch immer). Jetzt wird mir zwar etwas klarer, was da wirklich passiert - das Problem des OP kann ich aber plötzlich auch nicht mehr begreifen. :-(
Klär uns auf, Falk!
So long,
Martin
[...]
...komisch, eigentlich hatte ich die Antwort schon einmal gepostet...:(
Also, vielen Dank erst einmal fürs Lesen & Gedanken machen...;)
Das Ursprungs-Script ist in Clipper oder PL/SQL oder irgendeiner ähnlichen, masoschistische Verlangen vorraussetzenden Sprache geschrieben. Es dient der Kundenkartenprüfung mit einem Modulo10-Verfahren und landete irgendwann einmal kommentarlos (und ohne Angabe der verwendeten Sprache...) auf meinem Tisch und stammt von einem Unternehmen, dass Kundenkartensysteme betreibt.
Wir haben das seinerzeit in VBS implementiert und nutzen es seither im ASP-Umfeld, um die Kundencard-Daten der Abonnenten einer großen deutschen regionalzeitung zu testen...;)
Jetzt brauche ich den Kram allerdings auch einmal clientseitig.... und war aus lauter Verzweiflung schon nahe daran, das ganze in AJAX zu machen und die Berechnung auf dem Server erledigen zu lassen. Aber: Ich habe es mittlerweile auch in JS fertig (s.u.)
Das Ursprungsscript fand sich übrigens auch schon einmal hier im Forum (<a href="http://forum.de.selfhtml.org/archiv/2006/3/t126106/#m813177">http://forum.de.selfhtml.org/archiv/2006/3/t126106/#m813177</a>)
So sieht meine JS-Implementierung jetzt aus:
function CheckCardNumber(CardNumber){
//Kundenkartencheck nach Modulo10 fuer AVS-Karten
//Falk Herrmann, sz-online.de
//herrmann(at)sz-online.de
var k=0;
var j=2;
var pz=0;
var z=CardNumber.length;
var checknummer=CardNumber.substr(z-1,1);
var CardNumber=CardNumber.substr(0,z-1);
var z=CardNumber.length;
var i;
while(z>0){
i=j*(""+CardNumber.substr(z-1,1));
z--;
if(i>=10) {
i=i-9;
}
k=k+i;
if(j==2) {
j=1;
}
else {
if(j==1){
j=2;
}
}
}
var t=k/10;
t=Math.floor(t);
k=10-(10*((k/10)-t))
if (k==10) {
pz=0;
}
else {
pz=k
}
if ((checknummer-pz)==0) {
return true;
}
else {
return false;
}
}
cul,
Falk