Convertendo uma string para int no Groovy

286

Eu tenho um Stringque representa um valor inteiro e gostaria de convertê-lo em um int. Existe um equivalente groovy do Java Integer.parseInt(String)?

Steve Kuo
fonte
1
por que não usar apenas a palavra-chave def?
Onipresente
4
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

int value = "99".toInteger()

Uma alternativa que evita o uso de um método obsoleto (veja abaixo) é

int value = "66" as Integer

Se você precisar verificar se o String pode ser convertido antes de realizar a conversão, use

String number = "66"

if (number.isInteger()) {
  int value = number as Integer
}

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
 */
public static Integer toInteger(CharSequence self) {
    return Integer.valueOf(self.toString().trim());
}

/**
 * @deprecated Use the CharSequence version
 * @see #toInteger(CharSequence)
 */
@Deprecated
public static Integer toInteger(String self) {
    return toInteger((CharSequence) self);
}

Você pode forçar a chamada da versão não obsoleta do método usando algo horrível como:

int num = ((CharSequence) "66").toInteger()

Pessoalmente, eu prefiro muito:

int num = 66 as Integer
Dónal
fonte
19
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:

def number = '123' as int
Esko
fonte
10
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.

A página relevante do GDK está aqui.

Electrons_Ahoy
fonte
8
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.

Shmaperator
fonte
2
+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"
assert 99 == Integer.parseInt(s)
Integer i = s as Integer
assert 99 == i
Michael Easter
fonte
5
Esta resposta também é lançada quando a string não é numérica - cuidado!
Andres Kievsky
6

Também você pode fazer importação estática

import static java.lang.Integer.parseInt as asInteger

e após esse uso

String s = "99"
asInteger(s)
Andrey
fonte
Legal, eu esqueço muito as pequenas coisas.
Magic Octopus Urn
3

toInteger() está disponível no groovy, você pode usar isso.

Aakarsh Gupta
fonte
2

Várias maneiras de conseguir isso. Exemplos são como abaixo

a. return "22".toInteger()
b. if("22".isInteger()) return "22".toInteger()
c. return "22" as Integer()
d. return Integer.parseInt("22")

Espero que isto ajude

Darth Shekhar
fonte
1
Como isso adiciona algo à pergunta que ainda não está presente nas 8 respostas existentes?
LukeG 23/02
Meu mau, ficou um pouco ganancioso aqui
Darth Shekhar
1

Conversão de estilo Groovy:

Integer num = '589' as Integer

Se você tiver um parâmetro de solicitação:

Integer age = params.int('age')
Sagar Mal Shankhala
fonte
1
def str = "32"

int num = str as Integer
ratzip
fonte
0

Aqui está o outro caminho. se você não gosta de exceções.

def strnumber = "100"
def intValue = strnumber.isInteger() ?  (strnumber as int) : null
Berhanu Tarekegn
fonte
Penso que esta é a mesma resposta que # 16877253 por @Shmaperator
MarkHu
0

A maneira de usar ainda deve ser o toInteger (), porque não é realmente obsoleto.

int value = '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 ()

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.

Math Morn
fonte
-1

A maneira mais simples de converter uma string em número inteiro no Groovy é a seguinte ...

String aa="25"
int i= aa.toInteger()

Agora "i" contém o valor inteiro.

srinivasan
fonte
4
O que isso acrescenta às respostas existentes? A resposta aceita postada há 9 anos começa com: "Use o toInteger()método para converter ...
localidade padrão