Sven Richter: Zahlenformatierung

Hi Selfhtmler,

ich vermisse in Java eine Funktion number_format(), die genauso funktioniert, wie die gleichnamige Funktion in php, die mir also meine Zahl für Betrachter lesbarer darstellt, oder auch eine gewisse Anzahl von Nachkommastellen erzwingt.
Ich habe in Selfhtml (Forum + Archive) und im Internet keine bzw. nicht so prickelnde Lösungen gefunden.
Warum soll jeder das Rad neu erfinden, also hab ich ein Funktion geschrieben, die die Allgemeinheit nutzen können soll.
Die Funktion ist soweit fehlerfrei, wer dennoch Fehler in der Funktion findet, die ich aus irgendeinem Grund nicht beachtet habe, kann dies ja hier posten.

number_format(zahl,decimal_num,dec_point,mill_sep)

Die Funktion selbst liefert einen String zurück.
Übergabewerte sind:
zahl : die zu formatierende Zahl
decimal_num: Anzahl der Nachkommastellen (int)
dec_point: Teiler zwischen Zahl und Nachkommastelle (string)
mill_sep: Teiler zur Tausendergruppierung (string)

Beispiele:
number_format(-123456.789,2,',','.') liefert -123.456,78
number_format(123456.789,2,'.',' ') liefert 123 456.78
number_format(123456.789,2,'.','') liefert 123456.78

  
function number_format (zahl,decimal_num,dec_point,mill_sep) {  
  var sign = '';  
  if(zahl < 0) {sign = '-';}  
  zahl = Math.abs(zahl);  
  var divisor = 1;  
  for(var i = 0; i < decimal_num; i++) {zahl *= 10; divisor *= 10;}  
  zahl = Math.floor(zahl);  
  var decimals= zahl % divisor;  
  decimals = '' + decimals;  
  for(var i = 0; i < decimal_num; i++) {zahl /= 10;}  
  zahl = Math.floor(zahl);  
  zahl = '' + zahl;  
  zahl_grp = '';  
  while(zahl.length > 3) {  
    zahl_grp = mill_sep + zahl.substr(zahl.length-3,3) + zahl_grp;  
    zahl = zahl.substr(0,zahl.length-3);  
  }  
  var str = zahl + zahl_grp;  
  if(decimal_num > 0) {  
    str = str + dec_point;  
    while(decimals.length != decimal_num) {decimals= decimals+ '0';}  
    str = str + decimals  
  }  
  return sign + str;  
}  

  1. Hallo Sven Richter,

    ich vermisse in Java eine Funktion number_format(),

    Ja?, Ich nicht: DecimalFormat.

    Ich habe in Selfhtml (Forum + Archive) und im Internet keine bzw. nicht so prickelnde Lösungen gefunden.

    Nein? toFixed() schein einen Großteil Deiner Arbeit bereits zu machen. Mit replace() könnte man dem dezimalen Trenner zu leibe rücken. Voraussetzung hierbei ist, das man die Zahl in einen String gewandelt hat. Lediglich für die tausender Trennung fällt mir im Momentn - bis auf eine Schleife - nichts ein, da splice afaik  nicht auf einen String anwendbar ist.

    Mit freundlichem Gruß
    Micha

    --
    LeagueEditor JavaScript kostenlose Ligaverwaltung || richtig Messen will gelernt sein
  2. ich vermisse in Java eine Funktion number_format(), die genauso funktioniert, wie die gleichnamige Funktion in php, die mir also meine Zahl für Betrachter lesbarer darstellt, oder auch eine gewisse Anzahl von Nachkommastellen erzwingt.

    Ich denke mal in Java gibt es sowas, aber in Javascript nur bedingt.

    Ich habe in Selfhtml (Forum + Archive) und im Internet keine bzw. nicht so prickelnde Lösungen gefunden.
    Warum soll jeder das Rad neu erfinden, also hab ich ein Funktion geschrieben, die die Allgemeinheit nutzen können soll.

    Ich kenne ne Menge Lösungen.
    eine Variante von mir: http://javascript.jstruebig.de/javascript/37/
    allerdings erfüllt das nicht deine Vorgaben

    number_format(zahl,decimal_num,dec_point,mill_sep)

    Was mich an der Funktion stört, dass du keine Defaultwerte für das Komma und den Separator benutzt, da i.d.R. immer die gleichen verwendet werden.

    Beispiele:
    number_format(-123456.789,2,',','.') liefert -123.456,78
    number_format(123456.789,2,'.',' ') liefert 123 456.78
    number_format(123456.789,2,'.','') liefert 123456.78

    Du rundest nicht auf?

    Mein Vorschlag:

      
    Number.prototype.format = function(komma, kommazeichen, tausender)  
    {  
        if(!kommazeichen) kommazeichen  = ".";  
        if(typeof tausender == 'undefined') tausender = ",";  
      
        if(!komma) komma = 0;  
      
        var sign = (this < 0) ? "-" : "";  
        var nullen = Math.pow(10, komma);  
        var nummer = Math.round((Math.abs(this) * nullen)  )/ nullen;  
        var k = nummer.toString().indexOf(".");  
      
        if(k == -1) k = nummer.toString().length;  
      
        var nach =  nummer.toString().substring(k + 1);  
        var vor = nummer.toString().substring(0, k);  
        var i = vor.length;  
        var tmp = 0;  
        var vor_neu = ""  
        do {  
            vor_neu = vor.charAt(i) + vor_neu;  
            // Tausendertrennzeichen  
            if(tmp == 3 && i > -1)  
            {  
                vor_neu = tausender + vor_neu;  
                tmp = 0;  
            }  
            tmp++;  
        } while(i--)  
        nullen = nullen.toString().substring(1);  
        nach = (nach + nullen).substring(0, komma);  
        if(nach != "") vor_neu = vor_neu + kommazeichen + nach;  
        return sign + vor_neu;  
    };  
    
    

    Struppi.

    --
    Javascript ist toll (Perl auch!)