peterS.: gar nicht so einfacher regulaerer ausdruck

Beitrag lesen

gruss Andreas,

Die Anzahl der Stellen und  Nachkommastellen sind egal. Es geht
nur darum, dass ich den Preis sicher in ein Computer-tagliches
Format, also  12345.6789 umrechenn kann, indem ich einfach das
eine Komma durch einen Punkt ersetz.

Jetzt will ich wie gesagt lediglich prüfen ob die Eingabe einem
der obigen Formate entspricht:

/[0-9]*,?[0-9]+/

es gibt noch mehr moegliche formatierungen, ...

... die sich mit einem "einfachen regulaeren ausdruck"
   nicht erschlagen lassen;

in javascript habe ich mal versucht das problem zu loesen,
   indem ich die methode "String.forceToNumber()" schrieb;

diese konvertiert alle dezimalen zahlen-strings, deren
   formatierungen "human readable" sind in die entsprechenden
   fliesskommazahlen - unsinnige formatierungen werden auch
   akzeptiert, aber deswegen heisst die methode ja "forceToNumber";

der js-code ist kommentiert und hilft Dir vielleicht weiter:

String.prototype.forceToNumber = function() {
    var content = this;
    var posDot = content.lastIndexOf(".");   // letzte position von "." im string;
    var posComma = content.lastIndexOf(","); // letzte position von "," im string;
    var comma = "";
    var regExpValue = /\d+/g;
    var regExpMatch = null;
    if ((posDot >= 0) || (posComma >= 0)) {  // kommen "." oder "," im string ueberhaupt vor ?
        if (((content.split(".")).length == 2) && ((content.split(",")).length == 2)) { // falls "." als auch "," den string in genau zwei teile zerlegen koennen, ...
            content = content.split((posDot>posComma) ? (".") : (",")); //... nimm an, dass der kommaseparator dasjenige zeichen ist, welches an letzter stelle steht und teile den string genau dort;
        } else if (((content.split(".")).length == 2) && ((content.split(",")).length != 2)) { // entzweit nur "." den string, ...
            content = content.split("."); //... dann lege dieses zeichen als kommaseparator fest und teile den string genau dort;
        } else if (((content.split(".")).length != 2) && ((content.split(",")).length == 2)) { // entzweit nur "," den string, ...
            content = content.split(","); //... dann nimm dieses zeichen als kommaseparator und teile den string genau dort;
        } else {
            content = new Array(content); // anderenfalls handelt es sich um kein fuer diese methode relevantes zahlenformat;
        }
    } else {
        content = new Array(content); // "." bzw. "," sind ueberhaupt nicht bestandteil der (formatierten?) zahl;
    }
    for (var i=0;i<content.length;i++) { // nimm dir die eintraege in "content" vor - (minimal 1 eintrag ohne kommaseparator / maximal 2 eintraege mit kommaseparator);
        regExpMatch = content[i].match(regExpValue); // loese jede zahl die Du findest einzeln aus dem jeweiligen eintrag heraus;
        content[i] = ""; // leg' den default-wert fuer den jeweiligen eintrag als leer-string fest;
        if (regExpMatch) { // schau nach, ob im jeweiligen eintrag ueberhaupt zahlen vorhanden waren, ...
            for (var k=0;k<regExpMatch.length;k++) { // ... wenn ja, dann nimm Dir jede zahl einzeln vor, ...
                content[i] += regExpMatch[k]; // ... und fuege sie dem aktuellen default-wert hinzu;
            }
        }
    }
    return parseFloat((content.length == 1) ? (content[0]) : (content[0] + "." + content[1]));
 // gab es nur einen eintrag, dann nimm eben nur diesen,
 // gab es zwei eintraege, dann verbinde diese vorher mit einem "." -
 // konvertiere das gesamtergebnis auf jeden fall in eine fliesskommazahl;
};
//  var myNumber = "1 340 333,5678"; myNumber.forceToNumber() = 1340333.5678;
//  var myNumber = "1,340,333.5678"; myNumber.forceToNumber() = 1340333.5678;
//  var myNumber = "1.340,333.5678"; myNumber.forceToNumber() = 1340.3335678;
//  var myNumber = "1,340,333,5678"; myNumber.forceToNumber() = 13403335678;
//  var myNumber = "1,g40,3j3,5k7m"; myNumber.forceToNumber() = 1403357;
//  var myNumber = "1.g40,3j3.5k7m"; myNumber.forceToNumber() = 140.3357;
//  var myNumber = "1.g40,3j3,5k7m"; myNumber.forceToNumber() = 1.403357;
//  var myNumber = "yy.mm.dd"; myNumber.forceToNumber() = NaN;

by(t)e by(t)e - peterS. - pseliger@gmx.net

--
sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)