JavaSript Bug?
Rabe
- javascript
Hallo,
ich führe mit JS eine ganz normale Abfrage durch:
if(fc['minPreis'].value > fc['maxPreis'].value){
alert('Der Minimalpreis darf nicht größer sein als der Maximale.');
fc.minPreis.focus();
return false;
}
fc ist das Array mit allen Formulareingaben. minPreis und maxPreis sind beides Textfelder.
Die Abfrage funktioniert, wenn in beiden Feldern die gleiche Anzahl von Stellen eingegeben werden. Vergleicht man allerdings 900 (minPreis) mit 1200 (maxPreis) vergleicht, bekomme ich den alert.
Ich habe herausgefunden, dass wohl nur soviel Stellen abgeglichen werden wie bei minPreis eingegeben wurden.
Herausgefunden habe ich das durch die Eingabe von:
a) minPreis 750
maxPreis 400
=> alert kommt
b) minPreis 750
maxPreis 4000
=> alert kommt
Das ist komisch. Ist das ein Bug, gibt es ein Workaround?
MfG
Rabe
Yerf!
Das ist komisch.
Nur solange man es noch nicht verstanden hat.
Ist das ein Bug,
Nein, ein Feature ;-) Textfelder enthalten Strings und ein Stringvergleich reagiert anders als ein Zahlenvergleich.
gibt es ein Workaround?
parseInt() (oder auch parseFloat())
Gruß,
Harlequin
Hallo Rabe,
fc ist das Array mit allen Formulareingaben. minPreis und maxPreis sind beides Textfelder.
Aus den Textfeldern bekommst Du lediglich Strings (Zeichenketten) und keine Zahlen. Du musst die Zeichenkette, bevor Du sie vergleichst, in eine Zahl umwandeln. Hierfür steht Dir zB parseInt() oder parseFloat() zur Verfügung (je nach gewünschten Zahlentyp). Eine andere Möglichkeit ist es, den String mit 1 zu multiplizieren oder Null abzuziehen, sodass JavaScript den Datentyp "erkennt".
Mit freundlichem Gruß
Micha
Hallo,
Eine andere Möglichkeit ist es, den String mit 1 zu multiplizieren oder Null abzuziehen, sodass JavaScript den Datentyp "erkennt".
Wenn sichergestellt ist, dass die Zahlen immer positiv sind, kann man auch einfach ein + davor setzen bzw., wenn sie immer negativ sind, ein -.
Also +"123.45" wird als positive Zahl 123,45 interpretiert, und -"123.45" als negative Zahl -123.45.
Gruß, Don P
Hallo Don P,
Wenn sichergestellt ist, dass die Zahlen immer positiv sind, kann man auch einfach ein + davor setzen bzw., wenn sie immer negativ sind, ein -.
Wirklich? Das wusste ich gar nicht. Ich würde irgendwie trotzdem auf ein vorangestelltes Plus verzeichten, da der Operator "überladen" ist und mir das subjektiv nicht ganz geheuer ist ;-)
Mit freundlichem Gruß
Micha
Hallo,
Wirklich?
Ja. Beweis: Ein alert( typeof +"123.45" ); gibt tatsächlich 'Number' aus, ebenso wie ein alert( typeof -"123.45" );
Das wusste ich gar nicht.
Dann bist du kein Schüler Douglas Crockfords. Der weiß sowas und erzählt es jedem gleich im ersten Javascript-Vortrag.
Ich würde irgendwie trotzdem auf ein vorangestelltes Plus verzeichten, da der Operator "überladen" ist und mir das subjektiv nicht ganz geheuer ist ;-)
Es ist schon ein starkes Stück, den + Operator dermaßen zu überladen, da hast du recht. Mir gefallen solche Kurzschreibweisen trotzdem. Es ergibt sich einfach kompakterer Code und irgendwie allgemeiner als parsInt() oder parseFloat() ist es in diesem Fall ja auch.
Gruß, Don P
Hallo,
Der Code vom OP könnte also ganz elegant so angepasst werden:
if (+fc['minPreis'].value > +fc['maxPreis'].value) {
alert('Der Minimalpreis darf nicht größer sein als der Maximale.');
fc.minPreis.focus();
return false;
}
Das sieht doch viel besser aus als eine parseFloat()erei, oder?
Selbst wenn die Strings neagtive Zahlen repräsentieren, funktioniert das prima, denn ein
alert( +"-123.45" <= 0 );
ergibt true :-).
Gruß, Don P