| 

.NET C# Java Javascript Exception

3
Hey!

Ich steh grad irgendwie total auf dem Schlauch.

Ich habe 2 Eingabefelder - beim verlassen von diesem (onblur) sollen aus den 2 Feldern - automatisch 2 Werte errechent werden - welche in 2 andere Felder geschrieben werden sollen. Das funktioniert soweit auch super (mit Punkten).
// wert=(a+b).toFixed(2)


Nun wird aber gewünscht, dass die Berechnung mit Komma und Punkt erfolgen soll. Oder gemischt, irgendwie krieg ich aber das Komma nicht replaced, vor der Berechnung.

Danach soll das ganze wieder mit Komma statt Punkt in die Berechneten Felder gesetzt werden.

Hat jemand irgendeinen Schnippsel rumliegen, oder kann mir fix eine Funktion für Addition und Prozentberechnung posten?

Vielen Lieben Dank!

Edit: Schreibweise von "JavaScript" im Fragen-Titel korrigiert
23.11.2010
Martin Bassus 486 1 8
Floyd 14,6k 3 9
1 Antwort
3
Hier der Code:

var regex_dot = /\./g;
var regex_comma = /\,/g;

var a = parseFloat(feld1.value.replace(regex_dot,'').replace(regex_comma,'.'));
var b = parseFloat(feld2.value.replace(regex_dot,'').replace(regex_comma,'.'));
wert=(a+b).toFixed(2)


Wichtig: Javascript rechnet immer mit dem englischen Zahlenformat. Also "," als tausender-Trennzeichen und "." als Dezimaltrenner.

Um eine String wie "100.000,10" korrekt als einhundertausendkommazehn zu parsen musst du zuerst den String vom deutschen ins englische Format überführen. Dazu entfernst du die deutschen Tausendertrennzeichen (der Punkt) und ersetzt das deutsche Dezimaltrennzeichen (das Komma) durch das englische (der Punkt).
Das ganze sieht dann so aus: "100000.10" und kann nun mit der parseFloat-Methode des JavaScripts in ein Float umgewandelt werden.

Etwas ausführlicher und in Form einer Methode

/// <summery>
/// Wandelt einen String vom deutschen ins englische Nummern-Format um.
/// </summery>
/// <param name="val">String, Int, Float oder DOM-Object</param>
/// <returns>Float oder NaN</returns>
/// <example>
/// <![CDATA[
/// wert=toEnglishFloat(feld1.value)
/// wert=toEnglishFloat(feld1)
/// wert=toEnglishFloat("1")
/// wert=toEnglishFloat("2.2")
/// ]]>
/// </example>
function toEnglishFloat(val){
var regex_dot = /\./g;
var regex_comma = /\,/g;
var valueToParse = '';
if(typeof val === 'string' || typeof val === 'number')
valueToParse = val.toString();
else if(isElement(val))
valueToParse = val.value;
return = parseFloat(valueToParse.replace(regex_dot,'').replace(regex_comma,'.'));
}

/// <summery>
/// Ermittelt ob es sich bei dem übergebenen Object um eine DOM-Object handelt.
/// </summery>
/// <param name="obj">Object das überprüft werden soll</param>
/// <returns>Boolean-Wert der aussagt, ob es sich um ein DOM-Object handelt</returns>
/// <example>
/// <![CDATA[
/// alert(isElement("test")); //returns false
/// alert(isElement(document.getElementsByTagName("BODY")[0])); //returns true
/// ]]>
/// </example>
function isElement(obj) {
try {
//Using W3 DOM2 (works for FF, Opera and Chrom)
return obj instanceof HTMLElement;
}
catch(e){
//Browsers not supporting W3 DOM2 don't have HTMLElement and
//an exception is thrown and we end up here. Testing some
//properties that all elements have. (works on IE7)
return (typeof obj==="object") &&
(obj.nodeType===1) && (typeof obj.style === "object") &&
(typeof obj.ownerDocument ==="object");
}
}

Verwendungsbeispiel:

wert=(toEnglishFloat(feld1.value)+toEnglishFloat(feld1.value)).toFixed(2)
//oder:
wert=(toEnglishFloat(feld1)+toEnglishFloat(feld1)).toFixed(2)
//oder:
wert=(toEnglishFloat("1")+toEnglishFloat("2.2")).toFixed(2)
24.11.2010
Floyd 14,6k 3 9
Floyd 14,6k 3 9
Floyd du bist einfach spitze! ;)
Felix 24.11.2010
Danke Danke :D
Floyd 24.11.2010
Danke man ;)
Martin Bassus 26.11.2010
Anstelle von (zahl).toFixed() lässt sich auch (zahl).toLocaleString() verwenden was automatisch das zu Browsersprache passende Format ausgibt. Allerdings kann man dann die Anzahl der Nachkommastellen nicht festlegen.
Kambfhase 27.11.2010

Stelle deine Javascript-Frage jetzt!