¿Existe alguna forma nativa (preferiblemente sin implementar su propio método) de verificar que una cadena sea analizable con Double.parseDouble()
?¿Cómo comprobar que una cadena es parseable a un doble?
Respuesta
El enfoque común sería la de comprobar que con una expresión regular como también sugiere el interior de la documentación Double.valueOf(String)
.
La expresión regular proporcionada allí (o incluida a continuación) debe cubrir todos los casos de punto flotante válidos, por lo que no necesita jugar con ella, ya que eventualmente se perderá algunos de los puntos más finos.
Si no quiere hacer eso, try catch
sigue siendo una opción.
La expresión regular sugerido por el JavaDoc se incluye a continuación:
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
}
Siempre puede ajustar Double.parseDouble() en un bloque try catch.
try
{
Double.parseDouble(number);
}
catch(NumberFormatException e)
{
//not a double
}
Este sería mi método preferido porque su garantía para obtener exactamente el mismo comportamiento que el análisis. Es muy fácil con una expresión regular personalizada pasar por alto las mayúsculas y minúsculas. –
Esto es bueno EXCEPTO si escribe un número seguido de un espacio, no lo capta. – giant91
@ giant91 - simplemente recorte el número: 'number.trim()'. – 26hmkk
Algo parecido a continuación debería ser suficiente: -
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, como de costumbre, tiene una buena respuesta de Apache Commons-Lang en forma de org.apache.commons.lang3.math.NumberUtils.isNumber(String)
Maneja nulos, no try
/catch
bloque requerido.
¿Apache se envía con el JDK normal? –
No. Puede encontrar las bibliotecas de Apache Commons aquí. http://commons.apache.org/. Se recomienda encarecidamente que los use en lugar de escribir código personalizado siempre que pueda. –
¿Identifica esto números decimales? – TechCrunch
Todas las respuestas son correctas, dependiendo de cuán académico desee ser. Si desea seguir las especificaciones Java con precisión, utilice la siguiente:
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();
}
Este código se basa en los JavaDocs en Double.
La biblioteca de guayaba de Google proporciona un buen método de ayuda para hacer esto: Doubles.tryParse(String)
. Lo usa como Double.parseDouble
pero devuelve null
en lugar de arrojar una excepción si la cadena no se convierte en un doble.
- 1. ¿Cómo comprobar si un doble es nulo?
- 2. Seleccionar int analizado, si la cadena fue parseable a int
- 3. Cómo comprobar que una cadena uri es válida
- 4. Comprobando si una cadena es un doble o no
- 5. ¿Cómo comprobar si un tipo es una cadena en C#?
- 6. cadena doble a hexagonal y cadena hexagonal a doble
- 7. Comprobar si una enumeración tiene un campo que es igual a una cadena
- 8. Python: ¿Cómo comprobar si una cadena es un IRI válido?
- 9. ¿Cómo comprobar que una cadena comience con un número numérico?
- 10. Cómo obtener un doble de una cadena
- 11. Convertir cadena a doble - VB
- 12. Comprobar si un doble es infinita en Java
- 13. cacao - conversión de un doble a cadena
- 14. cómo comprobar si un carácter es igual a la comilla doble en java
- 15. ¿Cómo comprobar si mi cadena es igual a nulo?
- 16. Convierte una cadena en una doble, ¿es esto posible?
- 17. Objective-C cómo comprobar si una cadena es nula
- 18. la conversión de una cadena a un doble
- 19. Cómo comprobar inf (y | o) NaN en una variable doble
- 20. Convertir una cadena que contiene un número en notación científica a un doble en PHP
- 21. ¿Cómo puedo verificar si un número (tipo doble) almacenado como una cadena es un número doble válido en C++?
- 22. ¿Cómo comprobar si una cadena contiene letras inglesas (A-Z)?
- 23. ¿Qué es más grande que un doble?
- 24. ¿Cómo comprobar si una cadena comienza con una cadena especificada?
- 25. ¿Cómo convierto un doble en una cadena en C++?
- 26. Bash - pruebas para comprobar si una cadena es 'mayor' que otro - ¿cómo funciona internamente?
- 27. Conversión de doble a cadena en C++
- 28. Cómo comprobar si una cadena es un XML válido sin mostrar una advertencia en PHP
- 29. ¿Cómo comprobar si un valor es un número entero o una cadena en jasmine.js?
- 30. ¿Cómo reemplazo una comilla doble con una comilla doble escape-char en una cadena usando javascript?
+1 - Mucho mejor que atrapar una excepción (mi respuesta coja ...) – Starkey
¿cómo se hace esto exactamente? –
@Louis Rhys: hay un ejemplo de código en el enlace de documentación en la respuesta. – Starkey