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)?


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

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

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.


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.


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

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)

Zgrabnie, bardzo często zapominam o małych rzeczach.
Magic Octopus Urn


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


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')



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.


-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ą.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.