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
.
java
string
int
type-conversion
Usuário desconhecido
fonte
fonte
Respostas:
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:(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 8Optional
, cria uma maneira poderosa e concisa de converter uma string em um int:fonte
int foo = NumberUtils.toInt(myString, 0);
Por exemplo, aqui estão duas maneiras:
Há uma pequena diferença entre estes métodos:
valueOf
retorna uma instância nova ou em cache dejava.lang.Integer
parseInt
retorna primitivoint
.O mesmo é para todos os casos:
Short.valueOf
/parseShort
,Long.valueOf
/parseLong
, etc.fonte
valueOf
o método é justo #return valueOf(parseInt(string));
valueOf
chama-se recursivamente?valueOf(String)
é implementado analisando primeiro a String para um int usandoparseInt(String)
e depois agrupando esse int em um número inteiro usandovalueOf(int)
. Nenhuma recursão aqui porquevalueOf(String)
evalueOf(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 .
É importante lidar com essa exceção ao tentar obter valores inteiros a partir de argumentos de divisão ou analisar algo dinamicamente.
fonte
"([0-9]+)"
"captura" a primeira sequência de um ou mais dígitos de um a nove. Veja aMatcher
classe nesse pacote.Faça manualmente:
fonte
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 :
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.
API do Apache NumberUtils versão 3.4
fonte
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 simplescharAt
resolveu:Tendo os códigos, precisamos apenas olhar para a tabela e fazer os ajustes necessários:
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:Isso é apenas brincar com números. Estávamos transformando o último dígito em um decimal. Mas agora, veja o que acontece:
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:
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:
fonte
'0'
o personagem em vez de48
nunca precisar se preocupe com seu valor numérico real. Terceiro, todo o desvio dedouble
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
elastdigit
. 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:
Se você deseja obter em
int
vez de,Integer
pode usar:Desembalagem:
intValue()
:fonte
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
eInteger::valueOf
lançamos umNumberFormatException
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:Exemplo de uso:
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.fonte
Converter uma string em um int é mais complicado do que apenas converter um número. Você pensou nos seguintes problemas:
fonte
Métodos para fazer isso:
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 .
fonte
Podemos usar o
parseInt(String str)
método daInteger
classe wrapper para converter um valor String em um valor inteiro.Por exemplo:
A
Integer
classe também fornece ovalueOf(String str)
método:Podemos também usar
toInt(String strValue)
de NumberUtils Utility Classe para a conversão:fonte
Use
Integer.parseInt(yourString)
.Lembre-se do seguinte:
Integer.parseInt("1");
// Está bemInteger.parseInt("-1");
// Está bemInteger.parseInt("+1");
// Está bemInteger.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
fonte
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:
Testando com JUnit:
fonte
(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:fonte
Você também pode começar removendo todos os caracteres não numéricos e analisando o número inteiro:
Mas lembre-se de que isso funciona apenas para números não negativos.
fonte
-42
que seja analisado como42
."4+2"
, terei42
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 como4+2
uma entrada válida, mas o aplicativo continua com um valor errado. Além disso, o tipo éString
, nãostring
...Além das respostas anteriores, gostaria de adicionar várias funções. Estes são os resultados enquanto você os utiliza:
Implementação:
fonte
Como mencionado, o Apache Commons '
NumberUtils
pode fazê-lo. Retorna0
se não puder converter uma string em um int.Você também pode definir seu próprio valor padrão:
Exemplo:
fonte
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:
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
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.
fonte
JOptionPane.showMessageDialog()
a resposta à pergunta sobre baunilha Java não faz sentido.Integer.valueOf(String);
não retorna o tipoint
.Você pode usar
new Scanner("1244").nextInt()
. Ou pergunte se existe um int:new Scanner("1244").hasNextInt()
fonte
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:
Para números inteiros positivos e negativos:
Se você espera um espaço em branco antes ou depois desses números, faça um
str = str.trim()
antes de processar mais.fonte
Simplesmente você pode tentar isso:
Integer.parseInt(your_string);
para converter umString
paraint
Double.parseDouble(your_string);
para converter umString
paradouble
Exemplo
fonte
Para uma sequência normal, você pode usar:
Para um construtor String e um buffer String, você pode usar:
fonte
Verifique se não há dados não numéricos na sequência.
fonte
Estou um pouco surpreso que ninguém tenha mencionado o construtor Integer que usa String como parâmetro.
Então aqui está:
Java 8 - Inteiro (String) .
Obviamente, o construtor retornará o tipo
Integer
e uma operação de unboxing converte o valor emint
.É importante mencionar : Este construtor chama o
parseInt
método.fonte
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,fonte
Aqui vamos nós
fonte
Isso pode ser feito de sete maneiras:
1) Usando
Ints.tryParse
:2) Usando
NumberUtils.createInteger
:3) Usando
NumberUtils.toInt
:4) Usando
Integer.valueOf
:5) Usando
Integer.parseInt
:6) Usando
Integer.decode
:7) Usando
Integer.parseUnsignedInt
:fonte
Um método é parseInt (String). Retorna um int primitivo:
O segundo método é valueOf (String) e retorna um novo objeto Integer ():
fonte
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)
fonte
Este é um programa completo com todas as condições positivas e negativas sem usar uma biblioteca
fonte
Integer.parseInt
.