Eu tenho um parâmetro de string que contém um número inteiro. O uso de def i = string_parameter resulta em exceção de conversão de classe, se depois eu usar i como int.
Steve Kuo
Respostas:
492
Use o toInteger()método para converter um Stringpara um Integer, por exemplo
intvalue="99".toInteger()
Uma alternativa que evita o uso de um método obsoleto (veja abaixo) é
intvalue="66"asInteger
Se você precisar verificar se o Stringpode ser convertido antes de realizar a conversão, use
String number ="66"if(number.isInteger()){intvalue= number asInteger}
Atualização de descontinuação
Nas versões recentes do Groovy, um dos toInteger()métodos foi preterido. O seguinte é retirado do org.codehaus.groovy.runtime.StringGroovyMethodsGroovy 2.4.4
/**
* Parse a CharSequence into an Integer
*
* @param self a CharSequence
* @return an Integer
* @since 1.8.2
*/publicstaticInteger toInteger(CharSequenceself){returnInteger.valueOf(self.toString().trim());}/**
* @deprecated Use the CharSequence version
* @see #toInteger(CharSequence)
*/@DeprecatedpublicstaticInteger toInteger(Stringself){return toInteger((CharSequence)self);}
Você pode forçar a chamada da versão não obsoleta do método usando algo horrível como:
Advertência emptor: você precisa verificar o valor isInteger()primeiro, porque toInteger()lançará uma exceção se a sequência não for numérica. O mesmo se aplica a toFloat()/isFloat()
Andres Kievsky
8
Na documentação da API 2.1.6, isInteger / toInteger está obsoleto. Qual é a melhor maneira atual de fazer isso?
Pakman
1
O uso de Integer paramValue = params.int ('paramName') não é seguro para nulos. Se não houver um parâmetro com o nome "paramName" no mapa de parâmetros, você receberá uma exceção sobre não pode converter nulo para int.
Michael
2
só queria acrescentar que desde Groovy 1.8 inté de fato int. O Groovy ainda exibirá a classe Integer, por causa do boxe, mas você não poderá, por exemplo, atribuir nulla um int, o que foi possível na versão 1.0. Nós consideramos a mudança ser não-crítico, uma vez que já não podia usar null como argumento para um parâmetro de chamada de método do tipo int. Isso ainda é diferente de Java, pois em Java você não pode converter Inteiro em Longo por uma atribuição simples ou chamar um método de tomada int com um Longo.
blackdrag
1
@pakman StringGroovyMethods.isInteger(String)e DefaultGroovyMethods.isInteger(CharSequence)foram preteridos em favor de StringGroovyMethods.isInteger(CharSequence). O mesmo vale para toInteger().
bmaupin
67
Várias maneiras de fazer isso, essa é a minha favorita:
Mesmo problema acima, isso gerará uma exceção se a sequência não for um número. Verifique isInteger()primeiro.
Andres Kievsky
12
@ank a pergunta feita por um equivalente de Integer.parseInt(String)que também lança uma exceção se a cadeia não é um número, então dada a pergunta, eu não considero este um "problema"
Donal
30
Como um adendo a resposta de Don , não só Groovy adicionar um .toInteger()método para Strings, ele também adiciona toBigDecimal(), toBigInteger(), toBoolean(), toCharacter(), toDouble(), toFloat(), toList(), e toLong().
Na mesma linha, o groovy também adiciona is*equivalentes a todos os que retornam truese o Stringem questão puder ser analisado no formato em questão.
Esta é a resposta correta - verifique primeiro com isInteger(), depois faça toInteger()... isto é, a menos que você prefira adicionar um try/ catchbloco :), mas usar exceções para isso é uma má idéia.
Andres Kievsky
2
@anktastic eu diria que a minha resposta é mais correto porque a pergunta feita por um "Groovy equivalente do Java Integer.parseInt (String)", ou seja, uma conversão desmarcada
Donal
25
Não sei se ele foi introduzido nas versões recentes do groovy (a resposta inicial é bastante antiga), mas agora você pode usar:
def num = mystring?.isInteger()? mystring.toInteger():null
ou
def num = mystring?.isFloat()? mystring.toFloat():null
Eu recomendo o uso de carros alegóricos ou mesmo duplos, em vez de números inteiros, se a string fornecida não for confiável.
+1 melhor solução IMO já que inclui verificação nulo, além de verificação de tipo antes da conversão
kaskelotti
Eu recomendo não usar carros alegóricos ou duplos, porque eles são inerentemente imprecisos. Como o Groovy facilita o uso do BigDecimals como qualquer outro número, se você precisar de mais precisão do que um número inteiro, use-o. Em segundo lugar, essa abordagem parece segura, mas o resultado pode ser esse num == null, portanto, você precisa ter cuidado com isso #
Hans Bogaards
Para o primeiro código de exemplo, acho que você queria escrever em mystring.toInteger()vez de mystring.toFloat(). Então, def num = mystring?.isInteger() ? mystring.toInteger() : nullseria correto.
Sk8erPeter
15
Bem, o Groovy aceita perfeitamente o formulário Java. Se você está perguntando se existe uma maneira Groovier , existe uma maneira de seguir Integer.
Ambos são mostrados aqui:
String s ="99"assert99==Integer.parseInt(s)Integer i = s asIntegerassert99== i
A maneira de usar ainda deve ser o toInteger (), porque não é realmente obsoleto.
intvalue='99'.toInteger()
A versão String foi descontinuada, mas o CharSequence é uma interface que uma String implementa. Portanto, o uso de uma String é bom, porque seu código ainda funciona mesmo quando o método só funciona com CharSequence. O mesmo vale para isInteger ()
Respostas:
Use o
toInteger()
método para converter umString
para umInteger
, por exemploUma alternativa que evita o uso de um método obsoleto (veja abaixo) é
Se você precisar verificar se o
String
pode ser convertido antes de realizar a conversão, useAtualização de descontinuação
Nas versões recentes do Groovy, um dos
toInteger()
métodos foi preterido. O seguinte é retirado doorg.codehaus.groovy.runtime.StringGroovyMethods
Groovy 2.4.4Você pode forçar a chamada da versão não obsoleta do método usando algo horrível como:
Pessoalmente, eu prefiro muito:
fonte
isInteger()
primeiro, porquetoInteger()
lançará uma exceção se a sequência não for numérica. O mesmo se aplica atoFloat()
/isFloat()
int
é de fatoint
. O Groovy ainda exibirá a classe Integer, por causa do boxe, mas você não poderá, por exemplo, atribuirnull
a umint
, o que foi possível na versão 1.0. Nós consideramos a mudança ser não-crítico, uma vez que já não podia usar null como argumento para um parâmetro de chamada de método do tipoint
. Isso ainda é diferente de Java, pois em Java você não pode converter Inteiro em Longo por uma atribuição simples ou chamar um método de tomada int com um Longo.StringGroovyMethods.isInteger(String)
eDefaultGroovyMethods.isInteger(CharSequence)
foram preteridos em favor deStringGroovyMethods.isInteger(CharSequence)
. O mesmo vale paratoInteger()
.Várias maneiras de fazer isso, essa é a minha favorita:
fonte
isInteger()
primeiro.Integer.parseInt(String)
que também lança uma exceção se a cadeia não é um número, então dada a pergunta, eu não considero este um "problema"Como um adendo a resposta de Don , não só Groovy adicionar um
.toInteger()
método paraString
s, ele também adicionatoBigDecimal()
,toBigInteger()
,toBoolean()
,toCharacter()
,toDouble()
,toFloat()
,toList()
, etoLong()
.Na mesma linha, o groovy também adiciona
is*
equivalentes a todos os que retornamtrue
se oString
em questão puder ser analisado no formato em questão.A página relevante do GDK está aqui.
fonte
isInteger()
, depois façatoInteger()
... isto é, a menos que você prefira adicionar umtry
/catch
bloco :), mas usar exceções para isso é uma má idéia.Não sei se ele foi introduzido nas versões recentes do groovy (a resposta inicial é bastante antiga), mas agora você pode usar:
ou
Eu recomendo o uso de carros alegóricos ou mesmo duplos, em vez de números inteiros, se a string fornecida não for confiável.
fonte
mystring.toInteger()
vez demystring.toFloat()
. Então,def num = mystring?.isInteger() ? mystring.toInteger() : null
seria correto.Bem, o Groovy aceita perfeitamente o formulário Java. Se você está perguntando se existe uma maneira Groovier , existe uma maneira de seguir
Integer
.Ambos são mostrados aqui:
fonte
Também você pode fazer importação estática
e após esse uso
fonte
toInteger()
está disponível no groovy, você pode usar isso.fonte
Várias maneiras de conseguir isso. Exemplos são como abaixo
Espero que isto ajude
fonte
Conversão de estilo Groovy:
Se você tiver um parâmetro de solicitação:
fonte
fonte
Aqui está o outro caminho. se você não gosta de exceções.
fonte
A maneira de usar ainda deve ser o toInteger (), porque não é realmente obsoleto.
A versão String foi descontinuada, mas o CharSequence é uma interface que uma String implementa. Portanto, o uso de uma String é bom, porque seu código ainda funciona mesmo quando o método só funciona com CharSequence. O mesmo vale para isInteger ()
Veja esta pergunta para referência: Como converter uma String em CharSequence?
Comentei, porque a noção de obsoleto nesse método me confundiu e quero evitar isso para outras pessoas.
fonte
A maneira mais simples de converter uma string em número inteiro no Groovy é a seguinte ...
Agora "i" contém o valor inteiro.
fonte
toInteger()
método para converter ...