parseInt() und intval()
Sven
- php
1 Tom0 Sven
0 plan_B0 Sven
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?
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
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 ;-)
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
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?
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
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
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
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
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 :-)