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.
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 :Envoyé par arno00020
Il y a certainement plus optimisé, tiens-moi au courant d'ailleurs si tu trouves mieux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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![]()
Envoyé par Pill_S
C'est bon, je viens de la modifier. Plus personne ne verra mon affreuse méthode, lourde au possible
![]()
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é![]()
ou ca:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
![]()
nan, je persiste !Envoyé par MiJack
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 simplevous 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.
Merci de penser au tagquand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
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.
Merci de penser au tagquand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
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.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![]()
Partager