Mam wartość Stringreprezentującą liczbę całkowitą i chciałbym ją przekonwertować na wartość int. Czy istnieje świetny odpowiednik Javy Integer.parseInt(String)?
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
intvalue="99".toInteger()
Alternatywą, która pozwala uniknąć stosowania przestarzałej metody (patrz poniżej), jest
intvalue="66"asInteger
Jeśli chcesz sprawdzić, czy Stringmożna je przekonwertować przed wykonaniem konwersji, użyj
String number ="66"if(number.isInteger()){intvalue= number asInteger}
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
*/publicstaticInteger toInteger(CharSequenceself){returnInteger.valueOf(self.toString().trim());}/**
* @deprecated Use the CharSequence version
* @see #toInteger(CharSequence)
*/@DeprecatedpublicstaticInteger toInteger(Stringself){return toInteger((CharSequence)self);}
Możesz wymusić wywoływanie nieaktualnej wersji metody, używając czegoś okropnego:
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()
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:
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.
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.
+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"assert99==Integer.parseInt(s)Integer i = s asIntegerassert99== i
Sposobem używania powinno być nadal toInteger (), ponieważ tak naprawdę nie jest przestarzałe.
intvalue='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 ()
Odpowiedzi:
Użyj
toInteger()
metody, aby przekonwertować aString
naInteger
npAlternatywą, która pozwala uniknąć stosowania przestarzałej metody (patrz poniżej), jest
Jeśli chcesz sprawdzić, czy
String
można je przekonwertować przed wykonaniem konwersji, użyjAktualizacja wyceny
W najnowszych wersjach Groovy jedna z
toInteger()
metod jest przestarzała. Poniższyorg.codehaus.groovy.runtime.StringGroovyMethods
fragment pochodzi z Groovy 2.4.4Możesz wymusić wywoływanie nieaktualnej wersji metody, używając czegoś okropnego:
Osobiście wolę:
źródło
isInteger()
, ponieważtoInteger()
spowoduje zgłoszenie wyjątku, jeśli ciąg nie jest liczbowy. To samo dotyczytoFloat()
/isFloat()
int
jest rzeczywiścieint
. Groovy nadal wyświetla klasę całkowitą z powodu boksu, ale na przykład nie będziesz mógł przypisaćnull
doint
, 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 typuint
. 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.StringGroovyMethods.isInteger(String)
iDefaultGroovyMethods.isInteger(CharSequence)
są przestarzałe na rzeczStringGroovyMethods.isInteger(CharSequence)
. To samo dotyczytoInteger()
.Kilka sposobów, aby to zrobić, ten jest moim ulubionym:
źródło
isInteger()
najpierw.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”Jako dodatek do odpowiedzi Dona , nie tylko porywające dodać
.toInteger()
metodęString
s, ale również dodajetoBigDecimal()
,toBigInteger()
,toBoolean()
,toCharacter()
,toDouble()
,toFloat()
,toList()
, itoLong()
.W tym samym duchu groovy dodaje również
is*
ekwiwalenty do wszystkich, które powracają,true
jeśli daneString
pytanie można przeanalizować w odpowiednim formacie.Odpowiednia strona GDK jest tutaj.
źródło
isInteger()
, a potem zróbtoInteger()
... to znaczy, chyba że wolisz dodaćtry
/catch
block :), ale użycie wyjątków jest złym pomysłem.Nie jestem pewien, czy został wprowadzony w najnowszych wersjach groovy (początkowa odpowiedź jest dość stara), ale teraz możesz użyć:
lub
Polecam użycie liczb zmiennoprzecinkowych lub nawet podwójnych zamiast liczb całkowitych w przypadku, gdy podany ciąg znaków jest zawodny.
źródło
mystring.toInteger()
zamiast tego chciałeś napisaćmystring.toFloat()
. Takdef num = mystring?.isInteger() ? mystring.toInteger() : null
byłoby poprawne.Cóż, Groovy akceptuje formularz Java. Jeśli pytasz, czy istnieje sposób Grooviera , istnieje sposób, aby przejść do
Integer
.Oba są pokazane tutaj:
źródło
możesz także wykonać import statyczny
i po tym użyciu
źródło
toInteger()
metoda jest dostępna w groovy, możesz jej użyć.źródło
Kilka sposobów na osiągnięcie tego. Przykłady są jak poniżej
Mam nadzieję że to pomoże
źródło
Konwersja stylu Groovy:
Jeśli masz parametr żądania:
źródło
źródło
Oto inny sposób. jeśli nie lubisz wyjątków.
źródło
Sposobem używania powinno być nadal toInteger (), ponieważ tak naprawdę nie jest przestarzałe.
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.
źródło
Prostszy sposób konwersji ciągu na liczbę całkowitą w Groovy jest następujący ...
Teraz „i” przechowuje wartość całkowitą.
źródło
toInteger()
metody do konwersji ...