Konwertowanie ciągu na int w Groovy

286

Mam wartość Stringreprezentującą liczbę całkowitą i chciałbym ją przekonwertować na wartość int. Czy istnieje świetny odpowiednik Javy Integer.parseInt(String)?

Steve Kuo
źródło
1
dlaczego po prostu nie użyć słowa kluczowego def?
Wszechobecny
4
Mam parametr ciągu, który zawiera liczbę całkowitą. Użycie def i = string_parameter powoduje wyjątek rzutowania klas, jeśli później użyję i jako int.
Steve Kuo,

Odpowiedzi:

492

Użyj toInteger()metody, aby przekonwertować a Stringna Integernp

int value = "99".toInteger()

Alternatywą, która pozwala uniknąć stosowania przestarzałej metody (patrz poniżej), jest

int value = "66" as Integer

Jeśli chcesz sprawdzić, czy String można je przekonwertować przed wykonaniem konwersji, użyj

String number = "66"

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

Aktualizacja wyceny

W najnowszych wersjach Groovy jedna z toInteger()metod jest przestarzała. Poniższy org.codehaus.groovy.runtime.StringGroovyMethodsfragment pochodzi z Groovy 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);
}

Możesz wymusić wywoływanie nieaktualnej wersji metody, używając czegoś okropnego:

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

Osobiście wolę:

int num = 66 as Integer
Dónal
źródło
19
Zastrzegający emptor: musisz najpierw sprawdzić wartość isInteger(), ponieważ toInteger()spowoduje zgłoszenie wyjątku, jeśli ciąg nie jest liczbowy. To samo dotyczy toFloat()/isFloat()
Andres Kievsky
8
W dokumentacji interfejsu API 2.1.6 isInteger / toInteger są przestarzałe. Jaki jest obecnie najlepszy sposób, aby to zrobić?
pakman
1
Użycie liczby całkowitej paramValue = params.int ('paramName') nie jest jednak bezpieczne. Jeśli na mapie param nie ma parametru o nazwie „paramName”, pojawia się wyjątek, że nie można ustawić wartości null na int.
Michael
2
chciałem tylko dodać, że skoro Groovy 1.8 intjest rzeczywiście int. Groovy nadal wyświetla klasę całkowitą z powodu boksu, ale na przykład nie będziesz mógł przypisać nulldo int, co było możliwe w 1.0. Rozważaliśmy zmianę będąc non-krytyczna, ponieważ już nie przydałby null jako argumentu dla parametru metoda połączenia typu int. Wszystko to wciąż różni się od Javy, ponieważ w Javie nie można przekonwertować liczby całkowitej na Long za pomocą zwykłego przypisania ani wywołać metody przejmowania int z Long.
blackdrag
1
@pakman StringGroovyMethods.isInteger(String)i DefaultGroovyMethods.isInteger(CharSequence)są przestarzałe na rzecz StringGroovyMethods.isInteger(CharSequence). To samo dotyczy toInteger().
bmaupin,
67

Kilka sposobów, aby to zrobić, ten jest moim ulubionym:

def number = '123' as int
Esko
źródło
10
Ten sam problem, co powyżej, spowoduje zgłoszenie wyjątku, jeśli ciąg nie jest liczbą. Sprawdź isInteger()najpierw.
Andres Kievsky
12
@ zakwestionowano pytanie, którego ekwiwalent Integer.parseInt(String)generuje również wyjątek, jeśli ciąg nie jest liczbą, więc biorąc pod uwagę pytanie, nie uważam tego za „problem”
Dónal,
30

Jako dodatek do odpowiedzi Dona , nie tylko porywające dodać .toInteger()metodę Strings, ale również dodaje toBigDecimal(), toBigInteger(), toBoolean(), toCharacter(), toDouble(), toFloat(), toList(), i toLong().

W tym samym duchu groovy dodaje również is*ekwiwalenty do wszystkich, które powracają, truejeśli dane Stringpytanie można przeanalizować w odpowiednim formacie.

Odpowiednia strona GDK jest tutaj.

Electrons_Ahoy
źródło
8
To poprawna odpowiedź - najpierw sprawdź isInteger(), a potem zrób toInteger()... to znaczy, chyba że wolisz dodać try/ catchblock :), ale użycie wyjątków jest złym pomysłem.
Andres Kievsky
2
@anktastic Twierdzę, że moja odpowiedź jest bardziej poprawna, ponieważ pytanie brzmiało „groovy odpowiednik Integer.parseInt (String) Javy”, tj. niesprawdzoną konwersję
Dónal
25

Nie jestem pewien, czy został wprowadzony w najnowszych wersjach groovy (początkowa odpowiedź jest dość stara), ale teraz możesz użyć:

def num = mystring?.isInteger() ? mystring.toInteger() : null

lub

def num = mystring?.isFloat() ? mystring.toFloat() : null

Polecam użycie liczb zmiennoprzecinkowych lub nawet podwójnych zamiast liczb całkowitych w przypadku, gdy podany ciąg znaków jest zawodny.

Shmaperator
źródło
2
+1 najlepsze rozwiązanie IMO, ponieważ zawiera kontrolę zerową oprócz sprawdzania typu przed konwersją
kaskelotti
Odradzam używanie pływaków lub dublerów, ponieważ są one z natury niedokładne. Ponieważ Groovy sprawia, że ​​korzystanie z BigDecimals jest tak proste, jak każda inna liczba, jeśli potrzebujesz większej dokładności niż liczba całkowita, użyj tego. Po drugie, takie podejście wydaje się bezpieczne, ale rezultatem może być num == null, więc musisz być ostrożny
Hans Bogaards
W przypadku pierwszego przykładowego kodu myślę, że mystring.toInteger()zamiast tego chciałeś napisać mystring.toFloat(). Tak def num = mystring?.isInteger() ? mystring.toInteger() : nullbyłoby poprawne.
Sk8erPeter
15

Cóż, Groovy akceptuje formularz Java. Jeśli pytasz, czy istnieje sposób Grooviera , istnieje sposób, aby przejść do Integer.

Oba są pokazane tutaj:

String s = "99"
assert 99 == Integer.parseInt(s)
Integer i = s as Integer
assert 99 == i
Michael Easter
źródło
5
Ta odpowiedź pojawia się także wtedy, gdy ciąg nie jest numeryczny - uważaj!
Andres Kievsky,
6

możesz także wykonać import statyczny

import static java.lang.Integer.parseInt as asInteger

i po tym użyciu

String s = "99"
asInteger(s)
Andrey
źródło
Zgrabnie, bardzo często zapominam o małych rzeczach.
Magic Octopus Urn
3

toInteger() metoda jest dostępna w groovy, możesz jej użyć.

Aakarsh Gupta
źródło
2

Kilka sposobów na osiągnięcie tego. Przykłady są jak poniżej

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

Mam nadzieję że to pomoże

Darth Shekhar
źródło
1
Jak to dodaje coś do pytania, którego nie ma jeszcze w 8 istniejących odpowiedziach?
LukeG
Mój zły, stał się tu trochę chciwy
Darth Shekhar
1

Konwersja stylu Groovy:

Integer num = '589' as Integer

Jeśli masz parametr żądania:

Integer age = params.int('age')
Sagar Mal Shankhala
źródło
1
def str = "32"

int num = str as Integer
ratzip
źródło
0

Oto inny sposób. jeśli nie lubisz wyjątków.

def strnumber = "100"
def intValue = strnumber.isInteger() ?  (strnumber as int) : null
Berhanu Tarekegn
źródło
Myślę, że to ta sama odpowiedź jak # 16877253 autor: @Shmaperator
MarkHu
0

Sposobem używania powinno być nadal toInteger (), ponieważ tak naprawdę nie jest przestarzałe.

int value = '99'.toInteger()

Wersja String jest przestarzała, ale CharSequence to interfejs, który implementuje String. Tak więc użycie String jest w porządku, ponieważ Twój kod będzie nadal działał, nawet jeśli metoda będzie działać tylko z CharSequence. To samo dotyczy isInteger ()

Zobacz to pytanie w celach informacyjnych: Jak przekonwertować ciąg znaków na CharSequence?

Skomentowałem, ponieważ pojęcie przestarzałej tej metody wprawiło mnie w zakłopotanie i chcę tego uniknąć dla innych ludzi.

Math Morn
źródło
-1

Prostszy sposób konwersji ciągu na liczbę całkowitą w Groovy jest następujący ...

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

Teraz „i” przechowuje wartość całkowitą.

srinivasan
źródło
4
Co to dodaje do istniejących odpowiedzi? Przyjęta odpowiedź opublikowana 9 lat temu zaczyna się od: „Użyj toInteger()metody do konwersji ...
domyślne ustawienia narodowe