Martin: JS rechnet nicht sondern reiht aneinander

hallo,
ich hab folgende zeile:
 d=eval(d+document.f.elements[z].value);

wenn jetzt z.b. d=2 und document.f.elements[3].value=4 ist dann wird nicht "6" sondern "24" ausgegeben.was mache ich falsch?

martin

  1. Hallo,

    d=eval(d+document.f.elements[z].value);

    wenn jetzt z.b. d=2 und document.f.elements[3].value=4 ist dann wird nicht "6" sondern "24" ausgegeben.was mache ich falsch?

    an eval sollte es nicht liegen, also ist value wohl ein string.
    Versuch mal:

    d+=document.f.elements[z].value*1;

    Grüsse

    Cyx23

    1. hi Cyx23,

      danke für deinen tipp hat funktioniert

      Martin

  2. Hallo,

    d=eval(d+document.f.elements[z].value);

    wenn jetzt z.b. d=2 und document.f.elements[3].value=4 ist dann wird nicht "6" sondern "24" ausgegeben.was mache ich falsch?

    Es werden Zeichenketten addiert, da Formularfelder nicht 4 sondern "4" enthalten!

    Wenn d bereits ein numerischer Wert ist sollte
      d+=parseInt(document.f.elements[3].value,10);
    reichen.

    MfG, Thomas

    1. Hallo,

      d=eval(d+document.f.elements[z].value);

      wenn jetzt z.b. d=2 und document.f.elements[3].value=4 ist dann wird nicht "6" sondern "24" ausgegeben.was mache ich falsch?

      Es werden Zeichenketten addiert, da Formularfelder nicht 4 sondern "4" enthalten!

      Wenn d bereits ein numerischer Wert ist sollte
        d+=parseInt(document.f.elements[3].value,10);
      reichen.

      W e n n  ... ist genau richtig. Aber wenn nicht, wird doch wieder eine Zeichenkette draus!
      Wenn nicht ganz sicher ist, dass d bereits eine Zahl enthält, dann muß es richtig heißen:
      d=eval(d) + eval(document.f.elements[z].value)
      Das ist immer eine Zahl als Additionsergebnis.
      parseInt() ist statdessen zu nehmen, wenn d (vorher und nachher) eine Ganze Zahl (Integer) ist bzw. sein soll. (Aber Vorsicht, da wird nicht grundet, sondern die Nachkommastellen werden abgeschnitten.)

      Gruß
      Hans35

      1. Hallo,

        W e n n  ... ist genau richtig. Aber wenn nicht, wird doch wieder eine Zeichenkette draus!
        Wenn nicht ganz sicher ist, dass d bereits eine Zahl enthält, dann muß es richtig heißen:
        d=eval(d) + eval(document.f.elements[z].value)
        Das ist immer eine Zahl als Additionsergebnis.
        parseInt() ist statdessen zu nehmen, wenn d (vorher und nachher) eine Ganze Zahl (Integer) ist bzw. sein soll. (Aber Vorsicht, da wird nicht grundet, sondern die Nachkommastellen werden abgeschnitten.)

        Hier wuerde ich auch eher zu solchen Formulierungen greifen:

        d=parseInt(d,10) + parseInt(document.f.elements[z].value,10);
        oder
        d=parseFloat(d) + parseFloat(document.f.elements[z].value);

        Wenn es explizite Typkonvertierungsfunktionen gibt, verwende ich diese und nicht eval(). Letzteres halte ich am ehesten bei der Zusammensetzung von Ausdruecken fuer angebracht, z. B.:

        var a,b,c,d,e;
        a="Math";
        b="pow";
        c=2;
        d=4;
        e=eval(a+"."+b+"("+c+","+d+")");
        alert(e); // 16

        Ansonsten ist eval() meistens ersetzbar oder ganz entbehrlich.

        MfG, Thomas