在Groovy中将字符串转换为整数

329

我有一个代表整数值的String,希望将其转换为int。是否有Groovy等效于Java的Integer.parseInt(String)


1
为什么不直接使用def关键字呢? - Omnipresent
5
我有一个字符串参数,其中包含一个整数。使用“def i = string_parameter”会导致类转换异常,如果我稍后将i用作整数。 - Steve Kuo
13个回答

566
使用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() 方法已被废弃。以下内容摘自 Groovy 2.4.4 中的 org.codehaus.groovy.runtime.StringGroovyMethods

/**
 * 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

21
购买者注意:在使用toInteger()之前,您需要先使用isInteger()方法检查值,因为如果字符串不是数字,toInteger()会抛出异常。同样的规则适用于toFloat()/isFloat()方法。 - Andres Kievsky
8
2.1.6 api文档中,isInteger/toInteger已被弃用。那么目前最好的方法是什么? - pakman
1
使用Integer paramValue = params.int('paramName')并不是空安全的。如果参数映射中没有名为“paramName”的参数,则会出现无法将null转换为int的异常。 - Michael
2
只想补充一下,自从Groovy 1.8以来 int 的确就是 int。由于装箱,Groovy仍会显示Integer类,但例如您将不能将 null 分配给 int,相比1.0版本,这个变更被认为是非关键的。因为您已经不能将null用作类型为 int 的方法调用参数的参数。这仍然与Java不同,因为在Java中,您无法通过简单的赋值将Integer转换为Long,或使用Long调用接受int参数的方法。 - blackdrag
1
@pakman StringGroovyMethods.isInteger(String)DefaultGroovyMethods.isInteger(CharSequence) 已被弃用,推荐使用 StringGroovyMethods.isInteger(CharSequence)toInteger() 同样如此。 - bmaupin
显示剩余3条评论

74

有几种方法可以实现,以下是我最喜欢的方法:

def number = '123' as int

11
与上述问题相同,如果字符串不是数字,这段代码会引发异常。请先使用isInteger()进行检查。 - Andres Kievsky
14
问题要求与Integer.parseInt(String)等效的方法,如果字符串不是数字,则还会抛出异常。因此,根据问题描述,我认为这并不是一个“问题”。 - Dónal
我相信这就是Groovy想要的方式。通常你可以使用'as'作为任何类型的转换(有时候你可能需要附加一个转换方法,比如如果你真的想把JFrame转换成Boolean或者其他疯狂的东西)。 - Bill K

32
作为对唐氏答案的补充,不仅 groovy 为 String 类型添加了 .toInteger() 方法,还添加了 toBigDecimal()toBigInteger()toBoolean()toCharacter()toDouble()toFloat()toList()toLong() 方法。
同样地,groovy 还为所有这些方法添加了 is* 的等效方法,如果查询的 String 可以解析成相应的格式,则返回 true
相关的 GDK 页面在此处

8
这是正确的答案——首先使用 isInteger() 进行检查,然后再进行 toInteger() 转换……除非你更愿意添加 try/catch 块 :) 但是,对于这个问题使用异常是不好的做法。 - Andres Kievsky
2
@anktastic 我认为我的答案更正确,因为问题要求“一个Groovy等价于Java的Integer.parseInt(String)”,即一个未经检查的转换。 - Dónal

27

我不确定它是否在最近的 Groovy 版本中引入(初始答案相当古老),但现在你可以使用:

def num = mystring?.isInteger() ? mystring.toInteger() : null
或者
def num = mystring?.isFloat() ? mystring.toFloat() : null

如果提供的字符串不可靠,我建议使用浮点数甚至双精度浮点数而不是整数。


3
在我看来,+1 最佳解决方案,因为它在转换之前进行了空值检查和类型检查。 - kaskelotti
我建议不要使用浮点数或双精度数,因为它们本质上是不准确的。由于Groovy使得使用BigDecimals和其他数字一样容易,如果您需要比整数更高的精度,请使用它。其次,这种方法似乎很安全,但结果可能是num == null,所以您需要小心处理。 - Hans Bogaards
对于第一个示例代码,我猜你想写的是 mystring.toInteger() 而不是 mystring.toFloat()。因此,def num = mystring?.isInteger() ? mystring.toInteger() : null 才是正确的写法。 - Sk8erPeter

18

好的,Groovy 可以很好地接受 Java 表单。如果您想知道是否有更“Groovier”的方法,可以使用 Integer 的方式。

两种方法都在这里展示:

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

5
当字符串不是数字时,此答案也会抛出异常 - 注意! - Andres Kievsky

7
你也可以进行静态导入。
import static java.lang.Integer.parseInt as asInteger

并且在此之后使用。
String s = "99"
asInteger(s)

很好,我经常会忘记一些小细节。 - Magic Octopus Urn

3

toInteger() 方法在 Groovy 中可用,您可以使用它。


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
我的错,这里有点贪心了。 - Darth Shekhar

1
def str = "32"

int num = str as Integer

1

Groovy风格转换:

Integer num = '589' as Integer

如果您有请求参数:

Integer age = params.int('age')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接