Sven: parseInt() und intval()

Hallo,

kennt jemand eine Möglichkeit, intval() dazu zu bringen, dass sie genau dasselbe tut wie die JavaScript-Funktion parseInt(), ohne eine gemeinsame Basis anzugeben? Beispiel:

JS: parseInt("03506") ergibt 1862
PHP: intval("03506") ergibt 3506

Wenn ich jetzt einen Radix-Wert von 8 für intval() angebe, habe ich bei beiden 1862. So viel ist klar. Aber dann habe ich hier wieder Unterschiede:

JS: parseInt("3506") ergibt 3506
PHP: intval("3506", 8) ergibt 1862

Ich könnte nun bei beiden eine Basis angeben und hätte immer dasselbe Ergebnis … wenn ich’s könnte. Kann ich aber leider nicht. Die JS-Funktion steckt in einem funktionierenden Skript, das ich gerade versuche in Teilen in PHP zu übersetzen. Darum muss ich ein echtes Equivalent in PHP zu parseInt() finden.

Jemand eine Idee?

  1. Hello,

    JS: parseInt("3506") ergibt 3506

    PHP: intval("3506", 8) ergibt 1862

    Musst Du Dir einen Wrapper bauen:

    function parseInt($intstr)
    {
      if (substr($intstr,0,1) == '0')
      {
        return intval($intstr,8);
      }
      else
      {
        return intval($intstr);
      }
    }

    Nur so als Grundidee.
    Das kann man sicher noch kürzer schreiben, auch an den übergebenen Datentyp denken und dies und das...

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Danke Tom, wenn das genügt, wäre das ja großartig. Aber besteht tatsächlich der einzige Unterschied in der Behandlung von Oktalzahlen oder gibt es noch andere Unterschiede zwischen den beiden Funktionen? Ich traue dem Frieden nicht ;-)

  2. Hallo,

    JS: parseInt("03506") ergibt 1862
    PHP: intval("03506") ergibt 3506

    ... kann mir nicht vorstellen, dass man 1862 erhalten möchte. Deswegen ist es besser den Browser nicht im unklaren zu lassen, welche Basis er benutzen soll. So gibt es z.B. Unterschiede zwischen IE, FF und Opera.

    eindeutig ist:

    JS: i=parseInt("03506",10) oder i=+"03506"

    oder wenn Opera so rechnen soll wie die anderen: i=parseInt("03506",8)

    Gruß plan_B

    --
         *®*´¯`·.¸¸.·
    1. Hallo,

      da gibt es sogar Unterschiede zwischen den Browsern? Na das ist ja großartig ... tja, der Autor der JavaScript-Funktion hat es ohne Basis programmiert. Irgendwie funktioniert es trotzdem und auch in allen Browsern. Aber ich bekomme diesen einen Abschnitt in PHP nicht richtig umgesetzt. Auch wenn ich,  wie Tom empfohlen hat, eine Zwischenfunktion dazu schalte, bekomme ich völlig unterschiedliche Ergebnisse.

      Kann man da irgend etwas machen?

      1. Hallo,

        da gibt es sogar Unterschiede zwischen den Browsern? Na das ist ja großartig ... tja, der Autor der JavaScript-Funktion hat es ohne Basis programmiert. Irgendwie funktioniert es trotzdem und auch in allen Browsern.

        Wahrscheinlich ist bisher keinem ein Fehler aufgefallen.

        tipp doch mal auf das Ergebnis.

        javascript:alert(parseInt("0834"))       zum copieren in die Adresszeile

        das Ergebnis möchte man bestimmt nicht haben. Also korrigiere das js-Script

        Gruß plan_B

        --
             *®*´¯`·.¸¸.·
        1. Hello,

          tipp doch mal auf das Ergebnis.

          javascript:alert(parseInt("0834"))       zum copieren in die Adresszeile

          das Ergebnis möchte man bestimmt nicht haben. Also korrigiere das js-Script

          Interessant.
          Firefox 2.0 und IE 5.5

          javascript:alert(parseInt("0834"))      -->    0
           javascript:alert(parseInt("0834",10))   -->  834
           javascript:alert(parseInt("0834",8))    -->    0
           javascript:alert(parseInt("0834",16))   --> 2100

          javascript:alert(parseInt("834",8))     --> NaN

          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

          1. Moin!

            tipp doch mal auf das Ergebnis.

            javascript:alert(parseInt("0834"))       zum copieren in die Adresszeile

            das Ergebnis möchte man bestimmt nicht haben. Also korrigiere das js-Script

            Interessant.
            Firefox 2.0 und IE 5.5

            Opera 9.24:

            javascript:alert(parseInt("0834"))      -->    0

            -->  834

            Damit ist bewiesen, dass man unmöglich mit PHP eine Funktion bauen kann, die sich wie "parseInt" in Javascript verhält, weil es für parseInt in Javascript kein browserübergreifend identisches Verhalten gibt, nach welchem Zahlensystem Strings zu interpretieren sind.

            Die Dokumentation von Mozilla sagt dazu:
            "If the radix is not specified or is specified as 0, JavaScript assumes the following:

            * If the input string begins with "0x", the radix is 16 (hexadecimal).
            * If the input string begins with "0", the radix is eight (octal). This feature is deprecated.
            * If the input string begins with any other value, the radix is 10 (decimal)."

            "Deprecated", sprich: "Soll nicht mehr, wird aber noch!"

            Opera ist da anscheinend schon weiter.

            Wie man hier im Forum nachlesen kann, hat sich in diesem Punkt der ECMA-Standard geändert:

            " B.1 Additional Syntax

            Past editions of ECMAScript have included additional syntax and semantics for
              specifying octal literals and octal escape sequences. These have been removed
              from this edition of ECMAScript. This non-normative annex presents uniform
              syntax and semantics for octal literals and octal escape sequences for
              compatibility with some older ECMAScript programs."

            Der Rest der Zahlen ist selbstverständlich identisch, weil ja definiert ist, wie die Zahlen zu verstehen sind:

            javascript:alert(parseInt("0834",10))   -->  834

            -->  834

            javascript:alert(parseInt("0834",8))    -->    0

            -->    0

            javascript:alert(parseInt("0834",16))   --> 2100

            --> 2100 (ist aber auch nicht überraschend)

            javascript:alert(parseInt("834",8))     --> NaN

            --> NaN

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Hallo,

              Firefox 2.0 und IE 5.5
              Opera 9.24:

              javascript:alert(parseInt("0834"))      -->    0
                                                          -->  834

              Opera ist da anscheinend schon weiter.

              ich denke mal, Opera "mag" nur das Dezimalsystem. Auch mit der neusten Version kenne ich keine direkte Methode, eine Zahl anders darzustellen.  http://de.selfhtml.org/javascript/objekte/number.htm#to_string@title=javascript/objekte/number.htm#to_string

              Gruß plan_B

              --
                   *®*´¯`·.¸¸.·
              1. Danke euch, für die Aufklärung. Wieder was dazu gelernt.

                Habe mein Problem mittlerweile lösen können ... es lag, wie so oft, ganz woanders :-(

                Erstaunlicherweise funktionieren parseInt() und intval() ohne Angabe eines Radix-Wertes in diesem speziellen Fall. Muss wohl an den übergebenen Werten liegen. Verstehe es nicht, aber wenigstens funktioniert es :-)