Enrico: Berechnung schlägt fehl (Problem bei Anpassung der Zahlenwerte?)

Hallo,

ein habe ein elementares Problem bei ganz simplen Berechnungen mittels JavaScript und das ist mir doch "etwas" peinlich.

Ich lese Zahlenwerte aus Textdateien in ein und übergebe sie über php an Auswahllisten, die Summenbildung erfolgt anschliessend über JavaScript bei onchange.

Preis1 wird immer mit einem Punkt als Trennzeichen für Nachkommastellen übergeben und ist auch so in der Datei festgelegt, Beispiel "26.70"
Preis2 liegt in einer Datei als Ganzzahl ohne Nachkommastellen vor, Beispiel "7", und bezeichnen Farbenzuschläge auf Preis1.

Da Preis1 Nachkommastellen beinhaltet, Preis2 hingegen nicht, wandle ich Preis2 zunächst in eine Fließkommazahl um und setze die Anzahl der Nachkommastellen auf zwei:

  
   Preis2 = parseFloat(Preis2);  
   Preis2 = Preis2.toFixed(2);  

Anschliessend ermittle ich die Summe und ersetze den Punkt durch ein Komma:

  
   Preis = Preis1 + Preis2;  
   Preis = Preis.replace(/\./, ",");  

Nun erhalte ich aber als Endergebnis "26,707.00", bei den einzelnen Zahlen Preis1 und Preis2 kann ich aber keinen Fehler entdecken:

Preis1: 26.70
Preis2: 7.00

Ich komme nicht dahinter, wo der Fehler liegt.

Könnt ihr mir hier weiterhelfen?

Vielen Dank im voraus und Gruß,
Enrico

  1. Hallo Enrico,

    der "+"-Operator auf Strings angewendet hängt diese aneinander. Wahrscheinlich erzeugt toFixed einen String. Ersetze mal Preis2.toFixed(2) durch Math.round(Preis2*100)/100 oder Number(Preis2.toFixed(2)).

    Gruß, Jürgen

    1. Hallo Jürgen,

      erst mal danke für Deine rasche Antwort.

      Leider bringen aber beie Varianten keine Lösung.

      Ich habe dann gar keine Nachkommastellen beim Preis2 mehr und der angedachte Betrag in Eur-Höhe wird als Zehntel-Cent angehängt.

      Sicherlich attraktiv, aber nicht so beabsichtigt ;-)

      Gruß,
      Enrico

      1. Hallo Enrico,

        irgendwie verstehe ich jetzt dein Problem nicht mehr.

        Zum Rechnen mit Formularwerten:
        Du musst die Werte (Strings) nach dem Einlesen überprüfen, ob es Zahlen sind, z.B. mit isNaN. Achte auf darauf, dass viele ein Komma als Dezimaltrennzeichen eingeben. Dann musst du den String in eine Zahl umwandeln, z.B. mit parseFloat oder parseInt. Jetzt kannst du mit den Werten rechnen. Vor der Ausgabe kannst du bei Bedarf runden und evtl. auch den "." durch ein "," ersetzen

        Gruß, Jürgen

    2. Hallo,

      Ersetze mal Preis2.toFixed(2) durch Math.round(Preis2*100)/100 oder Number(Preis2.toFixed(2)).

      warum? - Enrico berichtet eingangs, dass Preis2 ein ganzzahliger Wert sei (als String dargestellt). Ein simples parseFloat() oder parseInt() genügt also vollkommen.

      Wer's etwas geheimnisvoller mag, kann auch
      Preis2 = Preis2 - 0;
      oder
      Preis2 = Preis2 * 1;
      notieren (das soll aber keine Empfehlung sein). Beide Operationen erzwingen die Umwandlung in einen Zahlenwert, weil die Operation nur für Zahlen definiert ist.

      Ciao,
       Martin

      --
      Eifersucht ist so alt wie die Menschheit: Als Adam einmal spät heimkam, zählte Eva sofort seine Rippen.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. Hallo Der,

        Ersetze mal Preis2.toFixed(2) durch Math.round(Preis2*100)/100 oder Number(Preis2.toFixed(2)).

        warum? - ...

        ich dachte, Enrico wollte auf zwei Nachkommastellen runden.

        Gruß, Jürgen

  2. Hi,

    Ich lese Zahlenwerte aus Textdateien ...

    nein, du liest Strings aus Textdateien. Und der Unterschied zwischen Strings und Zahlenwerten ist auch dein Problem.

    Da Preis1 Nachkommastellen beinhaltet, Preis2 hingegen nicht, wandle ich Preis2 zunächst in eine Fließkommazahl um und setze die Anzahl der Nachkommastellen auf zwei:

    Preis2 = parseFloat(Preis2);

    Preis2 = Preis2.toFixed(2);

      
    Die toFixed-Methode wandelt den Zahlenwert wieder in einen String, der die ausgeschriebene Repräsentation des ursprünglichen Zahlenwerts enthält, also zum Beispiel "7.00". Preis2 ist also wieder ein String. Und wozu das? Die Anwendung von parseFloat() war völlig okay, um aus der ursprünglich als String vorliegenden Information den Zahlenwert zu gewinnen. Mehr braucht's an der Stelle nicht.  
      
    
    > Anschliessend ermittle ich die Summe  
      
    Nein. ;-)  
      
    
    > `Preis = Preis1 + Preis2;`{:.language-javascript}  
      
    Wie du Preis1 ermittelt hast, zeigst du nicht. Aber vermutlich ist Preis1 ebenso ein String wie Preis2. Das Pluszeichen ist in diesem Fall der Operator für die Stringverkettung.  
      
    
    > und ersetze den Punkt durch ein Komma:  
    > `Preis = Preis.replace(/\./, ",");`{:.language-javascript}  
      
    Warum das?  
      
    
    > Ich komme nicht dahinter, wo der Fehler liegt.  
      
    Achte darauf, dass du beide Zahlen wirklich als Zahl vorliegen hast und nicht als Strings.  
      
    Ciao,  
     Martin  
    
    -- 
    F: Was ist wichtiger: Die Sonne oder der Mond?  
    A: Der Mond. Denn er scheint nachts. Die Sonne dagegen scheint tagsüber, wenn es sowieso hell ist.  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
  3. Preis2 = Preis2.toFixed(2);

    Das Ergebnis ist ein STRING mit den ZEICHEN '2' + '6' + '.' + '7' + '0';
    Ein alert ('2' + '6' + '.' + '7' + '0') wird Dir zeigen, was ich meine.

    var Preis = Preis1 + Preis2;

    Das Ergebnis ist der STRING '26,707.00'.

    Ein alert(Preis) zeigt Dir das.

    Preis = Preis.replace(/./, ",");

    Du ersetzt den ERSTEN Punkt durch ein Komma.

    Nun erhalte ich aber als Endergebnis "26,707.00"

    Ja. Zwingend.

    Mit var Preis = parseFloat(Preis1) + parseFloat(Preis2);
    bekommst Du den Preis, aber das Preis2 = Preis2.toFixed(2); ist dann obsolet und nur Mehrarbeit.

    Du willst also etwas wie:

    <script type="text/javascript">  
    Preis1='26.70';  
    Preis2='7.00';  
    var sPreis = ( parseFloat(Preis1) + parseFloat(Preis2) ).toFixed(2).replace(/\./, ",");  
    alert (sPreis);  
    </script>
    

    Jörg Reinholz

  4. Perfekt, jetzt klappt's :-)

    Vielen lieben Dank euch allen für eure Hilfe :-)

    Gruß,
    Enrico