Cookie: Dezimalstellen erzwingen

Wie kann ich für eine Zahl in einem versteckten Textfeld (beispielsweise 214.2) erzwingen, dass sie in einem innerHTML Bereich immer mit zwei Dezimalen angezeigt wird, in diesem Fall also als 214.20.
Gruß
Cookie

  1. Hallo

    Wie kann ich für eine Zahl in einem versteckten Textfeld (beispielsweise 214.2) erzwingen, dass sie in einem innerHTML Bereich immer mit zwei Dezimalen angezeigt wird, in diesem Fall also als 214.20.

    geht bestimmt einfacher, aber Du kannst den Eintrag in anfang=214 und ende=2 zerlegen und sagen, dass immer wenn (ende==1)||(ende==2)||(ende==3)||...||(ende==9) ist, anfang+", (oder ., je nachdem)"+ende"+"0" geschrieben wird. Bei (ende==0) dann anfang+",00".

    Sollte es besser gehen, habe ich nichts gesagt.

    mfg

  2. Hallo,

    Wie kann ich für eine Zahl in einem versteckten Textfeld (beispielsweise 214.2) erzwingen, dass sie in einem innerHTML Bereich immer mit zwei Dezimalen angezeigt wird, in diesem Fall also als 214.20.

    var x="214.2";
    if(x.length-x.lastIndexOf(".")-1==1)x+="0";

    Und fuer die Faelle ohne Nachkommastelle:
    if(x.length-x.lastIndexOf(".")-1==x.length)x+=".00";

    MfG, Thomas

    1. Hallo,

      Wie kann ich für eine Zahl in einem versteckten Textfeld (beispielsweise 214.2) erzwingen, dass sie in einem innerHTML Bereich immer mit zwei Dezimalen angezeigt wird, in diesem Fall also als 214.20.

      var x="214.2";
      if(x.length-x.lastIndexOf(".")-1==1)x+="0";

      Und fuer die Faelle ohne Nachkommastelle:
      if(x.length-x.lastIndexOf(".")-1==x.length)x+=".00";

      MfG, Thomas

      Danke aber es hilft mir auch nicht wirklich weiter, es kommt nämlcih auch oft genug vor, dass es zu viele Nachkommastellen sind, so 4-9, was mach ich da???
      Gruß
      Cookie

      1. Hallo,

        Danke aber es hilft mir auch nicht wirklich weiter, es kommt nämlcih auch oft genug vor, dass es zu viele Nachkommastellen sind, so 4-9, was mach ich da???

        Vorher runden und dann ggf. die Nullen anfuegen:

        var x=100.123456789;
        x=parseInt(x*100+0.5)/100;
        // --> 100.12

        MfG, Thomas

        1. Hallo Thomas,
          das Verfahren versagt leider bei x=-100.123456789;
          MfG. Lutz T.

          1. Hallo,

            das Verfahren versagt leider bei x=-100.123456789;

            Vorschlag:
            var x=-100.123456789;
            x=parseInt(x*100+Math.abs(x)/x*0.5)/100;
            // --> -100.12

            MfG, Thomas

            1. Hallo,

              das Verfahren versagt leider bei x=-100.123456789;

              Vorschlag:
              var x=-100.123456789;
              x=parseInt(x*100+Math.abs(x)/x*0.5)/100;
              // --> -100.12

              MfG, Thomas

              Ja Thomas,
              nicht schlecht, aber was passiert denn nun bei x=0? Division durch 0 -> NaN. Auch nicht so das wahre ...
              Schau mal in das andere Posting rein, da hab ich zu einem kleinen Wettstreit aufgerufen.
              MfG. Lutz T.

              PS: Sorry für's doppelte Posting, da hatte ich wohl das falsche Fenster erwischt.

              1. Hallo,

                nicht schlecht, aber was passiert denn nun bei x=0? Division durch 0 -> NaN. Auch nicht so das wahre ...
                Schau mal in das andere Posting rein, da hab ich zu einem kleinen Wettstreit aufgerufen.

                var x=-100.123456789;
                x=(x==0)?"0.00":String(parseInt(x*100+Math.abs(x)/x*0.5)/100);
                if(x.length-x.lastIndexOf(".")-1==1)x+="0";
                if(x.length-x.lastIndexOf(".")-1==x.length)x+=".00";

                MfG, Thomas

                1. Hallo,

                  nicht schlecht, aber was passiert denn nun bei x=0? Division durch 0 -> NaN. Auch nicht so das wahre ...
                  Schau mal in das andere Posting rein, da hab ich zu einem kleinen Wettstreit aufgerufen.

                  var x=-100.123456789;
                  x=(x==0)?"0.00":String(parseInt(x*100+Math.abs(x)/x*0.5)/100);
                  if(x.length-x.lastIndexOf(".")-1==1)x+="0";
                  if(x.length-x.lastIndexOf(".")-1==x.length)x+=".00";

                  MfG, Thomas

                  Hallo Thomas,
                  ich muß noch mal stören: Wenn ich jetzt x=0.001; nehme, dann kriege ich als Ergebnis 00.00 raus, was ja eigentlich auch nicht schön ist (
                  ich weiß, ich kann manchmal ganz schön nerven). Außerdem läßt sich bei Dir noch ziemlich viel wegkürzen, wenn man den Code schon klein haben will. Oder wirst Du nach kB bezahlt?
                  MfG. Lutz T.

                  1. Hallo,

                    ich muß noch mal stören: Wenn ich jetzt x=0.001; nehme, dann kriege ich als Ergebnis 00.00 raus, was ja eigentlich auch nicht schön ist (

                    Hier ging es ja um das Runden auf zwei Nachkommastellen, was bei einem Tausendstel nicht so ganz passt. Aber auch das kann man vorher abfragen ...

                    ich weiß, ich kann manchmal ganz schön nerven). Außerdem läßt sich bei Dir noch ziemlich viel wegkürzen, wenn man den Code schon klein haben will. Oder wirst Du nach kB bezahlt?

                    Och je, die drei Zeilen sind mir nicht zu groß. Die Lesbarkeit soll ja auch naechste Woche noch gegeben sein.

                    Du kannst den Code gern noch optimieren.

                    MfG, Thomas

                2. Hallo,

                  nicht schlecht, aber was passiert denn nun bei x=0? Division durch 0 -> NaN. Auch nicht so das wahre ...
                  Schau mal in das andere Posting rein, da hab ich zu einem kleinen Wettstreit aufgerufen.

                  var x=-100.123456789;
                  x=(x==0)?"0.00":String(parseInt(x*100+Math.abs(x)/x*0.5)/100);
                  if(x.length-x.lastIndexOf(".")-1==1)x+="0";
                  if(x.length-x.lastIndexOf(".")-1==x.length)x+=".00";

                  MfG, Thomas

                  Hallo nochmal Thomas,

                  ich hab nochmal über Deinen Code drübergeguckt (hatte leider nicht eher Zeit) und noch einen schwerwiegenderen Fehler gefunden:
                  Eingabe: x=1;
                  Ausgabe: x=10.00;
                  da wäre dann wohl gleiches zu sagen, wie zu
                  http://forum.de.selfhtml.org/?m=111839&t=19887

                  MfG. Lutz T.

                  PS: Mit "wegkürzen" im Parallelposting meinte ich folgendes:

                  if(x.length-x.lastIndexOf(".")-1==x.length)x+=".00";

                  auf beiden Seiten x.length subtrahieren und umstellen:

                  if(x.lastIndexOf(".")==-1)x+=".00";

        2. Hallo,

          Danke aber es hilft mir auch nicht wirklich weiter, es kommt nämlcih auch oft genug vor, dass es zu viele Nachkommastellen sind, so 4-9, was mach ich da???

          Vorher runden und dann ggf. die Nullen anfuegen:

          var x=100.123456789;
          x=parseInt(x*100+0.5)/100;
          // --> 100.12

          MfG, Thomas

          Ja Thomas,
          nicht schlecht, aber was passiert denn nun bei x=0? Division durch 0 -> NaN. Auch nicht so das wahre ...
          Schau mal in das andere Posting rein, da hab ich zu einem kleinen Wettstreit aufgerufen.
          MfG. Lutz T.

  3. Hallo Cookie!

    Wie kann ich für eine Zahl in einem versteckten Textfeld (beispielsweise 214.2) erzwingen, dass sie in einem innerHTML Bereich immer mit zwei Dezimalen angezeigt wird, in diesem Fall also als 214.20.

    Die Stümper, die Javascript entworfen haben solange Nachmittagstalkshows sehen lassen, bis sie das endlich mal einbauen?

    x=2312.12; //Beispielzahl

    n=3;              // Anzahl der Nachkommastellen
    s=Math.pow(10,n); // bei 2 100, bei 3 1000 usw.

    x*=s;             // nach links schieben, alle Nachkommastellen sind jetzt unerwünscht.
    x=Math.round(x);  // Runden
    x=x.toString();   // in String verwandlen
    x=x.substring(0,x.length-n)+","+x.substring(x.length-n,x.length); // Komma an der richtigen Stelle dazwischenfummeln
    document.write(x); // Testausgabe

    Gruss,
     Carsten

    1. Hallo Carsten,
      das Verfahren versagt leider bei x=0.
      MfG. Lutz T.

      1. Hallo Lutz!

        das Verfahren versagt leider bei x=0.

        genaugenommen bei allem kleiner 1.

        für positive Zahlen fehlt nach:
        x=x.toString();     // in String verwandlen
        while(x.length<n+1) // vorne mit Nullen auf Mindestlänge auffüllen
          x="0"+x;

        Die Idee an dem Verfahren ist, dass nur an einer Stelle mit Floats gerechnet wird. Bei anderen Verfahren, die Teile der Zahl getrennt berechnen, kann es einen mit unterschiedlichen Rechenfehlern der Teilberechnungen erwischen.

        Gruss,
         Carsten

        P.S:
        Dein Einzeiler muss:
        zahltext=parseInt(Math.round(x))+"."+String(Math.abs(Math.round(x*100))%100+100).substr(1,2);
                          ^^^^^^^^^^
        heissen, sonst geht das bei Zahlen wie 129.996 schief.

        1. Hallo Lutz!

          das Verfahren versagt leider bei x=0.

          genaugenommen bei allem kleiner 1.

          für positive Zahlen fehlt nach:
          x=x.toString();     // in String verwandlen
          while(x.length<n+1) // vorne mit Nullen auf Mindestlänge auffüllen
            x="0"+x;

          Die Idee an dem Verfahren ist, dass nur an einer Stelle mit Floats gerechnet wird. Bei anderen Verfahren, die Teile der Zahl getrennt berechnen, kann es einen mit unterschiedlichen Rechenfehlern der Teilberechnungen erwischen.

          Gruss,
          Carsten

          P.S:
          Dein Einzeiler muss:
          zahltext=parseInt(Math.round(x))+"."+String(Math.abs(Math.round(x*100))%100+100).substr(1,2);
                            ^^^^^^^^^^
          heissen, sonst geht das bei Zahlen wie 129.996 schief.

          Hallo Carsten,

          peinlich, peinlich ... War wohl noch ein Fehler in meiner Formel ;-(
          Aber so wie es jetzt ist, geht es auch noch nicht, z. B. bei 129.896
          geht das schief, da würde sonst 130.90 rauskommen. Mein nächster Tip:
          zahltext=parseInt(Math.round(x*100)/100)+"."+String(Math.abs(Math.round(x*100))%100+100).substr(1,2);
          Wie wäre es mit einem kleinen Wettstreit: Wer den kürzesten (Anzahl der Zeichen), fehlerfreien Code hinbekommt?

          MfG. Lutz T.

          1. Hallo Lutz!

            Wie wäre es mit einem kleinen Wettstreit: Wer den kürzesten (Anzahl der Zeichen), fehlerfreien Code hinbekommt?

            :-) das Runden hat mich schon vor langer Zeit ziemlich beschäftigt.

            Die damalige Lösung (ab IE3 und NN3) findest du hier:

            http://pc-anfaenger.de/script/jsrund1.htm

            Die moderne Lösung (ab NN 6, IE 5.5 und nicht in Opera) lautet:

            function runden(zahl,stellen)
            {
             return Number(zahl.toString().replace(",",".")).toFixed(stellen)
            }

            Beispielaufrufe:

            runden('0.008',2)
            runden(0,2)
            runden('21345,45',-3)
            runden(21.34545,2)

            Viele Grüße

            Antje

            1. Hallo Lutz!

              Wie wäre es mit einem kleinen Wettstreit: Wer den kürzesten (Anzahl der Zeichen), fehlerfreien Code hinbekommt?

              :-) das Runden hat mich schon vor langer Zeit ziemlich beschäftigt.

              Die damalige Lösung (ab IE3 und NN3) findest du hier:

              http://pc-anfaenger.de/script/jsrund1.htm

              Die moderne Lösung (ab NN 6, IE 5.5 und nicht in Opera) lautet:

              function runden(zahl,stellen)
              {
              return Number(zahl.toString().replace(",",".")).toFixed(stellen)
              }

              Beispielaufrufe:

              runden('0.008',2)
              runden(0,2)
              runden('21345,45',-3)
              runden(21.34545,2)

              Viele Grüße

              Antje

              Hallo Antje,

              da hast Du Dir echt viel Mühe gegeben, deshalb habe ich mir auch besonders viel Mühe gegeben ein Beispiel zu finden, wo Deine Rundungsfunktion nicht funktioniert. Probier mal
              runden('10000.000008',-6)
              Den Bug wirst Du sicherlich selbst schnell herausmachen können,
              kleiner Tip, hier muß etwas geändert werden:

              if (zahl.length-zahl.indexOf(".")>Math.abs(wert)+1)
                zahl=zahl.substring(0,zahl.indexOf(".")+Math.abs(wert)+1);

              MfG. Lutz T.

              PS: Auch wenn der Fehler raus ist, hast Du im Wettstreit um den kürzesten Code, wie Du sicherlich einsehen wirst, mit Deiner Funktion keine Chance ;-)

              1. Hallo Lutz

                PS: Auch wenn der Fehler raus ist, hast Du im Wettstreit um den kürzesten Code, wie Du sicherlich einsehen wirst, mit Deiner Funktion keine Chance ;-)

                :-) aber mit meiner modernen Variante

                deine Bedingung:

                Zur Zulassung zum Wettbewerb "kürzeste Lösung für Nachkommastellenproblematik in JS" müssen folgende Kriterien erfüllt sein: Script muß gleichermaßen bei Eingabe als Zahl/String funktionieren und Ergebnis muß gerundet sein, d.h. nicht nur die überzähligen Stellen abschneiden. Ich hoffe auf einen weiteren Vorschlag.

                tja und das erfüllt diese Zeile:

                Number(zahl).toFixed(stellen)

                es war ja keine Rede davon, dass es überall funktionieren muss ;-)

                Viele Grüße

                Antje

  4. Wie kann ich für eine Zahl in einem versteckten Textfeld (beispielsweise 214.2) erzwingen, dass sie in einem innerHTML Bereich immer mit zwei Dezimalen angezeigt wird, in diesem Fall also als 214.20.
    Gruß
    Cookie

    Hallo Cookie,
    ich wußte doch, daß ich dazu schon mal was geschrieben hatte, hier der Link:
    http://forum.de.selfhtml.org/archiv/2002/2/4962/#m27814
    MfG. Lutz T.

  5. Wie kann ich für eine Zahl in einem versteckten Textfeld (beispielsweise 214.2) erzwingen, dass sie in einem innerHTML Bereich immer mit zwei Dezimalen angezeigt wird, in diesem Fall also als 214.20.

    Die banale Variante:
    1. Rundet nicht (das kann ja verzichtbar sein, wenn es nicht muss)
    2. Geht von einem Punkt als Dezimaltrennzeichen aus.
    3. "eingabe" muss ein String sein (ggf. dorthin wandeln).

    ausgabe = eingabe.concat("00").substr(0,eingabe.lastIndexOf(".")+3);

    Hinten "genügend" Nullen dranhängen, falls Stellen fehlen, und dann einfach die überzähligen Stellen abschneiden. :)

    PS: Beantrage Zulassung zum Wettbewerb "kürzeste Lösung für Nachkommastellenproblematik in JS". ;)

    - Sven Rautenberg

    1. Wie kann ich für eine Zahl in einem versteckten Textfeld (beispielsweise 214.2) erzwingen, dass sie in einem innerHTML Bereich immer mit zwei Dezimalen angezeigt wird, in diesem Fall also als 214.20.

      Die banale Variante:

      1. Rundet nicht (das kann ja verzichtbar sein, wenn es nicht muss)
      2. Geht von einem Punkt als Dezimaltrennzeichen aus.
      3. "eingabe" muss ein String sein (ggf. dorthin wandeln).

      ausgabe = eingabe.concat("00").substr(0,eingabe.lastIndexOf(".")+3);

      Hinten "genügend" Nullen dranhängen, falls Stellen fehlen, und dann einfach die überzähligen Stellen abschneiden. :)

      PS: Beantrage Zulassung zum Wettbewerb "kürzeste Lösung für Nachkommastellenproblematik in JS". ;)

      • Sven Rautenberg

      Hallo Sven,
      es muß schon sehr spät gewesen sein. Mal ein kleiner Test:
      eingabe="1" -> ausgabe=10. Das Script solltest Du möglichst nicht an ein Geldinstitut weitergeben.
      MfG. Lutz T.

      PS: Zur Zulassung zum Wettbewerb "kürzeste Lösung für Nachkommastellenproblematik in JS" müssen folgende Kriterien erfüllt sein: Script muß gleichermaßen bei Eingabe als Zahl/String funktionieren und Ergebnis muß gerundet sein, d.h. nicht nur die überzähligen Stellen abschneiden. Ich hoffe auf einen weiteren Vorschlag.

      1. Hallo Sven,

        Aloha!

        es muß schon sehr spät gewesen sein. Mal ein kleiner Test:

        Die Uhrzeit des Postings entspricht genau meiner lokalen Uhrzeit. :)

        eingabe="1" -> ausgabe=10. Das Script solltest Du möglichst nicht an ein Geldinstitut weitergeben.

        Doch, und zwar an meines! :)

        PS: Zur Zulassung zum Wettbewerb "kürzeste Lösung für Nachkommastellenproblematik in JS" müssen folgende Kriterien erfüllt sein: Script muß gleichermaßen bei Eingabe als Zahl/String funktionieren und Ergebnis muß gerundet sein, d.h. nicht nur die überzähligen Stellen abschneiden. Ich hoffe auf einen weiteren Vorschlag.

        Ok, mal sehen, was ist dann noch tun kann:

        ausgabe = String(parseInt(Math.round(eingabe * 100)));
        ausgabe = (ausgabe=="0"?"0.00":ausgabe.substring(0,ausgabe.length-2)+"."+ausgabe.substring(ausgabe.length-2,ausgabe.length));

        Funktioniert mit allen Zahlenwerten, egal ob positiv oder negativ, hat keine Rundungsfehler beim Zurück-Teilen, immer zwei Nachkommastellen, kann mit Strings, Integern, Floats und Null umgehen und liefert einen schönen String zurück. Kürzer würde nur gehen, indem man auf das Zwischenspeichern der Zwischenergebnisses verzichtet - man berechnet dann aber ziemlich viel unnütz doppelt und dreifach.

        - Sven Rautenberg

        1. Aloha again!

          ausgabe = String(parseInt(Math.round(eingabe * 100)));
          ausgabe = (ausgabe=="0"?"0.00":ausgabe.substring(0,ausgabe.length-2)+"."+ausgabe.substring(ausgabe.length-2,ausgabe.length));

          Wo ich Antjes tolle Rundungsfunktion gesehen habe, will ich sowas natürlich auch haben, aber eben kürzer. Also hier die Variante für "Runden mit Vorkommastellen". :)

          ausgabe = String(parseInt(Math.round("156" / 100)));
          ausgabe = (ausgabe=="0"?"0":ausgabe+"00");

          Das kann man insgesamt natürlich in eine Funktion gießen, bei der Fallunterscheidung gemacht wird (Runden auf Vorkommastellen/Nachkommastellen) und die Rundungsposition gleich mit angegeben werden kann, aber der Nachteil von allgemeinen Funktionen ist, dass sie viel allgemeines Zeugs mitschleppen müssen, welches für die konkrete Anwendung gar nicht benötigt wird. Spezialfallanpassungen lohnen sich also, weil sie die Funktion übersichtlicher machen und Ladezeit sparen. Außerdem sind kürzere Funktionen natürlich schneller abgearbeitet. :)

          - Sven Rautenberg

          1. Aloha again!

            ausgabe = String(parseInt(Math.round(eingabe * 100)));
            ausgabe = (ausgabe=="0"?"0.00":ausgabe.substring(0,ausgabe.length-2)+"."+ausgabe.substring(ausgabe.length-2,ausgabe.length));

            Wo ich Antjes tolle Rundungsfunktion gesehen habe, will ich sowas natürlich auch haben, aber eben kürzer. Also hier die Variante für "Runden mit Vorkommastellen". :)

            ausgabe = String(parseInt(Math.round("156" / 100)));
            ausgabe = (ausgabe=="0"?"0":ausgabe+"00");

            Das kann man insgesamt natürlich in eine Funktion gießen, bei der Fallunterscheidung gemacht wird (Runden auf Vorkommastellen/Nachkommastellen) und die Rundungsposition gleich mit angegeben werden kann, aber der Nachteil von allgemeinen Funktionen ist, dass sie viel allgemeines Zeugs mitschleppen müssen, welches für die konkrete Anwendung gar nicht benötigt wird. Spezialfallanpassungen lohnen sich also, weil sie die Funktion übersichtlicher machen und Ladezeit sparen. Außerdem sind kürzere Funktionen natürlich schneller abgearbeitet. :)

            • Sven Rautenberg

            Hallo Sven,
            wieder was tolles fürs Geldinstitut:
            eingabe:0.01
            ausgabe:.1
            Mein Vorschlag: Wir sollten das so machen, wie bei Prüfungen im Studium. Wer nach dem dritten mal nicht bestanden hat, wird geXt (das wäre hier der Ausschluß vom Wettbewerb). Also einen Versuch würde ich Dir noch geben ;-)
            MfG. Lutz T.

            PS: Der Spruch

            Funktioniert mit allen Zahlenwerten, egal ob positiv oder negativ, hat keine Rundungsfehler beim Zurück-Teilen, immer zwei Nachkommastellen, kann mit Strings, Integern, Floats und Null umgehen und liefert einen schönen String zurück.

            ist echt super. Das hätte ein Werbefachmann einer großen amerikanischen Softwarefirma (deren Name hier nicht genannt werden soll) nicht besser hinkriegen können.

            1. Aloha!

              Mein Vorschlag: Wir sollten das so machen, wie bei Prüfungen im Studium. Wer nach dem dritten mal nicht bestanden hat, wird geXt (das wäre hier der Ausschluß vom Wettbewerb). Also einen Versuch würde ich Dir noch geben ;-)

              Ach nö, lieber singe ich den "Rundungs-Blues", als nochmal gewisse unbedeutende Zahlenbereiche in der Rundungsfunktion "ungenügend zu behandeln". ;)

              - Sven Rautenberg

        2. Hallo Sven!

          Funktioniert mit allen Zahlenwerten, egal ob positiv oder negativ,

          ausser 0.005 <= |x| < 0.1

          und für -1 < x <= 0.1
          ist die Darstellung in oft nicht akzeptablen -.37 Form.

          hat keine Rundungsfehler beim Zurück-Teilen ...

          Die befürchte ich zwar irgendwann, habe sie bislang aber noch nicht provozieren können.

          Gruss,
           Carsten