Existe-t-il un moyen natif (de préférence sans implémenter votre propre méthode) pour vérifier qu'une chaîne est analysable avec Double.parseDouble()
?Comment vérifier qu'une chaîne est parseable en double?
Répondre
L'approche commune serait de le vérifier avec une expression régulière comme il est suggéré aussi à l'intérieur de la documentation Double.valueOf(String)
. L'expression rationnelle fournie ici (ou incluse ci-dessous) devrait couvrir tous les cas de virgule flottante valides, donc vous n'avez pas besoin de jouer avec, car vous finirez par passer à côté de certains des points plus fins. Si vous ne souhaitez pas faire cela, try catch
est toujours une option.
Le regexp suggéré par le JavaDoc est inclus ci-dessous:
final String Digits = "(\\p{Digit}+)";
final String HexDigits = "(\\p{XDigit}+)";
// an exponent is 'e' or 'E' followed by an optionally
// signed decimal integer.
final String Exp = "[eE][+-]?"+Digits;
final String fpRegex =
("[\\x00-\\x20]*"+ // Optional leading "whitespace"
"[+-]?(" + // Optional sign character
"NaN|" + // "NaN" string
"Infinity|" + // "Infinity" string
// A decimal floating-point string representing a finite positive
// number without a leading sign has at most five basic pieces:
// Digits . Digits ExponentPart FloatTypeSuffix
//
// Since this method allows integer-only strings as input
// in addition to strings of floating-point literals, the
// two sub-patterns below are simplifications of the grammar
// productions from the Java Language Specification, 2nd
// edition, section 3.10.2.
// Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
"((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+
// . Digits ExponentPart_opt FloatTypeSuffix_opt
"(\\.("+Digits+")("+Exp+")?)|"+
// Hexadecimal strings
"((" +
// 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
"(0[xX]" + HexDigits + "(\\.)?)|" +
// 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt
"(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +
")[pP][+-]?" + Digits + "))" +
"[fFdD]?))" +
"[\\x00-\\x20]*");// Optional trailing "whitespace"
if (Pattern.matches(fpRegex, myString)){
Double.valueOf(myString); // Will not throw NumberFormatException
} else {
// Perform suitable alternative action
}
Vous pouvez toujours placer Double.parseDouble() dans un bloc try catch.
try
{
Double.parseDouble(number);
}
catch(NumberFormatException e)
{
//not a double
}
Ce serait ma méthode préférée parce que votre garantie d'obtenir exactement le même comportement que l'analyse. Il est très facile avec une expression régulière personnalisée d'ignorer les cas de bordure. –
Cela est bon, SAUF si vous tapez un nombre suivi d'un espace, il ne l'attrape pas. – giant91
@ giant91 - il suffit de rogner le nombre: 'number.trim()'. – 26hmkk
Quelque chose comme ci-dessous devrait suffire: -
String decimalPattern = "([0-9]*)\\.([0-9]*)";
String number="20.00";
boolean match = Pattern.matches(decimalPattern, number);
System.out.println(match); //if true then decimal else not
Apache, comme d'habitude, a une bonne réponse de Apache Commons-Lang sous forme de org.apache.commons.lang3.math.NumberUtils.isNumber(String)
Les poignées sont nulles, aucune try
/catch
n'est requise.
Apache est-il livré avec le JDK normal? –
Non. Vous pouvez trouver les bibliothèques Apache Commons ici. http://commons.apache.org/ Nous vous recommandons vivement de les utiliser plutôt que d'écrire du code personnalisé chaque fois que vous le pouvez. –
Est-ce que cela identifie les nombres décimaux? – TechCrunch
Toutes les réponses sont OK, selon la façon dont vous voulez être académique. Si vous souhaitez suivre les spécifications Java avec précision, utilisez les touches suivantes:
private static final Pattern DOUBLE_PATTERN = Pattern.compile(
"[\\x00-\\x20]*[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)" +
"([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|" +
"(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))" +
"[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*");
public static boolean isFloat(String s)
{
return DOUBLE_PATTERN.matcher(s).matches();
}
Ce code est basé sur les JavaDocs à Double.
La bibliothèque Guava de Google fournit une méthode d'aide intéressante pour ce faire: Doubles.tryParse(String)
. Vous l'utilisez comme Double.parseDouble
mais il renvoie null
plutôt que de lancer une exception si la chaîne n'analyse pas un double.
- 1. vérifier si une chaîne est un double
- 2. Comment puis-je savoir si une chaîne est parseable avec le constructeur jodatimes DateTime?
- 3. chaîne est valide double ou non
- 4. Comment convertir une chaîne (contenant double max) en double
- 5. Comment vérifier qu'une chaîne est un int, mais pas un double, etc.?
- 6. convertir la chaîne en double
- 7. Comment vérifier les fichiers en double en php?
- 8. Convertir la chaîne en double
- 9. comment convertir un double en une chaîne?
- 10. JTree vérifier les catégories en double
- 11. Convertir la chaîne en double - VB
- 12. Conversion de chaîne double en chaîne en C++
- 13. comment vérifier l'entrée en double dans les zones de texte?
- 14. jquery ajax- Comment vérifier le nom en double
- 15. Comment puis-je vérifier l'enregistrement en double dans SQL Server
- 16. Comment vérifier l'entrée en double dans la base de données?
- 17. Java: conversion d'un double en chaîne
- 18. cacao - convertir un double en chaîne
- 19. Comment convertir une chaîne en double en jaspe?
- 20. Comment convertir un double en chaîne en C++?
- 21. VB.Net Conversion de chaîne en double
- 22. Chaîne remplacer en Java ME double espace
- 23. chaîne en notation scientifique C++ double conversion
- 24. Convertir une chaîne en double - Java
- 25. Comment vérifier si un caractère est en majuscule en Python?
- 26. Comment convertir une chaîne en double avec un cultureinfo approprié
- 27. comment vérifier si les données saisies est une chaîne en php
- 28. convertir très petit double en une chaîne
- 29. Comment vérifier si la variable est une chaîne CFString?
- 30. Requête MySQL pour vérifier certaines phrases (article en double, plagiat)
+1 - Beaucoup mieux que d'attraper une exception (ma réponse boiteuse ...) – Starkey
comment fait-on exactement? –
@Louis Rhys - Il y a un exemple de code dans le lien de la documentation dans la réponse. – Starkey