Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Problema al convertir cadena a número (curioso)

Hola.

Me estoy encontrando con algo curioso.

Tengo que detectar si una cadena de texto es numerica (entero, float, real) o no.

Utilizo una función similar a esta:
private boolean esDouble(String cadena) {
try {
Double.parseDouble(cadena);
} catch (NumberFormatException nfe) {

return false;
}
return true;

}
Simplemente intento hacer la conversión y devuelvo true o false.

Para un texto como el siguiente:
1º trimestre de 2005

me dice que SÍ que es numérico y si además hago la conversión se lo traga y me devuelve 1.

Alguna sugerencia?

Gracias.
Salu2

febrero 6, 2013 | Unregistered CommenterDavid

Hola soy nuevo en javahispano.
He probado tu función y por lo menos para el caso que das "1º trimestre de 2005" me da false.
He probado para todos estos casos:
String cad="1º trimestre de 2005";
String cad1 = "234";
String cad2 = " 33434 ";
String cad3 = "2773.";
String cad4 = ".2773";
String cad5 = ".2773.";
String cad6 = " -332 ";
String mat[] = {cad,cad1,cad2,cad3,cad4,cad5,cad6};

for(int i=0;i<7;i++){
if(esDouble(mat[i]))System.out.println("Si");
else System.out.println("No");
}

resultados:
No
Si
Si
Si
Si
No
Si

Saludos.

febrero 7, 2013 | Unregistered Commenterz

Hola David, como lo estas probando?

No le estaras pasando args[0] al esDouble por casualidad?

Un saludo,

febrero 7, 2013 | Unregistered CommenterUnoPorAhi

El código más completo que conozco, para detectar si una cadena cualquiera es un número, es el que sigue (está en la clase NumberUtils, de org.apache.commons.lang)

public static boolean isNumber(String str) {
if (StringUtils.isEmpty(str)) {
return false;
}
char[] chars = str.toCharArray();
int sz = chars.length;
boolean hasExp = false;
boolean hasDecPoint = false;
boolean allowSigns = false;
boolean foundDigit = false;
// deal with any possible sign up front
int start = (chars[0] == '-') ? 1 : 0;
if (sz > start + 1) {
if (chars[start] == '0' && chars[start + 1] == 'x') {
int i = start + 2;
if (i == sz) {
return false; // str == "0x"
}
// checking hex (it can't be anything else)
for (; i < chars.length; i++) {
if ((chars[i] < '0' || chars[i] > '9')
&& (chars[i] < 'a' || chars[i] > 'f')
&& (chars[i] < 'A' || chars[i] > 'F')) {
return false;
}
}
return true;
}
}
sz--; // don't want to loop to the last char, check it afterwords
// for type qualifiers
int i = start;
// loop to the next to last char or to the last char if we need another digit to
// make a valid number (e.g. chars[0..5] = "1234E")
while (i < sz || (i < sz + 1 && allowSigns && !foundDigit)) {
if (chars[i] >= '0' && chars[i] <= '9') {
foundDigit = true;
allowSigns = false;

} else if (chars[i] == '.') {
if (hasDecPoint || hasExp) {
// two decimal points or dec in exponent
return false;
}
hasDecPoint = true;
} else if (chars[i] == 'e' || chars[i] == 'E') {
// we've already taken care of hex.
if (hasExp) {
// two E's
return false;
}
if (!foundDigit) {
return false;
}
hasExp = true;
allowSigns = true;
} else if (chars[i] == '+' || chars[i] == '-') {
if (!allowSigns) {
return false;
}
allowSigns = false;
foundDigit = false; // we need a digit after the E
} else {
return false;
}
i++;
}
if (i < chars.length) {
if (chars[i] >= '0' && chars[i] <= '9') {
// no type qualifier, OK
return true;
}
if (chars[i] == 'e' || chars[i] == 'E') {
// can't have an E at the last byte
return false;
}
if (!allowSigns
&& (chars[i] == 'd'
|| chars[i] == 'D'
|| chars[i] == 'f'
|| chars[i] == 'F')) {
return foundDigit;
}
if (chars[i] == 'l'
|| chars[i] == 'L') {
// not allowing L with an exponent
return foundDigit && !hasExp;
}
// last character is illegal
return false;
}
// allowSigns is true iff the val ends in 'E'
// found digit it to make sure weird stuff like '.' and '1E-' doesn't pass
return !allowSigns && foundDigit;
}

febrero 7, 2013 | Registered Commenterchoces