Comment savoir si une chaine de caractére est un nombre ?
exemple :
"1234567890123456789" est un nombre
mais 123456789f123456789" n'en es pas un !
merci arnaud.
Version imprimable
Comment savoir si une chaine de caractére est un nombre ?
exemple :
"1234567890123456789" est un nombre
mais 123456789f123456789" n'en es pas un !
merci arnaud.
Je ne sais pas si tu peux vraiment te fier à ça, mais j'ai justement fait une petite méthode cet après-midi pour mes besoins :Citation:
Envoyé par arno00020
Il y a certainement plus optimisé, tiens-moi au courant d'ailleurs si tu trouves mieux.Code:
1
2
3
4
5
6
7
8
9
10
11 public static boolean isInteger(String input) { for (int i = 0; i < input.length(); i++) { if (!(input.charAt(i) == '0' || input.charAt(i) == '1' || input.charAt(i) == '2' || input.charAt(i) == '3' || input.charAt(i) == '4' || input.charAt(i) == '5' || input.charAt(i) == '6' || input.charAt(i) == '7' || input.charAt(i) == '8' || input.charAt(i) == '9')) { return false; } } return true;
un peu mieux:
:wink:Code:
1
2
3
4
5
6
7
8
9 String chaine="1234"; boolean estUnNombre; try { Integer.parseInt(chaine); estUnNombre=true; } catch(NumberFormatException e) { estUnNombre=false; }
Effectivement j'avais pensé au try catch par la suite, mais j'ai eu la flemme de changer ma belle méthode :P
hum hum :roll:Citation:
Envoyé par MiJack
:lol: C'est bon, je viens de la modifier. Plus personne ne verra mon affreuse méthode, lourde au possible :oops:Citation:
Envoyé par Pill_S
c ce a quoi j'avais pensé au debut mais pour un nombre trop gd ca me péte une exception alors que le format est bon.
exemple : 11111111111111111111111111111111
On dirait que ma méthode est à nouveau d'actualité :D
ou ca:
Code:
1
2
3
4
5
6
7
8
9
10 public static boolean isNombre(String input) { for (int i = 0; i < input.length(); i++) { char c = input.charAt(i); if(c<'0' || c>'9') return false; } return true; }
:wink:
nan, je persiste ! ;)Citation:
Envoyé par MiJack
Code:
1
2
3
4
5
6
7
8 boolean isint; try { BigInteger bigInt = new BigInteger(machainevachementlongue); isint=true; } catch(NumberFormatException e){ isint = false; }
j'aime bien la méthode de Pill_S...
manière ca depend simplement du type de nombre car on pourrait faire la même chose avec les réels...
C'est pourtant simple :arrow: vous faites tourner des tests sur plusieurs milliers de strings et vous voyez laquelle des 2 est la plus rapide.
Fut un temps les profs disaient que c'etait couteux de lever des exceptions pour rien et que dans la mesure du possible mieux valait faire sans. Mais bon c'etait les profs... le mieux c'est de tester soi-meme :!:
Reste que la methode de saod a l'avantage ne ne pas creer d'objet intermedaire mais s'adaptera assez mal a des nombres au format plus complexe (negatif, flottant, nottation scientifique, ...) sans faire des dizaines de cas et de test specifiques.
Celle(s) de Pill_S fonctionnera partout. C'est dailleurs la premiere qui m'est venue a l'esprit. Mais dans certains usages (temps reel, espace memoire restreint), l'autre est probablement preferable.
Il devrait aussi etre possible de definir un pattern pour un nombre et d'utiliser les regexp pour voir si la chaine fournie "match" le pattern.
Je crois effectivement que dans le cas présent, le choix le plus robuste serait de passer par les expressions régulières.
reste à connaître l'usage...
si le but n'est que de savoir si une chaîne est nombre, alors les expressions régulières semblent meilleures...
mais si il faut faire des opération mathématiques avec ce nombre par la suite, alors obligé de passer par BigInteger ;)
Des trucs dans le genre (note : ca fait quelques temps que je ne fais plus trop de regexp, de pattern matching ou d'analyse lexicale) :
Short, int, long, float, double + nottation scientifique
'-'?[0-9]+('.'[0-9]+)?(E'-'?[0-9]+)?
Hexadecimal
'-'?[(0[xX])#][0-9A-Fa-f]+
Octal
'-'?0[0-7]+
Si l'on regarde la doc des methodes parseXXX() des differentes classes de nombres on verra qu'en general elles refusent les suffixes/extensions genre l, f ou d qui sont pourtant utilises par le language Java. Donc je ne les ai pas inclus ici.
N'oubliez pas Character.isDigit(int) qui a l'avantage de fonctionner avec d'autres langues. Extrait de la doc :
La classe StreamTokenizer peut aussi faire le boulot.Citation:
Some Unicode character ranges that contain digits:
* '\u0030' through '\u0039', ISO-LATIN-1 digits ('0' through '9')
* '\u0660' through '\u0669', Arabic-Indic digits
* '\u06F0' through '\u06F9', Extended Arabic-Indic digits
* '\u0966' through '\u096F', Devanagari digits
* '\uFF10' through '\uFF19', Fullwidth digits
Many other character ranges contain digits as well.
P.S : pour la regex, on peut remplacer les [0-9] par \d et les [0-9a-fA-F] par \p{XDigit}.
Tu as juste un probleme avec la Locale dans ton cas .. ce que la conversion en Big[Integer/Decimal] prend surement en compte.
Sinon il y a aussi la solution du DecimalFormat.parse qui respecte la locale.
Bulbo :wink: