Como posso converter um String
para um int
em Java?
Minha String contém apenas números e eu quero retornar o número que representa.
Por exemplo, dada a string, "1234"
o resultado deve ser o número 1234
.
Como posso converter um String
para um int
em Java?
Minha String contém apenas números e eu quero retornar o número que representa.
Por exemplo, dada a string, "1234"
o resultado deve ser o número 1234
.
Respostas:
String myString = "1234";
int foo = Integer.parseInt(myString);
Se você olhar para a documentação em Java, perceberá que o "problema" é que essa função pode NumberFormatException
gerar um , que é claro que você precisa lidar com:
int foo;
try {
foo = Integer.parseInt(myString);
}
catch (NumberFormatException e)
{
foo = 0;
}
(Esse tratamento assume como padrão um número incorreto 0
, mas você pode fazer outra coisa, se quiser.)
Como alternativa, você pode usar um Ints
método da biblioteca Guava, que em combinação com os Java 8 Optional
, cria uma maneira poderosa e concisa de converter uma string em um int:
import com.google.common.primitives.Ints;
int foo = Optional.ofNullable(myString)
.map(Ints::tryParse)
.orElse(0)
int foo = NumberUtils.toInt(myString, 0);
Por exemplo, aqui estão duas maneiras:
Integer x = Integer.valueOf(str);
// or
int y = Integer.parseInt(str);
Há uma pequena diferença entre estes métodos:
valueOf
retorna uma instância nova ou em cache de java.lang.Integer
parseInt
retorna primitivo int
.O mesmo é para todos os casos: Short.valueOf
/ parseShort
, Long.valueOf
/ parseLong
, etc.
valueOf
o método é justo #return valueOf(parseInt(string));
valueOf
chama-se recursivamente?
valueOf(String)
é implementado analisando primeiro a String para um int usando parseInt(String)
e depois agrupando esse int em um número inteiro usando valueOf(int)
. Nenhuma recursão aqui porque valueOf(String)
e valueOf(int)
são duas funções completamente diferentes, mesmo que tenham o mesmo nome.
Bem, um ponto muito importante a considerar é que o analisador de números inteiros lança NumberFormatException conforme declarado em Javadoc .
int foo;
String StringThatCouldBeANumberOrNot = "26263Hello"; //will throw exception
String StringThatCouldBeANumberOrNot2 = "26263"; //will not throw exception
try {
foo = Integer.parseInt(StringThatCouldBeANumberOrNot);
} catch (NumberFormatException e) {
//Will Throw exception!
//do something! anything to handle the exception.
}
try {
foo = Integer.parseInt(StringThatCouldBeANumberOrNot2);
} catch (NumberFormatException e) {
//No problem this time, but still it is good practice to care about exceptions.
//Never trust user input :)
//Do something! Anything to handle the exception.
}
É importante lidar com essa exceção ao tentar obter valores inteiros a partir de argumentos de divisão ou analisar algo dinamicamente.
"([0-9]+)"
"captura" a primeira sequência de um ou mais dígitos de um a nove. Veja a Matcher
classe nesse pacote.
Faça manualmente:
public static int strToInt( String str ){
int i = 0;
int num = 0;
boolean isNeg = false;
//Check for negative sign; if it's there, set the isNeg flag
if (str.charAt(0) == '-') {
isNeg = true;
i = 1;
}
//Process each character of the string;
while( i < str.length()) {
num *= 10;
num += str.charAt(i++) - '0'; //Minus the ASCII code of '0' to get the value of the charAt(i++).
}
if (isNeg)
num = -num;
return num;
}
Integer.parseInt(s)
? - Entendo que essa é uma pergunta de entrevista, mas a) não implica que você faça dessa maneira (que é o que o questionador perguntou) eb) essa resposta é um exemplo muito ruim de qualquer maneira.
Integer.parseInt
porque não faz validação.
Uma solução alternativa é usar o NumberUtils do Apache Commons :
int num = NumberUtils.toInt("1234");
O utilitário Apache é bom, porque se a string for um formato de número inválido, 0 será sempre retornado. Portanto, poupando o bloco try catch.
Atualmente, estou fazendo uma tarefa para a faculdade, onde não posso usar certas expressões, como as acima, e, olhando a tabela ASCII, consegui fazê-lo. É um código muito mais complexo, mas pode ajudar outras pessoas que são restritas como eu.
A primeira coisa a fazer é receber a entrada, neste caso, uma sequência de dígitos; Vou chamá-lo String number
e, neste caso, vou exemplificá-lo usando o número 12, portantoString number = "12";
Outra limitação foi o fato de eu não poder usar ciclos repetitivos; portanto, um for
ciclo (o que teria sido perfeito) também não pode ser usado. Isso nos limita um pouco, mas, novamente, esse é o objetivo. Como eu só precisava de dois dígitos (pegando os dois últimos), um simples charAt
resolveu:
// Obtaining the integer values of the char 1 and 2 in ASCII
int semilastdigitASCII = number.charAt(number.length()-2);
int lastdigitASCII = number.charAt(number.length()-1);
Tendo os códigos, precisamos apenas olhar para a tabela e fazer os ajustes necessários:
double semilastdigit = semilastdigitASCII - 48; //A quick look, and -48 is the key
double lastdigit = lastdigitASCII - 48;
Agora, por que dobrar? Bem, por causa de um passo realmente "estranho". Atualmente, temos duas duplas, 1 e 2, mas precisamos transformá-la em 12, não há nenhuma operação matemática que possamos fazer.
Estamos dividindo o último (lastdigit) por 10 da maneira 2/10 = 0.2
(daí o dobro) assim:
lastdigit = lastdigit/10;
Isso é apenas brincar com números. Estávamos transformando o último dígito em um decimal. Mas agora, veja o que acontece:
double jointdigits = semilastdigit + lastdigit; // 1.0 + 0.2 = 1.2
Sem nos aprofundarmos na matemática, estamos simplesmente isolando as unidades com os dígitos de um número. Veja bem, uma vez que consideramos apenas 0-9, dividir por um múltiplo de 10 é como criar uma "caixa" onde você a armazena (pense em quando seu professor da primeira série explicou como uma unidade e uma centena eram). Assim:
int finalnumber = (int) (jointdigits*10); // Be sure to use parentheses "()"
E lá vai você. Você transformou uma String de dígitos (neste caso, dois dígitos) em um número inteiro composto por esses dois dígitos, considerando as seguintes limitações:
'0'
o personagem em vez de 48
nunca precisar se preocupe com seu valor numérico real. Terceiro, todo o desvio de double
valores não faz sentido, pois você está dividindo por dez, apenas para multiplicar com dez depois. O resultado simplesmente é semilastdigit * 10 + lastdigit
como aprendemos na escola primária, quando o sistema decimal foi introduzido ...
semilastdigit
e lastdigit
. Como você codificaria sua solução para evitar "ciclos repetitivos" se eu fornecesse uma sequência numérica válida de tamanho arbitrário (por exemplo, qualquer valor entre "-2147483648" e "2147483647"?)
Integer.decode
Você também pode usar public static Integer decode(String nm) throws NumberFormatException
.
Também funciona para as bases 8 e 16:
// base 10
Integer.parseInt("12"); // 12 - int
Integer.valueOf("12"); // 12 - Integer
Integer.decode("12"); // 12 - Integer
// base 8
// 10 (0,1,...,7,10,11,12)
Integer.parseInt("12", 8); // 10 - int
Integer.valueOf("12", 8); // 10 - Integer
Integer.decode("012"); // 10 - Integer
// base 16
// 18 (0,1,...,F,10,11,12)
Integer.parseInt("12",16); // 18 - int
Integer.valueOf("12",16); // 18 - Integer
Integer.decode("#12"); // 18 - Integer
Integer.decode("0x12"); // 18 - Integer
Integer.decode("0X12"); // 18 - Integer
// base 2
Integer.parseInt("11",2); // 3 - int
Integer.valueOf("11",2); // 3 - Integer
Se você deseja obter em int
vez de, Integer
pode usar:
Desembalagem:
int val = Integer.decode("12");
intValue()
:
Integer.decode("12").intValue();
Sempre que houver a menor possibilidade de que a String especificada não contenha um Número Inteiro, você deve lidar com esse caso especial. Infelizmente, os métodos Java padrão Integer::parseInt
e Integer::valueOf
lançamos um NumberFormatException
para sinalizar esse caso especial. Portanto, você deve usar exceções para controle de fluxo, que geralmente é considerado um estilo de codificação ruim.
Na minha opinião, este caso especial deve ser tratado retornando um vazio Optional<Integer>
. Como o Java não oferece esse método, eu uso o seguinte wrapper:
private Optional<Integer> tryParseInteger(String string) {
try {
return Optional.of(Integer.valueOf(string));
} catch (NumberFormatException e) {
return Optional.empty();
}
}
Exemplo de uso:
// prints "12"
System.out.println(tryParseInteger("12").map(i -> i.toString()).orElse("invalid"));
// prints "-1"
System.out.println(tryParseInteger("-1").map(i -> i.toString()).orElse("invalid"));
// prints "invalid"
System.out.println(tryParseInteger("ab").map(i -> i.toString()).orElse("invalid"));
Enquanto isso ainda usa exceções para controle de fluxo internamente, o código de uso fica muito limpo. Além disso, é possível distinguir claramente o caso em que -1
é analisado como um valor válido e o caso em que uma String inválida não pôde ser analisada.
Converter uma string em um int é mais complicado do que apenas converter um número. Você pensou nos seguintes problemas:
Métodos para fazer isso:
1. Integer.parseInt(s)
2. Integer.parseInt(s, radix)
3. Integer.parseInt(s, beginIndex, endIndex, radix)
4. Integer.parseUnsignedInt(s)
5. Integer.parseUnsignedInt(s, radix)
6. Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
7. Integer.valueOf(s)
8. Integer.valueOf(s, radix)
9. Integer.decode(s)
10. NumberUtils.toInt(s)
11. NumberUtils.toInt(s, defaultValue)
Integer.valueOf produz o objeto Inteiro, todos os outros métodos - int primitivo.
Últimos 2 métodos de commons-lang3 e grande artigo sobre a conversão aqui .
Podemos usar o parseInt(String str)
método da Integer
classe wrapper para converter um valor String em um valor inteiro.
Por exemplo:
String strValue = "12345";
Integer intValue = Integer.parseInt(strVal);
A Integer
classe também fornece o valueOf(String str)
método:
String strValue = "12345";
Integer intValue = Integer.valueOf(strValue);
Podemos também usar toInt(String strValue)
de NumberUtils Utility Classe para a conversão:
String strValue = "12345";
Integer intValue = NumberUtils.toInt(strValue);
Use Integer.parseInt(yourString)
.
Lembre-se do seguinte:
Integer.parseInt("1");
// Está bem
Integer.parseInt("-1");
// Está bem
Integer.parseInt("+1");
// Está bem
Integer.parseInt(" 1");
// Exceção (espaço em branco)
Integer.parseInt("2147483648");
// Exceção (número inteiro é limitado a um valor máximo de 2.147.483.647)
Integer.parseInt("1.1");
// Exceção ( . Ou , ou o que não for permitido)
Integer.parseInt("");
// Exceção (não 0 ou algo assim)
Há apenas um tipo de exceção: NumberFormatException
Eu tenho uma solução, mas não sei como é eficaz. Mas funciona bem, e acho que você poderia melhorá-lo. Por outro lado, fiz alguns testes com o JUnit, que foram executados corretamente. Anexei a função e teste:
static public Integer str2Int(String str) {
Integer result = null;
if (null == str || 0 == str.length()) {
return null;
}
try {
result = Integer.parseInt(str);
}
catch (NumberFormatException e) {
String negativeMode = "";
if(str.indexOf('-') != -1)
negativeMode = "-";
str = str.replaceAll("-", "" );
if (str.indexOf('.') != -1) {
str = str.substring(0, str.indexOf('.'));
if (str.length() == 0) {
return (Integer)0;
}
}
String strNum = str.replaceAll("[^\\d]", "" );
if (0 == strNum.length()) {
return null;
}
result = Integer.parseInt(negativeMode + strNum);
}
return result;
}
Testando com JUnit:
@Test
public void testStr2Int() {
assertEquals("is numeric", (Integer)(-5), Helper.str2Int("-5"));
assertEquals("is numeric", (Integer)50, Helper.str2Int("50.00"));
assertEquals("is numeric", (Integer)20, Helper.str2Int("$ 20.90"));
assertEquals("is numeric", (Integer)5, Helper.str2Int(" 5.321"));
assertEquals("is numeric", (Integer)1000, Helper.str2Int("1,000.50"));
assertEquals("is numeric", (Integer)0, Helper.str2Int("0.50"));
assertEquals("is numeric", (Integer)0, Helper.str2Int(".50"));
assertEquals("is numeric", (Integer)0, Helper.str2Int("-.10"));
assertEquals("is numeric", (Integer)Integer.MAX_VALUE, Helper.str2Int(""+Integer.MAX_VALUE));
assertEquals("is numeric", (Integer)Integer.MIN_VALUE, Helper.str2Int(""+Integer.MIN_VALUE));
assertEquals("Not
is numeric", null, Helper.str2Int("czv.,xcvsa"));
/**
* Dynamic test
*/
for(Integer num = 0; num < 1000; num++) {
for(int spaces = 1; spaces < 6; spaces++) {
String numStr = String.format("%0"+spaces+"d", num);
Integer numNeg = num * -1;
assertEquals(numStr + ": is numeric", num, Helper.str2Int(numStr));
assertEquals(numNeg + ": is numeric", numNeg, Helper.str2Int("- " + numStr));
}
}
}
(int) Double.parseDouble(input.replaceAll("[^0-9\\.\\-]", ""));
O Google Guava possui tryParse (String) , que retorna null
se a string não puder ser analisada, por exemplo:
Integer fooInt = Ints.tryParse(fooString);
if (fooInt != null) {
...
}
Você também pode começar removendo todos os caracteres não numéricos e analisando o número inteiro:
String mystr = mystr.replaceAll("[^\\d]", "");
int number = Integer.parseInt(mystr);
Mas lembre-se de que isso funciona apenas para números não negativos.
"4+2"
, terei 42
como resultado, sem nenhuma dica, que o que tentei fazer foi equivocado. O usuário terá a impressão de que inserir expressões básicas como 4+2
uma entrada válida, mas o aplicativo continua com um valor errado. Além disso, o tipo é String
, não string
...
Além das respostas anteriores, gostaria de adicionar várias funções. Estes são os resultados enquanto você os utiliza:
public static void main(String[] args) {
System.out.println(parseIntOrDefault("123", 0)); // 123
System.out.println(parseIntOrDefault("aaa", 0)); // 0
System.out.println(parseIntOrDefault("aaa456", 3, 0)); // 456
System.out.println(parseIntOrDefault("aaa789bbb", 3, 6, 0)); // 789
}
Implementação:
public static int parseIntOrDefault(String value, int defaultValue) {
int result = defaultValue;
try {
result = Integer.parseInt(value);
}
catch (Exception e) {
}
return result;
}
public static int parseIntOrDefault(String value, int beginIndex, int defaultValue) {
int result = defaultValue;
try {
String stringValue = value.substring(beginIndex);
result = Integer.parseInt(stringValue);
}
catch (Exception e) {
}
return result;
}
public static int parseIntOrDefault(String value, int beginIndex, int endIndex, int defaultValue) {
int result = defaultValue;
try {
String stringValue = value.substring(beginIndex, endIndex);
result = Integer.parseInt(stringValue);
}
catch (Exception e) {
}
return result;
}
Como mencionado, o Apache Commons ' NumberUtils
pode fazê-lo. Retorna 0
se não puder converter uma string em um int.
Você também pode definir seu próprio valor padrão:
NumberUtils.toInt(String str, int defaultValue)
Exemplo:
NumberUtils.toInt("3244", 1) = 3244
NumberUtils.toInt("", 1) = 1
NumberUtils.toInt(null, 5) = 5
NumberUtils.toInt("Hi", 6) = 6
NumberUtils.toInt(" 32 ", 1) = 1 // Space in numbers are not allowed
NumberUtils.toInt(StringUtils.trimToEmpty(" 32 ", 1)) = 32;
Você também pode usar esse código, com algumas precauções.
Opção 1: manipule explicitamente a exceção, por exemplo, mostrando uma caixa de diálogo de mensagem e pare a execução do fluxo de trabalho atual. Por exemplo:
try
{
String stringValue = "1234";
// From String to Integer
int integerValue = Integer.valueOf(stringValue);
// Or
int integerValue = Integer.ParseInt(stringValue);
// Now from integer to back into string
stringValue = String.valueOf(integerValue);
}
catch (NumberFormatException ex) {
//JOptionPane.showMessageDialog(frame, "Invalid input string!");
System.out.println("Invalid input string!");
return;
}
Opção 2: redefina a variável afetada se o fluxo de execução puder continuar no caso de uma exceção. Por exemplo, com algumas modificações no bloco catch
catch (NumberFormatException ex) {
integerValue = 0;
}
Usar uma constante de string para comparação ou qualquer tipo de computação é sempre uma boa idéia, porque uma constante nunca retorna um valor nulo.
JOptionPane.showMessageDialog()
a resposta à pergunta sobre baunilha Java não faz sentido.
Integer.valueOf(String);
não retorna o tipo int
.
Você pode usar new Scanner("1244").nextInt()
. Ou pergunte se existe um int:new Scanner("1244").hasNextInt()
Nas competições de programação, onde você tem certeza de que o número sempre será um número inteiro válido, você pode escrever seu próprio método para analisar a entrada. Isso ignorará todo o código relacionado à validação (já que você não precisa disso) e será um pouco mais eficiente.
Para um número inteiro positivo positivo:
private static int parseInt(String str) {
int i, n = 0;
for (i = 0; i < str.length(); i++) {
n *= 10;
n += str.charAt(i) - 48;
}
return n;
}
Para números inteiros positivos e negativos:
private static int parseInt(String str) {
int i=0, n=0, sign=1;
if (str.charAt(0) == '-') {
i = 1;
sign = -1;
}
for(; i<str.length(); i++) {
n* = 10;
n += str.charAt(i) - 48;
}
return sign*n;
}
Se você espera um espaço em branco antes ou depois desses números, faça um str = str.trim()
antes de processar mais.
Simplesmente você pode tentar isso:
Integer.parseInt(your_string);
para converter um String
paraint
Double.parseDouble(your_string);
para converter um String
paradouble
String str = "8955";
int q = Integer.parseInt(str);
System.out.println("Output>>> " + q); // Output: 8955
String str = "89.55";
double q = Double.parseDouble(str);
System.out.println("Output>>> " + q); // Output: 89.55
int foo=Integer.parseInt("1234");
Verifique se não há dados não numéricos na sequência.
Estou um pouco surpreso que ninguém tenha mencionado o construtor Integer que usa String como parâmetro.
Então aqui está:
String myString = "1234";
int i1 = new Integer(myString);
Obviamente, o construtor retornará o tipo Integer
e uma operação de unboxing converte o valor em int
.
É importante mencionar : Este construtor chama o parseInt
método.
public Integer(String var1) throws NumberFormatException {
this.value = parseInt(var1, 10);
}
Use Integer.parseInt () e coloque-o dentro de um try...catch
bloco para manipular quaisquer erros, caso um caractere não numérico seja inserido, por exemplo,
private void ConvertToInt(){
String string = txtString.getText();
try{
int integerValue=Integer.parseInt(string);
System.out.println(integerValue);
}
catch(Exception e){
JOptionPane.showMessageDialog(
"Error converting string to integer\n" + e.toString,
"Error",
JOptionPane.ERROR_MESSAGE);
}
}
Aqui vamos nós
String str="1234";
int number = Integer.parseInt(str);
print number;//1234
Isso pode ser feito de sete maneiras:
import com.google.common.primitives.Ints;
import org.apache.commons.lang.math.NumberUtils;
String number = "999";
1) Usando Ints.tryParse
:
int result = Ints.tryParse(number);
2) Usando NumberUtils.createInteger
:
Integer result = NumberUtils.createInteger(number);
3) Usando NumberUtils.toInt
:
int result = NumberUtils.toInt(number);
4) Usando Integer.valueOf
:
Integer result = Integer.valueOf(number);
5) Usando Integer.parseInt
:
int result = Integer.parseInt(number);
6) Usando Integer.decode
:
int result = Integer.decode(number);
7) Usando Integer.parseUnsignedInt
:
int result = Integer.parseUnsignedInt(number);
Um método é parseInt (String). Retorna um int primitivo:
String number = "10";
int result = Integer.parseInt(number);
System.out.println(result);
O segundo método é valueOf (String) e retorna um novo objeto Integer ():
String number = "10";
Integer result = Integer.valueOf(number);
System.out.println(result);
Você pode usar qualquer um dos seguintes:
Integer.parseInt(s)
Integer.parseInt(s, radix)
Integer.parseInt(s, beginIndex, endIndex, radix)
Integer.parseUnsignedInt(s)
Integer.parseUnsignedInt(s, radix)
Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
Integer.valueOf(s)
Integer.valueOf(s, radix)
Integer.decode(s)
NumberUtils.toInt(s)
NumberUtils.toInt(s, defaultValue)
Este é um programa completo com todas as condições positivas e negativas sem usar uma biblioteca
import java.util.Scanner;
public class StringToInt {
public static void main(String args[]) {
String inputString;
Scanner s = new Scanner(System.in);
inputString = s.nextLine();
if (!inputString.matches("([+-]?([0-9]*[.])?[0-9]+)")) {
System.out.println("Not a Number");
}
else {
Double result2 = getNumber(inputString);
System.out.println("result = " + result2);
}
}
public static Double getNumber(String number) {
Double result = 0.0;
Double beforeDecimal = 0.0;
Double afterDecimal = 0.0;
Double afterDecimalCount = 0.0;
int signBit = 1;
boolean flag = false;
int count = number.length();
if (number.charAt(0) == '-') {
signBit = -1;
flag = true;
}
else if (number.charAt(0) == '+') {
flag = true;
}
for (int i = 0; i < count; i++) {
if (flag && i == 0) {
continue;
}
if (afterDecimalCount == 0.0) {
if (number.charAt(i) - '.' == 0) {
afterDecimalCount++;
}
else {
beforeDecimal = beforeDecimal * 10 + (number.charAt(i) - '0');
}
}
else {
afterDecimal = afterDecimal * 10 + number.charAt(i) - ('0');
afterDecimalCount = afterDecimalCount * 10;
}
}
if (afterDecimalCount != 0.0) {
afterDecimal = afterDecimal / afterDecimalCount;
result = beforeDecimal + afterDecimal;
}
else {
result = beforeDecimal;
}
return result * signBit;
}
}
Integer.parseInt
.