• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Tausendertrennzeichen funktioniert bei negativen Zahlen nicht

marcot

New member
Hi,

ich habe eine Funktion die Zahlen mit Tausendertrennzeichen und bei Bedarf mit der gewünschten Anzahl an Dezimalstellen versieht:

Code:
function formatNumber(strZahl, intDezStellen){
  // Variablen vorbelegen
  strDelimiter = (typeof(strDelimiter)=="undefined") ? "." : strDelimiter;
  intDezStellen = (typeof(intDezStellen)=="undefined") ? 2 : intDezStellen;

  // Tausendertrennzeichen eventuell maskieren
  var strDelimiterMask = (strDelimiter.match(/(\.|\+|\*|\?|\^|\(|\)|\$)/))?"\\"+strDelimiter:strDelimiter;

  // Falls ein Komma oder Punkt am Ende existiert
  if(strZahl.match(/^(.*)(,|\.)(\d+)$/)){
    // Durch Punkt ersetzen
    strZahl = strZahl.replace(/^(.*)(,|\.)(\d+)$/, RegExp.$1+"."+RegExp.$3);
  }

  // Zahl in Dezimal- und Ganzzahlanteil splitten
  var strFirst = strZahl.substring(0, strZahl.length-RegExp.$3.length-1);
  var strSecond = strZahl.substring(strZahl.length-RegExp.$3.length-1, strZahl.length);

  // Suchmaske für Tausendertrennzeichen
  strPattern = eval("/(,|"+strDelimiterMask+")/");
  // Solange im Ganzzahlanteil Punkte oder Kommata gefunden werden
  while(strFirst.match(strPattern)){
    // Punkte entfernen
    strFirst = strFirst.replace(strPattern, "");
  }

  // Ganz- und Dezimalanteil wieder zusammenführen
  strZahl = strFirst + strSecond;


  // Mögliche Dezimalstellen auf 2 Stellen runden und Dez-Punkt durch Komma ersetzen
  strZahl = String(Number(strZahl).toFixed(intDezStellen)).replace(/\./,",");

  // Solange noch mindestens vier Ziffern am Anfang gefunden werden
  while(strZahl.match(/^(\d+)(\d{3}\b)/)){
    // Tausendertrennzeichen einfügen
    strZahl = strZahl.replace(/^(\d+)(\d{3}\b)/, RegExp.$1 + strDelimiter + RegExp.$2);
  }

  return(strZahl);
}

Das ganze funktioniert bei positiven Zahlen. Bei negativen Zahlen wird jedoch kein Tausendertrennzeichen eingefügt...kann mir jemand helfen?
 
Hi,
ich bin der Meinung, Du machst Dir das viel zu kompliziert. Zunächst sehe ich zwei Probleme:
1. strDelimiter wird nicht als Parameter entgegen genommen, sodass immer Punkt der Delimiter ist.
2. Es spielt bei Dir keine Rolle, ob Punkt oder Komma am Ende steht, es wird in einen Punkt gewandelt - dem Delimiter.

Das Maskieren etc. führt meiner Meinung nach zu viel zu hohem Aufwand.

Wie wär's damit?
1. Entfernen aller Tausender-Trennzeichen
2. Trennen zwischen Ganzzahl und Nachkommaanteil (z.B. mit split)
3. Ganzzahl mit Tausender-Trennzeichen ausstatten
4. Nachkommaanteil auf die Anzahl der gewünschten zeichen runden
5. Ganzzahl+','+Nachkomma returnieren

Was das Minus-Zeichen angeht, so könntest Du Dir zu Beginn merken ob es existiert und zunächst entfernen. Die Rückgabe erfolgt entsprechend mit oder ohne Minuszeichen.
 
Die letzte RegExp verursacht dein Problem:
Code:
while(strZahl.match(/^(\d+)(\d{3}\b)/)){
das ^(\d+) passt ja nicht auf einen String, der ein "-" am Anfang hat.

PS: Dein Code funktioniert nicht, wenn die Zahl zu groß wird. Aber die Zahl muss dafür wirklich groß sein. (>=1e21)
PPS: An ein paar Stellen ist dein Code suboptimal. So ist das eval unnötig (es gibt den RegExp-Konstruktor) und die erste while-Schleife kann man durch eine globale Ersetzung vermeiden. (Die letzte Schleife auch, aber da ist dann die RegExp etwas komplizierter.
 
ok. danke.

Hat jemand eine funktionierende Funktion bzw. einen Tipp zu einer solchen Funktion die eine Zahl (negativ oder positiv) in eine Zahl mit Tausendertrennzeichen und Komma als Dezimaltrennzeichen umwandelt? Dabei soll bei Eingabe des Zahlenwertes das Komma als Dezimaltrennzeichen beachtet werden.

Vielen Dank im Voraus.
 
Die letzte RegExp verursacht dein Problem:
Code:
while(strZahl.match(/^(\d+)(\d{3}\b)/)){
das ^(\d+) passt ja nicht auf einen String, der ein "-" am Anfang hat.


was genau muss ich tun damit es funktioniert? steh auf dem schlauch...


sofern zahlen mit komma eingegeben werden beachtet er die werte hinter dem komma nicht ist mir gerade aufgefallen???
 
Wie wär's damit?
1. Entfernen aller Tausender-Trennzeichen
2. Trennen zwischen Ganzzahl und Nachkommaanteil (z.B. mit split)
3. Ganzzahl mit Tausender-Trennzeichen ausstatten
4. Nachkommaanteil auf die Anzahl der gewünschten zeichen runden
5. Ganzzahl+','+Nachkomma returnieren

Was das Minus-Zeichen angeht, so könntest Du Dir zu Beginn merken ob es existiert und zunächst entfernen. Die Rückgabe erfolgt entsprechend mit oder ohne Minuszeichen.
Dies halte ich für eine gute Herangehensweise.

Und zu deiner Frage: Prüfe auf Vorzeichen, mekre es dir und füge es am Ende wieder ein
 
Hat jemand eine funktionierende Funktion bzw. einen Tipp zu einer solchen Funktion die eine Zahl (negativ oder positiv) in eine Zahl mit Tausendertrennzeichen und Komma als Dezimaltrennzeichen umwandelt? Dabei soll bei Eingabe des Zahlenwertes das Komma als Dezimaltrennzeichen beachtet werden.

Mach doch einfach mit str_replace:
Suche nach dem alten dezimaltrennzeichen und ersetze es durch das neue (,)
Suche nach dem alten Tausendertrennzeichen und ersetze es durch das neue.
Das Vorzeichen wird bei beiden ignoriert, sofern weder das dezim.trennzeichen noch das tausendertzrennzeichen = das vorzeichenkennzeichen ist.

Oder meinst du etwas ganz anderes?
 
Ich würde das Problem ja in zwei Teile unterteilen: zuerst die Eingabe als Zahl interpretieren und dann diese Zahl formatieren.

Für erstes bietet sich parseFloat() an (nachdem man alle störenden Tausendertrennzeichen entfernt hat und das Komma durch einen Punkt ersetzt hast).
Zweites kann man dann recht gut mit toFixed() lösen und ein paar STRING.replace()s.

Code:
<!DOCTYPE html>

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Fenstertitel</title>
</head>
<body>
<input id="input">
<input id="separator" value=".">
<output id="output">
<script type="text/javascript">
(function(){
	var input = document.getElementById("input");
	var separator = document.getElementById("separator");
	var output= document.getElementById("output");
	function updateOutput(){
		// stufe 1 - ev. etwas zu lax
		var number = parseFloat(input.value.replace(/[^\d,\-]/g, "").replace(",", "."));
		
		//stufe 2
		output.value = number.toFixed(2).replace(".", ",").replace(/(\d)(?=(?:\d{3})+(?:$|,))/g, "$1" + separator.value)
	}
	[input, separator].forEach(function(el){
		el.addEventListener("input", updateOutput, false);
	});
}())

</script>
</body>
</html>
 
Zurück
Oben