Axel Hogestraat: Flexible Wärungseingabe

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

  1. 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

    --
    "Nobody wins unless everybody wins." (Bruce Springsteen)
    1. 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

      1. 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