2012-06-19 13 views
7

Estoy haciendo una aplicación basada en web y tengo campos de texto donde los valores se almacenan como cadenas. El problema es que algunos de los campos de texto se deben analizar en entradas y se pueden almacenar números mucho mayores en cadenas que en una int. Mi pregunta es, ¿cuál es la mejor manera de asegurarse de que el número String se pueda analizar en un int sin errores de salida?¿Cuál es la mejor manera de asegurarse de que una cadena se pueda almacenar como int en java

+11

Valide la entrada mediante el análisis con 'Integer.parseInt (...)' en 'try/catch (NumberFormatException e)'. –

+0

¿Qué tan grande es tu número? ¿Su número está fuera del rango de tipos disponibles en Java (Doble/Float)? – Santosh

+0

@HovercraftFullOfEels No creo que el OP esté hablando de 'NumberFormatException'. Creo que se trata de la 'Cadena' cuando se convierte en un número (' Entero'), podría estar fuera de rango. –

Respuesta

11

Puede usar una estructura de prueba/captura para eso.

try { 
    Integer.parseInt(yourString); 
    //new BigInteger(yourString); 
    //Use the above if parsing amounts beyond the range of an Integer. 
} catch (NumberFormatException e) { 
    /* Fix the problem */ 
} 
+0

muchas gracias por su ayuda. eso hizo el truco. – user1423793

0

Se puede ejecutar una comprobación en el código:

  • convertir la cadena en un largo.
  • Compara el largo contra el valor máximo para un entero (una constante dentro de la clase Entero)
  • Si el largo es mayor que este, se sabe que no se puede analizar en un int sin desbordamiento.
  • Si es menor o igual que él, conviértalo en int.
+0

¿Por qué no simplemente convertirlo directamente en un int? – luketorjussen

+0

Porque soy tonto, claro. (¿No es probable que un int se desborde a un valor negativo, o falle? Necesitaría un bloque try/catch, que sin duda es la mejor respuesta.) – BlackVegetable

0

Siempre analice la cadena en el bloque try catch, por lo que si se produce alguna excepción o error, sabrá que hay algún error en el análisis String to int.

5

El método Integer.parseInt comprueba el rango que está explicitada por el javadoc:

An exception of type NumberFormatException is thrown if any of the following situations occurs: 
The first argument is null or is a string of length zero. 
The radix is either smaller than Character.MIN_RADIX or larger than Character.MAX_RADIX. 
Any character of the string is not a digit of the specified radix, except that the first character may be a minus sign '-' ('\u002D') provided that the string is longer than length 1. 
The value represented by the string is not a value of type int. 
Examples: 
parseInt("0", 10) returns 0 
parseInt("473", 10) returns 473 
parseInt("-0", 10) returns 0 
parseInt("-FF", 16) returns -255 
parseInt("1100110", 2) returns 102 
parseInt("2147483647", 10) returns 2147483647 
parseInt("-2147483648", 10) returns -2147483648 
parseInt("2147483648", 10) throws a NumberFormatException 
parseInt("99", 8) throws a NumberFormatException 
parseInt("Kona", 10) throws a NumberFormatException 
parseInt("Kona", 27) returns 411787 

Así que la forma correcta es tratar de analizar la cadena:

try { 
    Integer.parseInt(str); 
} catch (NumberFormatException e) { 
    // not an int 
} 
+0

gracias. que funcionó – user1423793

3

analizar la cadena a un BigInteger en lugar de un entero normal Esto puede contener valores mucho más altos.

BigInteger theInteger = new BigInteger(stringToBeParsed); 
+0

Sin embargo, eso no parece responder la pregunta. –

+0

+1 Creo que esto es lo que el OP está buscando. –

+0

@dystroy. En realidad, creo que sí. La forma en que leo la pregunta es que él quiere que el usuario pueda ingresar cualquier número, pero no desea que el programa se cuelgue debido a que el número es grande –

0

Puede usar Apache Commons Lang.

import org.apache.commons.lang.math.NumberUtils; 

NumberUtils.toInt("", 10); // returns 10 
NumberUtils.toInt(null, 10); // returns 10 
NumberUtils.toInt("1", 0); // returns 1 

El segundo número es el predeterminado si la cadena no es un valor numérico. El primer parámetro es la cadena que está intentando convertir.

Para un gran número me gustaría hacer la siguiente

BigInteger val = null; 
try { 
    val = new BigInteger("1"); 
} catch (NumberFormatException e) { 
    val = BigInteger.ZERO; 
} 
+0

También podría usar Long? – mrswadge

0

qué pasa con esto?

BigInteger bigInt = BigInteger(numberAsString); 
boolean fitsInInt = (bigInt.compareTo(BigInteger.valueOf(bigInt.intValue())) == 0; 
Cuestiones relacionadas