Flexible Wärungseingabe
Axel Hogestraat
- javascript
Hallo,
ich habe ein kleines Problem bei der Auswertung von einem eingegebenen Währungsbetrag mit Javascript. Ich habe auch schon das Archiv durchsucht. leider geht mein Problem einen Schritt weiter, als alle anderen.
Bei der Eingabe einer Währung in ein Input-field soll JS prüfen, ob das Feld wirklich eine Zahl enthält.
JS verarbeitet ja Zahlen in der Form "10.50" z.B. Viele der späteren Nutzer des Systems arbeiten allerdings mit 1000er Trennzeichen und Komma. z.B. "5.000,50". Also habe ich folgendes Konstrukt angewendet:
(...)
value = value.replace(/./, "");
value = value.replace(/,/, ".");
if(isNaN(value)){
alert('Das Feld darf auschließlich Zahlen beinhalten!');
value='';
}
(...)
Jetzt besteht allerdings das Problem, das FALLS jemand die Zahl im korrekten Format eingibt (5000.50), schneidet das Programm den Punkt weg und meine Zahl ist plötzlich 500050.
Kann mir dafür evtl. jemand einen Tip geben, wie man das lösen könnte ?
Vielen Dank im Voraus
Schöne Grüße
Axel
Axel,
Da "." und "," als Trennzeichen im deutschen und angelsächsischen Sprachraum entgegengesetzt verwendet werden und sich das vermischt, würde ich beide gleich behandeln und die Anzahl der Stellen hinter dem letzten Trennzeichen (das am weitesten rechts) auswerten:
0: Angabe ist eine Ganzzahl ("10" – 10 Euro)
1: ungültige Angabe ("10.1" oder "10,1")
2: Angabe ist Dezimalbruch ("10.10" oder "10,10" – 10 Euro 10 Cent)
3: Angabe ist eine Ganzzahl ("10.100" oder "10,100" – 10100 Euro)
mehr als 3: ungültige Angabe
Die anderen Trennzeichen davor entweder ignorieren oder prüfen, ob immer Dreierblöcke gebildet werden, wenn nicht: ungültige Angabe.
Gruß,
Gunnar
Hi,
vielen Dank Gunnar. Das war genau der richtige Tip. Ich habe jetzt folgende Funktion daraus gebaastelt
function convertCurrency(value) {
// Zeichen , und . gleichsetzen
value = value.replace(/,/, ".");
// Letztes Vorkommen von "."
last = value.lastIndexOf(".");
// Teilstrings ermitteln
bgnStr = value.substring(0, last);
endStr = value.substring(last+1, value.length);
// Alle Trenn- oder Dezimalzeichen vor dem letzten entfernen
bgnStr = bgnStr.replace(/./, "");
// Prüfen der Ziffern-Anzahl nach letztem Trennzeichen
switch(endStr.length) {
case 0: // Keine Nachkommastellen -> Ganzahl zurückgeben
return bgnStr;
break;
case 1: // Eine Nachkommastelle -> Mit 0 auffüllen und zurückgeben
return bgnStr+"."+endStr+"0";
break;
case 2: // Zwei Nachkommastellen -> Zurückgeben
return bgnStr+"."+endStr;
break;
case 3: // Drei 'Nachkommastellen' -> Tausendertrennzeichen -> ohne zurückgeben
return bgnStr+endStr;
break;
default: // Mehr als Drei 'Nachkommastellen' -> Tausendertrennzeichen -> ohne zurückgeben
return bgnStr+endStr;
break;
}
}
Kleine Änderungen zu Deinem Hinweis:
1 Nachkommastelle nicht ungültig,sondern wird aufgefüllt
mehr als 3 auch nicht ungültig, sondern wird wie Tausendertrennzeichen gewertet und abgeschnitten.
Vielleicht ist die Funktion ja noch anderen hilfreich, oder es hat noch jemand Verbesserungsvorschläge.
Nochmal vielen Dank
Schöne Grüße
Axel
Sorry,
war zu voreilig. War noch etwas fehlerhaft.
So müsste es nun gehen:
function convertCurrency(value) {
// Zeichen , und . gleichsetzen
value = value.replace(/,/, ".");
// Letztes Vorkommen von "."
last = value.lastIndexOf(".");
if(last < 0) return value;
// Teilstrings ermitteln
bgnStr = value.substring(0, last);
endStr = value.substring(last+1, value.length);
// Alle Trenn- oder Dezimalzeichen vor dem letzten entfernen
bgnStr = bgnStr.replace(/./, "");
// Prüfen der Ziffern-Anzahl nach letztem Trennzeichen
switch(endStr.length) {
case 0: // Keine Nachkommastellen -> Ganzahl zurückgeben
return bgnStr+".00";
break;
case 1: // Eine Nachkommastelle -> Mit 0 auffüllen und zurückgeben
return bgnStr+"."+endStr+"0";
break;
case 2: // Zwei Nachkommastellen -> Zurückgeben
return bgnStr+"."+endStr;
break;
case 3: // Drei 'Nachkommastellen' -> Tausendertrennzeichen -> ohne zurückgeben
return bgnStr+endStr;
break;
default: // Mehr als Drei 'Nachkommastellen' -> Tausendertrennzeichen -> ohne zurückgeben
return bgnStr+endStr;
break;
}
}
Schönen Gruß
Axel