Перетворення рядка в int в Groovy


286

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


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

4
У мене є параметр рядка, який містить ціле число. Використання def i = string_parameter призводить до виключення класу для класу, якщо я згодом використовую i як int.
Стів Куо

Відповіді:


492

Використовуйте toInteger()метод для перетворення a 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(), тому що toInteger()викине виняток, якщо рядок не буде числовим. Те саме стосується і toFloat()/isFloat()
Андрес Київський

8
У документації 2.1.6 api isInteger / toInteger застарілі. Який тоді найкращий спосіб зробити це?
пакман

1
Використання Integer paramValue = params.int ('paramName') не є безпечним для нуля. Якщо на карті параму немає параму з іменем "paramName", ви отримуєте виняток про не може привести нуль до int.
Майкл

2
просто хотів додати, що оскільки Groovy 1.8 intє насправді int. Groovy все одно відображатиме клас Integer через бокс, але ви, наприклад, не зможете призначити nullйого int, що було можливо в 1.0. Ми вважали, що зміна є некритичною, оскільки ви вже не могли використовувати null як аргумент для параметра виклику методу типу int. Це все ще відрізняється від Java, так як на Java ви не можете перетворити Integer в Long простим завданням або викликати метод взяття int за допомогою 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/ catchblock :), але використовувати винятки для цього - погана ідея.
Андрес Київський

2
@anktastic Я стверджую, що моя відповідь є правильнішою, оскільки в запитанні було запропоновано "важкий еквівалент Java Integer.parseInt (String)", тобто неперевірене перетворення
Dónal

25

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

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

або

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

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


2
+1 найкраще рішення IMO, оскільки воно включає нульову перевірку на додаток до перевірки типу перед перетворенням
kaskelotti

Я не рекомендую використовувати поплавці або дублі, оскільки вони по суті неточні. Оскільки Groovy робить використання BigDecimals так само просто, як і будь-який інший номер, якщо вам потрібна більша точність, ніж цілий, використовуйте це. По-друге, такий підхід здається безпечним, але результат може бути таким, що число == нульовим, тому з цим потрібно бути обережним
Ганс Богардс

Перший зразок коду, я думаю, ви хотіли написати 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()

Тепер "i" утримує ціле значення.


4
Що це додає до існуючих відповідей? Прийнята відповідь, опублікована 9 років тому, починається з: "Використовуйте toInteger()метод для перетворення ...
локальне місце за замовчуванням
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.