Therry: Ausgabe ohne KOMMA, aber als EUR formatiert , toLocaleString

ich bins mal wieder 😀😀

Bei der Ausgabe von Zahöen in deutsche Format, benutze ich das.

toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })

Doch leider habe ich ein kleines Porblem, denn wenn der Wert 1000.00 oder 1000 ist wird immer

1.000,00 ausgegeben und ich würde gerne 1000 ohne ,00 haben

Nun habe ich schon versucht den Wert der Ausgabe vorher mit parseInt zu behandeln, aber das brachte leider keinen Erfolg.

Therry

  1. Hallo Therry,

    let a = 12345,67;
    console.log(a.toLocaleString('de-DE', {
                    style: 'currency',
                    currency: 'EUR',
                    maximumFractionDigits:0});
    
    Uncaught RangeError: maximumFractionDigits value is out of range.
    

    *** jede Menge Unsinn gelöscht, siehe meine Antwort an den Raketenkollegen ***

    Rolf

    --
    sumpsi - posui - obstruxi
    1. @@Rolf B

      let a = 12345,67;
      console.log(a.toLocaleString('de-DE', {
                      style: 'currency',
                      currency: 'EUR',
                      maximumFractionDigits:0});
      
      Uncaught RangeError: maximumFractionDigits value is out of range.
      

      Die Doktrin der Bibliotheksautoren ist offenbar: Zum Euro gehören Cents, und die hat man gefälligst nicht zu verheimlichen.

      Nein. Die Doktrin der Bibliotheksautoren ist: maximumFractionDigits darf nicht kleiner sein als minimumFractionDigits, und dessen Defaultwert ist offenbar 2.

      const a = 12345.67;
      console.log(a.toLocaleString('de-DE', {
        style: 'currency',
        currency: 'EUR',
        minimumFractionDigits: 0,
        maximumFractionDigits: 0,
      })); // "12.346 €"
      

      D.h. dein Darstellungswunsch ist nicht "currency"-konform,

      Vorsicht mit solchen Aussagen! Manchmal steckt das Problem nicht hinter dem Bildschirm, sondern davor. 😏

      😷 LLAP

      --
      Wenn der Faschismus wiederkehrt, wird er nicht sagen: „Hallo, ich bin der Faschismus.“ Er wird sagen: „Hört auf zu zählen! Ich habe gewonnen!“
      1. Hallo Gunnar,

        ja, sorry. Ich hab mich ja korrigiert.

        Der Vorteil des OSI Layer 8 ist, dass er gelegentlich zur Selbsterkenntnis fähig ist.

        Rolf

        --
        sumpsi - posui - obstruxi
  2. Tja.

    num=3500;
    console.log(
      num.toLocaleString(
        'de-DE',
        {
           style: 'currency',
           currency: 'EUR',
           maximumFractionDigits:0
         }
      )
    )
    

    wirft leider auch in node.js mit weniger als zwei Stellen (maximumFractionDigits) folgenden Fehler:

    Thrown:
    RangeError: maximumFractionDigits value is out of range.
        at new NumberFormat (native)
        at Number.toLocaleString (native)
    
    1. Hallo Raketenskripter,

      wir sind ja auch blöd.

      a = 12345.67;
      console.log(a.toLocaleString("de-DE", {
                          style: "currency",
                          currency: "EUR",
                          minimumFractionDigits: 0,
                          maximumFractionDigits: 0 } ) );
      

      ta dah

      Invariante minimum <= maximum muss erfüllt werden, und der Default für minimum ist 2.

      Dieses Formatierungsobjekt speichert man sinnvollerweise irgendwo leicht zugänglich ab, damit es nicht für jeden toLocaleString neu auf dem Stack konstruiert werden muss.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Invariante minimum <= maximum muss erfüllt werden, und der Default für minimum ist 2.

        Dann sollte jemand dem Autor der Fehlermeldung "RangeError: maximumFractionDigits value is out of range." bescheinigen, dass diese „nicht hilfreich“ ist.

        1. @@Raketenskripter

          Dann sollte jemand dem Autor der Fehlermeldung "RangeError: maximumFractionDigits value is out of range." bescheinigen, dass diese „nicht hilfreich“ ist.

          Der muss sich aber hinten anstellen. Mir fallen da noch tausend andere Autoren von Fehlermeldungen ein, die nicht hilfreich sind.

          😷 LLAP

          --
          Wenn der Faschismus wiederkehrt, wird er nicht sagen: „Hallo, ich bin der Faschismus.“ Er wird sagen: „Hört auf zu zählen! Ich habe gewonnen!“
      2. @@Rolf B

        Dieses Formatierungsobjekt speichert man sinnvollerweise irgendwo leicht zugänglich ab, damit es nicht für jeden toLocaleString neu auf dem Stack konstruiert werden muss.

        Ich würd gleich den ganzen Kram in eine Methode packen:

        Number.prototype.toEuroString = function () {
        	const fractionDigits = (Math.abs(this) < 1000) ? 2 : 0;
        	return this.toLocaleString('de-DE', {
        		style: 'currency',
        		currency: 'EUR',
        		minimumFractionDigits: fractionDigits,
        		maximumFractionDigits: fractionDigits,
        	});
        };
        
        const smallNumber = 999.99;
        const bigNumber = 1000.99;
        
        console.log(smallNumber.toEuroString()); // "999,99 €"
        console.log(bigNumber.toEuroString());   // "1.001 €"
        

        😷 LLAP

        --
        Wenn der Faschismus wiederkehrt, wird er nicht sagen: „Hallo, ich bin der Faschismus.“ Er wird sagen: „Hört auf zu zählen! Ich habe gewonnen!“
        1. Hallo,

          K.A. wofür das eingesetzt werden soll, aber ich wäre sehr sehr sehr vorsichtig damit, irgendwelche Centbeträge verschwinden zu lassen…

          Gruß
          Kalk

          1. @@Tabellenkalk

            K.A. wofür das eingesetzt werden soll, aber ich wäre sehr sehr sehr vorsichtig damit, irgendwelche Centbeträge verschwinden zu lassen…

            Der Einwand ist völlig berechtigt; wäre aber als Antwort aufs OP besser plaziert.

            😷 LLAP

            --
            Wenn der Faschismus wiederkehrt, wird er nicht sagen: „Hallo, ich bin der Faschismus.“ Er wird sagen: „Hört auf zu zählen! Ich habe gewonnen!“
            1. Hallo,

              Der Einwand ist völlig berechtigt; wäre aber als Antwort aufs OP besser plaziert.

              Nein, nein. Im OP ging es noch nur um „Zahöen“, aber inzwischen ist ja der gesamte Kapitalismus gefährdet...

              😀

              Gruß
              Kalk

        2. Hallo Gunnar,

          ob diese Methode ist, was der OP will, ist völlig unklar. Von einer automatischen Umschaltung zwischen "mit/ohne Cents" je nach Betrag war keine Rede.

          Wenn überhaupt, dann sollte man sie toEuroString nennen und einen booleschen Parameter roundToFullEuro vorsehen.

          Und das schön in {} verpackt um die Format-Objekte aus dem globalen Scope rauszuhalten. IIFEs sind sowas von 2011…

          Dazu das fullEuro Objekt so anlegen, dass es withCents als Prototyp verwendet. Warum die Properties doppelt definieren?

          Die useGrouping Zeile kann man aktivieren, wenn die Tausendertrenner nicht gewünscht sind.

          {
            const withCents = {
                     style: 'currency', 
                     currency: 'EUR',
                  // useGrouping: false,
                  },
                  fullEuro = Object.create(withCents);
          
            fullEuro.minimumFractionDigits = 0;
            fullEuro.maximumFractionDigits = 0;
          
            Number.prototype.toEuroString = function(roundToFullEuro) {
          	  return this.toLocaleString(
                       'de-DE',
                       roundToFullEuro ? fullEuro : withCents
                     );
            };
          }
          
          console.log((12345.67).toEuroString());
          // -> 12.345,67 €
          console.log((12345.67).toEuroString(false));
          // -> 12.345,67 €
          console.log((12345.67).toEuroString(true));
          // -> 12.346 €
          

          Rolf

          --
          sumpsi - posui - obstruxi
          1. @@Rolf B

            Hallo Gunnar,

            ob diese Methode ist, was der OP will, ist völlig unklar. Von einer automatischen Umschaltung zwischen "mit/ohne Cents" je nach Betrag war keine Rede.

            Hm, ich hatte „wenn der Wert 1000.00 oder 1000 ist wird immer 1.000,00 ausgegeben und ich würde gerne 1000 ohne ,00 haben“ so verstanden, dass das Weglassen der Cents ab vierstelligen Eurobeträgen passieren soll. Aber das steht tatsächlich nicht so im OP.

            Vielleicht ist auch gemeint, die Anzeige der Cents genau dann wegzulassen, wenn der Betrag ganzzahlig ist. Dann wäre die Bedingung anders:
            this == Math.round(this)

            😷 LLAP

            --
            Wenn der Faschismus wiederkehrt, wird er nicht sagen: „Hallo, ich bin der Faschismus.“ Er wird sagen: „Hört auf zu zählen! Ich habe gewonnen!“
            1. Hallo Gunnar,

              ¯_(ツ)_/¯ 🤷

              Theeeeeerry

              Wum 🐶

              --
              sumpsi - posui - obstruxi