Wie kann ich das so anpassen, dass ganze Zahlen 0 Bruchstellen haben?
formatter.format(4); // want output "$4"
während Brüche immer zweistellig sind?
formatter.format(4.1); // want output "$4.10"
Der richtige Weg, dies bei Verwendung von Intl.NumberFormat zu tun, besteht darin, beides festzulegen MaximumFractionDigits Und MinimumFractionDigits Optionen im Konstruktor beim Validieren des Eingabewerts mit einem Modulo % für eine ganze Zahl (gemäß https://stackoverflow.com/a/49724586/1362535). Das ist eine RICHTIGE Antwort!). Die akzeptierte Antwort ist eine Art String-Manipulation.
@Acidic9 hast du versucht, nur zu verwenden? maximumFractionDigits? Ich habe festgestellt, dass es einen Fehler gibt, wenn Sie nicht beides verwenden.
– Jeff Bluemel
26. August 2020 um 2:49
Dies gilt nicht für den Fall, dass die Formatierung zu einer Ganzzahl führt. 1234,999 würde 1235,00 ergeben
– Olefrank
11. November 2022 um 8:57 Uhr
kshetline
Sie könnten so etwas versuchen:
formatter.format(amount).replace(/\D00$/, '');
Aktualisieren:
Als Antwort auf den viele Monate später erschienenen Kommentar von @Marek: Der obige reguläre Ausdruck verarbeitet bereits unterschiedliche Dezimalzeichen (entweder . oder ,), aber es stimmt, dass nachfolgende Währungssymbole nicht verarbeitet werden. Das lässt sich so beheben:
Die vorgeschlagene Lösung funktioniert in einigen Regionen nicht, in denen der Formatierer den Währungscode/das Währungssymbol anhängt, anstatt ihn voranzustellen. Zum Beispiel sk Gebietsschema und EUR Währung produzieren 12,50 €. Außerdem müssen Sie verschiedene Bruchtrennzeichen (Komma, Punkt) berücksichtigen. In diesem Fall könnten Sie verwenden formatToParts anstatt der format Methode, die ein Array erzeugt, in dem jedes Fragment eindeutig identifiziert wird. Dann müssen Sie nur noch die bedingt herausfiltern fraction Und decimal Fragmente.
– Marek Suscak
21. Januar 2019 um 12:06 Uhr
Nur eine Frage: Warum benötigen Sie für das Gebietsschema „en-us“ einen regulären Ausdruck? Ist es nicht .replace('.00', '') einfach genug?
– ViBoNaCci
16. April 2020 um 11:12 Uhr
@ViBoNaCci, ja, wenn Ihnen der Umgang mit anderen Gebietsschemas egal wäre, könnten Sie auf den regulären Ausdruck verzichten. Der reguläre Ausdruck soll entweder einen Punkt oder ein Komma als Dezimalzeichen verarbeiten.
– kshetline
16. April 2020 um 14:20 Uhr
@ViBoNaCci ist auch beim direkten Ersetzen vorsichtig, da es an einer beliebigen Stelle in der Zahl ersetzt wird, nicht nur am Ende.
– Jordan Morris
19. Mai 2020 um 10:45 Uhr
@JordanMorris Stimmt. Aber in „en-us“ ist der Punkt ein Dezimaltrennzeichen, sodass das Ersetzen wasserdicht sein sollte, da es nur für „en-us“ gilt.
– ViBoNaCci
5. März 2021 um 12:40 Uhr
Gerardo BLANCO
Ich würde zwei verschiedene Formate implementieren und es mithilfe eines Modulo validieren %
4 % 1 == 0
4.1 % 1 == .1
Hoffe das hilft 🙂
const formatter = new Intl.NumberFormat('en-NZ', {
style: 'currency',
currency: 'NZD',
minimumFractionDigits: 2,
});
const fraction = new Intl.NumberFormat('en-NZ', {
style: 'currency',
currency: 'NZD',
minimumFractionDigits: 0,
});
let number = 4.1;
if(number % 1 == 0)
console.log(fraction.format(number));
else
console.log(formatter.format(number));
number = 4;
if(number % 1 == 0)
console.log(fraction.format(number));
else
console.log(formatter.format(number));
Scheint die sicherste Option zu sein
– H77
9. April 2018 um 2:21
Dieses Beispiel erreicht nicht das Ziel des Fragestellers: „entweder 0 oder zwei Nachkommastellen“
– Michael R
9. April 2019 um 1:46
Ja, Sie können es ausprobieren und bearbeiten number auf dem Snippet, um die Funktionalität zu sehen
– Gerardo BLANCO
10. April 2019 um 12:40 Uhr
Als ich das recherchierte, fand ich auf Github einen Beitrag dazu, der die Verwendung sowohl der MaximumFractionDigits als auch der MinimumFractionDigits vorschlägt. Im Artikel heißt es, dass es zu einem Fehler kommen würde, wenn beide nicht verwendet würden.
// works
var Intl = require('intl');
new Intl.NumberFormat("en", {
maximumFractionDigits: 0,
minimumFractionDigits: 0,
style: 'currency',
currency: 'USD'
}).format(4000.33)