# 1.899,99 € in Zahl und wieder zurück wandeln



## schneewittchen (19. Dezember 2004)

Hallo,

wie kann ich am effektivsten den string "1.899,99 €" in eine Zahl wanden und anschließend wieder in einen wie oben formatierten string zurück wandeln.

Danke!


----------



## Tobias Menzel (19. Dezember 2004)

Hi,

für Zahlen kleiner als 10000 würd ich es spontan so machen:
	
	
	



```
function strToVal(str) {
	var rx = new RegExp("\\.");
	str = str.replace(rx, "");
	rx = new RegExp(",");
	str = str.replace(rx, ".");
	var val = parseFloat(str);
	return val;
}

function valToStr(val) {
	var str = val.toString();
	var rx = new RegExp("\\.");
	str = str.replace(rx, ",");
	if (str.indexOf(",") > 3) {
	   str = str.substr(0, 1) + "." + str.substr(1);
	}
	str += " €";
	return str;
}
```
 Auf die Schnelle ist mir allerdings nichts Elegantes eingefallen, die Trennpunkte für beliebig große Zahlen zu setzen (Sonntagsmüdigkeit). Aber ich bin sicher, Sven weiß es - vielleicht meldet er sich ja. 

Gruß
.


----------



## schneewittchen (19. Dezember 2004)

kleiner 10000 oder 100000?

das würde mir ja reichen aber ich schau da ziehmlich dumm drein!

schon in der ersten Zeile steh ich alt aus was passiert mit 
var rx = new RegExp("\\.");  ?


----------



## schneewittchen (19. Dezember 2004)

Ich weiß zwar nicht genau was die Funktion macht aber sie funktioniert.

Aber nur einmal aber das liegt sicherlich an meinem restlichen script.


----------



## Quaese (19. Dezember 2004)

Hi,

ich bin zwar nicht Sven, aber wenn Du Datics Funktion *valToStr*  folgendermassen 
erweiterst, sollten die Trennzeichen bei beliebigen Zahlen korrekt angezeigt werden.

```
function valToStr(val) {
    var str = val.toString();
    var rx = new RegExp("\\.");
    str = str.replace(rx, ",");

    // Anzahl der Vorkommastellen
    var intVorkommastellen = str.length - (str.length - str.indexOf(","));
    // Anzahl der Trennzeichen
    var intKTrenner = Math.floor((intVorkommastellen - 1) / 3);
    // Führende Ziffern vor dem ersten Punkt
    var intZiffern = (intVorkommastellen % 3 == 0) ? 3 : (intVorkommastellen % 3);

    // Ziffern vor dem ersten Tausendertrennzeichen mit Punkt versehen
    strNew = str.substring(0, intZiffern);
    // Hilfsstring ohne die bereits behandelten Ziffern
    strHelp = str.substr(intZiffern, (str.length - intZiffern));

    // Restlichen Tausendergruppen durchlaufen
    for(var i=0; i<intKTrenner; i++){
        // 3 Ziffern der nächsten Tausendergruppe mit Punkt an String anhängen
        strNew += "." + strHelp.substring(0, 3);
        // Neuen Hilfsstring ohne die 3 gerade behandelten Ziffern schreiben
        strHelp = strHelp.substr(intZiffern, (strHelp.length - intZiffern));
    }

    // Nachkommastellen anhängen
    strNew += str.substring(intVorkommastellen, str.length) + " EUR";

    return strNew;
}
```
Ciao
Quaese


----------



## Tobias Menzel (19. Dezember 2004)

Danke Quaese!  Ich war heute Mittag echt zu faul, darüber nachzudenken...

Gruß
.


----------



## schneewittchen (19. Dezember 2004)

Hallo,

warum will mein Programmteil nicht?

Hat da von euch eventuell jemand einen Tipp?


```
var optionen = new Array(
  "m_absaugung",
  "m_spuelpistole",
  "m_wzbruchkontrolle",
  "m_kupplungseinheit");
var preise = new Array();
  preise["m_absaugung"] = "11.000,00 €";
  preise["m_spuelpistole"] = "12.000,00 €";
  preise["m_wzbruchkontrolle"] = "13.000,00 €";
  preise["m_kupplungseinheit"] = "14.000,00 €";
var m_standard = "10.000,00 €";  <!--Grundmaschinenpreis-->
 
function preisfelder(){
 document.getElementById("m_standardpreisfeld").firstChild.nodeValue = m_standard;
  document.getElementById("m_absaugungpreisfeld").firstChild.nodeValue = preise["m_absaugung"];
        document.getElementById("m_spuelpistolepreisfeld").firstChild.nodeValue = preise["m_spuelpistole"];
         document.getElementById("m_wzbruchkontrollepreisfeld").firstChild.nodeValue = preise["m_wzbruchkontrolle"];
        document.getElementById("m_kupplungseinheitpreisfeld").firstChild.nodeValue = preise["m_kupplungseinheit"];
}
function addieren(){
        var optionspreis=0;
 for(i in optionen){
  if (document.formular.elements[optionen[i]].checked==true)
  { var rxa = new RegExp("\\.");
   preise[optionen[i]] = preise[optionen[i]].replace(rxa, "");
   rxa = new RegExp(",");
   preise[optionen[i]] = preise[optionen[i]].replace(rxa, ".");
   var preis = parseFloat(preise[optionen[i]]);
        optionspreis =+ preis    }
 }
 var rxb = new RegExp("\\.");
 m_standard = m_standard.replace(rxb, "");
 rxb = new RegExp(",");
 m_standard = m_standard.replace(rxb, ".");
 m_standard = parseFloat(m_standard);
 var summe = optionspreis + m_standard;
  
 var gesamtpreis = summe.toString();
 var rxc = new RegExp("\\.");
 gesamtpreis = gesamtpreis.replace(rxc, ",");
 if (gesamtpreis.indexOf(",") > 3) {
    gesamtpreis = gesamtpreis.substr(0, 1) + "." + gesamtpreis.substr(1);
    alert("jo");
 }
 gesamtpreis =+ " €";
        document.getElementById("gesamtpreisfeld").firstChild.nodeValue = gesamtpreis;
}
```


----------



## Quaese (19. Dezember 2004)

Hi,

beim Überfliegen ist mir aufgefallen, dass Du zweimal *=+* verwendest ( _optionspreis =+ preis_
und  _gesamtpreis =+ " €"_)! Korrekt müsste es *+=* heissen.

VIelleicht löst das bereits Dein Problem.

Ciao
Quaese


----------



## schneewittchen (19. Dezember 2004)

Ja das ist mit gerade auch aufgefallen und jetzt ist wenigstens die Fehlemeldung NaN weg. Das anhängen der Kommastellen (bei mir mit ,00) funktioniert nicht und die Funktion läuft nur ein mal bzw. sie bringt nur beim ersten mal ein Ergebnis.


----------



## schneewittchen (19. Dezember 2004)

Hallo Quaese,

wenn die Nachkommastellen ,00 oder ,X0 sind, dann werden sie in deinem Programm nicht hinzu erstellt oder?


----------



## Quaese (19. Dezember 2004)

Hi,

habe ich auch gerade festgestellt. Das liegt an der Umwandlung von einer Floatzahl in einen String.
Wird hier statt *toString()* die Methode *toFixed(2)* verwendet, so wird ein String generiert,
der einer Floatzahl mit zwei Nachkommastellen entspricht. Dh. auch die Dezimalstellen .x0 und .00
werden übernommen.

Ich habe mal etwas an Deinem Script gebastelt. Versuche mal folgendes:

```
var optionen = new Array( "m_absaugung",
                          "m_spuelpistole",
                          "m_wzbruchkontrolle",
                          "m_kupplungseinheit");

var preise = new Array();
preise["m_absaugung"]        = "11.000,00";
preise["m_spuelpistole"]     = "12.000,00";
preise["m_wzbruchkontrolle"] = "13.000,00";
preise["m_kupplungseinheit"] = "14.000,00";

var m_standard = "10.000,00"; <!--Grundmaschinenpreis-->

function preisfelder(){
    document.getElementById("m_standardpreisfeld").firstChild.nodeValue = "standard" + m_standard + " EUR";
    document.getElementById("m_absaugungpreisfeld").firstChild.nodeValue = "absaugung" + preise["m_absaugung"] + " EUR";
    document.getElementById("m_spuelpistolepreisfeld").firstChild.nodeValue = "spuelpistole" + preise["m_spuelpistole"] + " EUR";
    document.getElementById("m_wzbruchkontrollepreisfeld").firstChild.nodeValue = "bruchkontrolle" + preise["m_wzbruchkontrolle"] + " EUR";
    document.getElementById("m_kupplungseinheitpreisfeld").firstChild.nodeValue = "kupplungs" + preise["m_kupplungseinheit"] + " EUR";
}

// Funktion setzt die Tausendertrennzeichen in einer übergebenen Floatzahl
function setSeparator(varZahl){
    // Floatzahl in String mit 2 Nachkommastellen umwandeln
    varZahl = varZahl.toFixed(2);

    var rxc = new RegExp("\\.");
    varZahl = varZahl.replace(rxc, ",");

    // Anzahl der Vorkommastellen
    var intVorkommastellen = varZahl.length - (varZahl.length - varZahl.indexOf(","));
    // Anzahl der Trennzeichen
    var intKTrenner = Math.floor((intVorkommastellen - 1) / 3);
    // Führende Ziffern vor dem ersten Punkt
    var intZiffern = (intVorkommastellen % 3 == 0) ? 3 : (intVorkommastellen % 3);

    // Ziffern vor dem ersten Tausendertrennzeichen mit Punkt versehen
    strNew = varZahl.substring(0, intZiffern);
    // Hilfsstring ohne die bereits behandelten Ziffern
    strHelp = varZahl.substr(intZiffern, (varZahl.length - intZiffern));

    // Restlichen Tausendergruppen durchlaufen
    for(var i=0; i<intKTrenner; i++){
        // 3 Ziffern der nächsten Tausendergruppe mit Punkt an String anhängen
        strNew += "." + strHelp.substring(0, 3);
        // Neuen Hilfsstring ohne die 3 gerade behandelten Ziffern schreiben
        strHelp = strHelp.substr(intZiffern, (strHelp.length - intZiffern));
    }

    // Nachkommastellen anhängen
    strNew += varZahl.substring(intVorkommastellen, varZahl.length) + " EUR";

    return strNew;
}

function addieren(){
    var optionspreis = 0;

    for(i in optionen){
        if (document.formular.elements[optionen[i]].checked==true){
            // Regulärer Ausdruck zum Suchen nach Tausendertrennzeichen
            var rxa = new RegExp("\\.");
            // Tausendertrennzeichen entfernen
            varHelp = preise[optionen[i]].replace(rxa, "");
            // Regulärer Ausdruck zum Suchen nach Dezimalkomma
            rxa = new RegExp(",");
            // Zeichen für Dezimalkomma durch einen Punkt ersetzen
            varHelp = varHelp.replace(rxa, ".");
            // Float-Wert
            var preis = parseFloat(varHelp);
            // Zu Optionspreis addieren
            optionspreis += preis;
        }
    }

    var rxb = new RegExp("\\.");
    m_standard_help = m_standard.replace(rxb, "");
    rxb = new RegExp(",");
    m_standard_help = m_standard_help.replace(rxb, ".");
    m_standard_help = parseFloat(m_standard_help);
    var summe = optionspreis + m_standard_help;

    // Soll die Summe nicht in m_standard gespeichert werden, muss die nächste Zeile auskommentiert werden
    m_standard = setSeparator(summe);

    document.getElementById("gesamtpreisfeld").firstChild.nodeValue = setSeparator(summe);
}
```
Hoffentlich bringt Dich das weiter.

Ciao
Quaese


----------

