Number = parseInt
Par -Alexandre LEGOUT aka LAlex- le vendredi, juin 9 2006, 18:49 - AS2 - Lien permanent
Number, en plus d'être une classe, est également une fonction, tout comme le sont Array, Boolean et String. Elle permet de convertir un objet quelconque en une instance de Number.
Seulement, ce qui n'est pas précisé dans la doc, c'est que cette fonction suit les mêmes règles que parseInt, sans pouvoir toutefois lui passer de second paramètre, qui précise dans quelle base doit se faire la conversion. Ce qui signifie que :
- Les chaines de caractères commencant par "0x" seront considérées comme héxadécimales
- Les chaines de caractères commencant par "0" seront considérées comme octales.
Et c'est sur ce dernier point que je me suis fait avoir, en cherchant un long moment pourquoi mon "062" devenait 50... :\ J'ai donc du remplacer toutes mes conversions :var num:Number = Number("062") // num = 50
// par
var num:Number = parseInt("062", 10) // num = 62
Donc voilà, si ca peut profiter à quelqu'un.. ![]()
Commentaires
ça t'apprendra à utiliser un cast foireux pour une opération aussi risquée que de la conversion string > nombre
bon à savoir en tout cas, merci !
Rang dans un tiroir

thx
Ca m'était arrivé il y a un bail, j'avais trouvé la parade parseInt, mais je ne savais pas pourquoi... Maintenant avec le "0" tout s'explique. Merci pour cette info !
Meme combat avec notre vieux int("010") -> 8
Je le vois très bien comme question piège au passage d'une certif Adobe :
Que retourne l'expression suivante : Number("010");
1) NaN
2) Undefined
3) 8
4) 10
@foxy > Il ne s'agit pas d'un cast, mais bel et bien d'un transtypage, Number étant une fonction "standard" (avec un retour) en plus d'être un constructeur... C'est juste qu'elle est mal documentée...
Oui c'est vrai...
Enfin une méthode statique "standard" qui porte le même nom qu'un type primitif, ç'est toujours un peu flipant !
@foxy > Tu m'etonnes :\
Ils auraient mieux fait de virer ces fonctions, et de laisser leurs "vrai-faux" cast pour toute fonction constructeur... C'est parfois trés limitatif qu'en voulant faire un cast on soit obligé de faire un appel de fonction...
Pareil pour l'héritage de la classe Number... en AS2 le super() passe bien mais en SSAS par exemple, il n'y a pas de super() et du coup il est impossible d'utiliser la fonction constructeur pour initialiser le constructeur de la classe fille.
Surtout quand on découvre ce genre de réaction sans avoir au début vraiment l'idée qu'il va y avoir un problème !
Exemple qui bloque avec l'héritage de Number :
Toto = function( n /*Number*/ ) {Du coup faut utiliser une propriété pour stocker la valeur... n'importe quoi en bref lolNumber.call(this, n) ; // Ceci ne marche pas car Number est vraiment mal foutu !
}
Toto.prototype = new Number() ;
Toto = function( n /*Number*/ ) {this._n = n ;
}
Toto.prototype = new Number() ;
Toto.prototype.valueOf = function () {
return Number(this._n) ;
}
Toto.prototype.toString = function () {
return String(this._n) ;
}
Du coup .. pas vraiment besoin d'hériter de Number au final pour recréer une telle classe
J'ai pas regardé en AS3 si ils ont arrangé tout cela ? Mais en tout cas c'est très frustrant parfois tout cela
EKA+
Euh...
Le fait d'ajouter un "0" devant un nombre indique au compilateur / interpréteur qu'on souhaite travailler en Octal, et c'est valable dans tous les langages.
010 = (10 en base
= 8.
Foutu smiley
Lire : ( 10 en base 8 )
Fil des commentaires de ce billet