2014-04-21 17 views
6

So schrieb ich eine kleine Hilfsmethode, um Zahlen in ein gültiges Geldformat ($xx,xxx.xx) mit .toLocaleString() zu konvertieren. Alles funktioniert wie erwartet, wenn Sie es in Chrome verwenden, es scheint jedoch völlig defekt zu sein, wenn Sie Node.js verwenden.Verwenden von .toLocaleString() in Node.js

Beispiel:

var n = 6000 
console.log(n.toLocaleString('USD', { 
    style: 'currency', 
    currency: "USD", 
    minimumFractionDigits : 2, 
    maximumFractionDigits : 2 
})); 

Wenn Sie diese im Browser ausgeführt, druckt er $6,000.00. Wenn Sie dieses Snippet innerhalb von Node.js REPL oder einer Anwendung ausführen, gibt es 6000 als String zurück.

Das ist ein Fehler mit Node.js? Gibt es eine Arbeit, die du hier machen könntest?

+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/17935594/can-i-get-node-to-output-commas-in-number-strings-without-bringing-in-i-18n Sie verweisen a Github-Problem, das darauf hindeutet, dass es sich um einen Fehler/eine Funktion handelt, da sie standardmäßig keine i18n-Unterstützung enthalten möchten. Sie können jedoch eine eigene Knotenversion mit Unterstützung erstellen, wenn es für Sie wichtig ist. – TheShellfishMeme

+0

@TheShellfishMeme Guter Fang! Es ist nicht 100%, aber ich kann es ändern, um für das zu arbeiten, was ich brauche. –

Antwort

13

Basierend auf this issue scheint es, dass der Versand von node.js mit Internationalisierung würde es zu groß machen. Sie können npm install intl und erfordern das, und es wird toLocaleString mit einer Version ersetzen, die funktioniert.

+0

Leider fügt 'intl's' .toLocaleString() ''US' an den Anfang der zurückgegebenen Beträge an. ('US $ 50.000.00') –

+0

@ Dropped.on.Caprica Sie können' .toLocaleString (...). Slice (2) 'loswerden. Oder verwenden Sie eine benutzerdefinierte Funktion. Es hängt davon ab, wie viel andere Verwendung Sie aus 'Intl' herausholen werden. –

+1

Ehrlich gesagt bin ich 90% sicher, dass ich mit etwas Brauch gehen werde.Das Hinzufügen einer Problemumgehung zu einer Problemumgehung ist nicht optimal, und ich bekomme keine andere echte Verwendung von 'intl' als eine feste '.toLocaleString()' Methode. Danke für den Tipp auf "intl". –

3

Nur für den Fall, dass jemand anderes darüber stolpert, habe ich in einer Node.js-Umgebung eine Zahl in eine gültige US-Dollar-Zeichenfolge formatiert.

Number.prototype.toMoney = function() { 
    var integer = this.toString().split('.')[0]; 
    var decimal = this.getDecimal(); 

    integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ","); 

    if(!decimal || !decimal.length) { 
    decimal = "00"; 
    } else if (decimal.length === 1) { 
    decimal += '0'; 
    } else if (decimal.length > 2) { 
    decimal = decimal.substr(0, 2); 
    } 

    return '$' + integer + '.' + decimal; 
}; 

Number.prototype.getDecimal = function() { 
    var n = Math.abs(this); 
    var dec = n - Math.floor(n); 
    dec = (Math.round(dec * 100)/100).toString(); 

    if(dec.split('.').length) { 
    return dec.split('.')[1]; 
    } else return ""; 
}; 

Es gibt ein paar boo-boo hier ist, nämlich die native Number Prototyp erstreckt. Sie möchten vermeiden, dass dies zu 90% der Fall ist; Dies ist spezifischer für meine spezielle Implementierung.

Ich habe offensichtlich die Regex für die Formatierung der Kommas von this question. gestohlen und gehackt zusammen die Dezimalunterstützung von meinem eigenen Willen. Die Laufleistung kann variieren.

0

Also das für jedermann zu aktualisieren, um die gleiche Frage, die sich ...

Wir intl für unsere Lokalisierungslösung, wenn serverseitige Rendering benutzt hatten, aber wir hatten vor kurzem eine Anforderung {timeZoneName: 'short'} unsere .toLocaleString() Optionen und dieses Feld hinzufügen wird nicht unterstützt.

Source Code von intl.js:

case 'timeZoneName': 
    fv = ''; // ###TODO 
    break; 

Zusätzlich gab es eine unterbrechende Änderung in der aktuellen Patch-Version, die uns gezwungen, unsere Version 1.2.4 zu sperren.

Letztendlich haben wir die Verwendung von intl zugunsten full-icu fallengelassen. Einfaches Hinzufügen zu unserem gam.lock löste alle unsere Node.js serverseitigen Datenlokalisierungsprobleme. Ich habe die Lokalisierung der Währung nicht verifiziert, aber bisher so gut. Ich empfehle es zu versuchen.

Verwandte Themen