Intl.NumberFormat entweder 0 oder zwei Bruchstellen

Lesezeit: 4 Minuten

Mein Formatierer sieht so aus

const formatter = new Intl.NumberFormat('en-NZ', {
  style: 'currency',
  currency: 'NZD',
  minimumFractionDigits: 2,
});

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.

const fraction = new Intl.NumberFormat('en-NZ', {
  style: 'currency',
  currency: 'NZD',
  minimumFractionDigits: 0,
  maximumFractionDigits: 0,
});

const formatter = new Intl.NumberFormat('en-NZ', {
  style: 'currency',
  currency: 'NZD',
  minimumFractionDigits: 2,
});

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));

  • Bei der Verwendung von Intl.NumberFormat ist die Verwendung minimaler und maximaler Bruchstellen die richtige Vorgehensweise

    – Syntax

    14. Juli 2020 um 0:40

  • Es gibt keine Option maximumFractionDigits was existiert.

    – Ari Seyhun

    13. August 2020 um 8:00 Uhr

  • @Acidic9 schau mal hier Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

    – crtag

    14. August 2020 um 5:51

  • @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

Benutzeravatar von kshetline
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:

formatter.format(amount).replace(/\D00(?=\D*$)/, '');

  • 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 BLANCOs Benutzeravatar
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)

https://github.com/ember-intl/ember-intl/issues/167

Heutzutage scheint es am einfachsten zu sein, „minimumFractionDigits“ einfach auf 0 und „maximumFractionDigits“ auf 2 zu setzen, wie folgt:

const formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'usd',
  maximumFractionDigits: 2,
  minimumFractionDigits: 0,
}); 

console.log('No decimals: ', formatter.format(1000));
console.log('Decimals: ', formatter.format(999.99));

1452210cookie-checkIntl.NumberFormat entweder 0 oder zwei Bruchstellen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy