Преобразование строки в int в Groovy


286

У меня есть, Stringкоторый представляет целочисленное значение и хотел бы преобразовать его в int. Есть ли отличный вариант Java Integer.parseInt(String)?


1
почему бы просто не использовать ключевое слово def?
Вездесущий

4
У меня есть строковый параметр, который содержит целое число. Использование def i = string_parameter приводит к исключению приведения класса, если позже я буду использовать i как int.
Стив Куо

Ответы:


492

Используйте toInteger()метод для преобразования Stringв Integer, например,

int value = "99".toInteger()

Альтернативой, которая избегает использования устаревшего метода (см. Ниже), является

int value = "66" as Integer

Если вам нужно проверить, String можно ли конвертировать перед выполнением конвертации, используйте

String number = "66"

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

Обновление об устаревании

В последних версиях Groovy один из toInteger()методов устарел. В 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);
}

Вы можете принудительно вызвать неосуждаемую версию метода, используя что-то ужасное, например:

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

Лично я очень предпочитаю:

int num = 66 as Integer

19
Caveat emptor: вам нужно isInteger()сначала проверить значение с помощью first, потому что toInteger()будет выдано исключение, если строка не является числовой. То же самое относится к toFloat()/isFloat()
Андрес Киевский

8
В документации API 2.1.6 isInteger / toInteger устарели. Какой сейчас лучший способ сделать это тогда?
Пакман

1
Однако использование Integer paramValue = params.int ('paramName') небезопасно. Если на карте параметров нет param с именем «paramName», вы получите исключение, которое не может привести null к int.
Майкл

2
Просто хотел добавить, что начиная с Groovy 1.8 intэто действительно так int. Groovy по-прежнему будет отображать класс Integer из-за бокса, но вы, например, не сможете назначить nullему int, что было возможно в 1.0. Мы сочли это изменение некритическим, поскольку вы уже не могли использовать null в качестве аргумента для параметра вызова метода типа int. Все это по-прежнему отличается от Java, так как в Java вы не можете преобразовать Integer в Long с помощью простого присваивания или вызвать метод int take с Long.
blackdrag

1
@pakman StringGroovyMethods.isInteger(String)и DefaultGroovyMethods.isInteger(CharSequence)не рекомендуется в пользу StringGroovyMethods.isInteger(CharSequence). То же самое и для toInteger().
bmaupin

67

Несколько способов сделать это, этот мой любимый:

def number = '123' as int

10
Та же проблема, что и выше, это вызовет исключение, если строка не является числом. Проверьте isInteger()сначала.
Андрес Киевский

12
@ank вопрос, заданный для эквивалента, Integer.parseInt(String)который также выдает исключение, если строка не является числом, поэтому, учитывая вопрос, я не считаю это «проблемой»
Dónal

30

В качестве дополнения к ответу Дона , не только заводной добавить .toInteger()метод Stringс, он также добавляет toBigDecimal(), toBigInteger(), toBoolean(), toCharacter(), toDouble(), toFloat(), toList(), и toLong().

В том же духе groovy также добавляет is*эквиваленты всем тем, которые возвращаются, trueесли рассматриваемый Stringвопрос может быть проанализирован в рассматриваемом формате.

Соответствующая страница GDK находится здесь.


8
Это правильный ответ - сначала проверьте isInteger(), затем сделайте toInteger()... то есть, если вы не хотите добавлять блок try/ catch:), но использование исключений для этого - плохая идея.
Андрес Киевский

2
@anktastic Я бы сказал, что мой ответ является более правильным, потому что вопрос задан для «отличного эквивалента Java Integer.parseInt (String)», то есть для непроверенного преобразования
Dónal

25

Я не уверен, был ли он введен в последних версиях groovy (первоначальный ответ довольно старый), но теперь вы можете использовать:

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

или

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

Я рекомендую использовать числа с плавающей точкой или даже двойные вместо целых в случае, если указанная строка ненадежна.


2
+1 лучшее решение IMO, поскольку оно включает проверку на
ноль

Я рекомендую не использовать поплавки или двойные, потому что они по своей сути неточны. Как Groovy делает использование BigDecimals так же просто, как и любого другого числа, если вам нужно больше точности, чем целое число, используйте это. Во-вторых, этот подход кажется безопасным, но результат может быть таким, что num == null, поэтому с этим нужно быть осторожным
Ганс Богадс

Для первого примера кода, я думаю, вы хотели написать mystring.toInteger()вместо mystring.toFloat(). Так def num = mystring?.isInteger() ? mystring.toInteger() : nullбыло бы правильно.
Sk8erPeter

15

Ну, Groovy прекрасно принимает форму Java. Если вы спрашиваете, есть ли способ Groovier , есть способ пойти Integer.

Оба показаны здесь:

String s = "99"
assert 99 == Integer.parseInt(s)
Integer i = s as Integer
assert 99 == i

5
Этот ответ также выдает, когда строка не числовая - будьте осторожны!
Андрес Киевский



2

Несколько способов добиться этого. Примеры как ниже

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

Надеюсь это поможет


1
Как это добавляет что-либо к вопросу, которого еще нет в 8 существующих ответах?
LukeG

Мой плохой, немного жадный здесь
Дарт Шекхар




0

Способ использования должен все еще быть toInteger (), потому что это действительно не рекомендуется.

int value = '99'.toInteger()

Версия String устарела, но CharSequence - это интерфейс, который реализует String. Итак, использование String - это нормально, потому что ваш код будет работать, даже если метод будет работать только с CharSequence. То же самое касается isInteger ()

Смотрите этот вопрос для справки: Как преобразовать строку в CharSequence?

Я прокомментировал, потому что понятие устаревшего на этом методе заставило меня запутаться, и я хочу избежать этого для других людей.


-1

Более простой способ преобразования строки в целое число в Groovy заключается в следующем ...

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

Теперь «я» содержит целочисленное значение.


4
Что это добавляет к существующим ответам? Принятый ответ, опубликованный 9 лет назад, начинается с: «Используйте toInteger()метод для конвертации ...
локаль по умолчанию
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.