excepciones no deben ser utilizados para el control de flujo, aunque los autores de Java hacen que sea difícil no utiliza NumberFormatException
de esa manera.
La clase java.util.Scanner
tiene un método para comprobar si un String
se puede leer como un doble.
Debajo del capó Scanner
utiliza expresiones regulares (a través de patrones precompilados) para determinar si un String
se puede convertir en un número entero o en coma flotante. Los patrones se compilan en el método buildFloatAndDecimalPattern
que se puede ver en GrepCode here.
Un patrón precompilado tiene la ventaja adicional de ser más rápido que el uso de un bloque try/catch.
Aquí está el método mencionado anteriormente, en el caso GrepCode desaparece un día:
private void buildFloatAndDecimalPattern() {
// \\p{javaDigit} may not be perfect, see above
String digit = "([0-9]|(\\p{javaDigit}))";
String exponent = "([eE][+-]?"+digit+"+)?";
String groupedNumeral = "("+non0Digit+digit+"?"+digit+"?("+
groupSeparator+digit+digit+digit+")+)";
// Once again digit++ is used for performance, as above
String numeral = "(("+digit+"++)|"+groupedNumeral+")";
String decimalNumeral = "("+numeral+"|"+numeral +
decimalSeparator + digit + "*+|"+ decimalSeparator +
digit + "++)";
String nonNumber = "(NaN|"+nanString+"|Infinity|"+
infinityString+")";
String positiveFloat = "(" + positivePrefix + decimalNumeral +
positiveSuffix + exponent + ")";
String negativeFloat = "(" + negativePrefix + decimalNumeral +
negativeSuffix + exponent + ")";
String decimal = "(([-+]?" + decimalNumeral + exponent + ")|"+
positiveFloat + "|" + negativeFloat + ")";
String hexFloat =
"[-+]?0[xX][0-9a-fA-F]*\\.[0-9a-fA-F]+([pP][-+]?[0-9]+)?";
String positiveNonNumber = "(" + positivePrefix + nonNumber +
positiveSuffix + ")";
String negativeNonNumber = "(" + negativePrefix + nonNumber +
negativeSuffix + ")";
String signedNonNumber = "(([-+]?"+nonNumber+")|" +
positiveNonNumber + "|" +
negativeNonNumber + ")";
floatPattern = Pattern.compile(decimal + "|" + hexFloat + "|" +
signedNonNumber);
decimalPattern = Pattern.compile(decimal);
}
AFAIK, haga una Double.parseDouble (String) en ella y arroja una excepción si no comienza con números. (Generalizando aquí). Si quiere hacer regExs y eliminar los principales caracteres no numéricos, esa es una historia diferente. – Rcunn87
Bueno, AFAIK, try-catch tiende a ser bastante lento. – JHollanti
Voy a utilizar el segundo Rcunn87 en la idea de expresión regular, pero asegúrese de compilarlo y almacenarlo estáticamente para que pueda volver a usarlo una y otra vez. –