【问题标题】:Converting a string to int in Groovy在 Groovy 中将字符串转换为 int
【发布时间】:2010-12-15 08:52:41
【问题描述】:

我有一个代表整数值的String,我想将其转换为int。是否有 Java 的 Integer.parseInt(String) 的 groovy 等价物?

【问题讨论】:

  • 为什么不直接使用 def 关键字?
  • 我有一个包含整数的字符串参数。如果我稍后将 i 用作 int,则使用 def i = string_parameter 会导致类转换异常。

标签: groovy


【解决方案1】:

使用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

【讨论】:

  • 请注意:您需要先检查isInteger() 的值,因为如果字符串不是数字,toInteger() 将抛出异常。同样适用于toFloat()/isFloat()
  • 2.1.6 api documentation isInteger/toInteger 中已弃用。那么目前最好的方法是什么?
  • 使用 Integer paramValue = params.int('paramName') 不是空安全的。如果在参数映射中没有名称为“paramName”的参数,您会得到一个异常,即 can't cast null to int。
  • 只是想补充一点,因为 Groovy 1.8 int 确实是 int。由于装箱,Groovy 仍将显示 Integer 类,但您将无法将 null 分配给 int,这在 1.0 中是可能的。我们认为更改不是关键的,因为您已经不能使用 null 作为int 类型的方法调用参数的参数。这一切都与 Java 不同,因为在 Java 中,您不能通过简单的赋值将 Integer 转换为 Long 或使用 Long 调用 int 方法。
  • @pakman StringGroovyMethods.isInteger(String)DefaultGroovyMethods.isInteger(CharSequence)StringGroovyMethods.isInteger(CharSequence) 弃用。 toInteger() 也是如此。
【解决方案2】:

有几种方法,这是我最喜欢的:

def number = '123' as int

【讨论】:

  • 和上面一样的问题,如果字符串不是数字的话会抛出异常。请先与isInteger() 联系。
  • @ank 该问题要求与Integer.parseInt(String) 等效,如果字符串不是数字,它也会抛出异常,所以鉴于这个问题,我不认为这是一个“问题”跨度>
【解决方案3】:

作为Don's answer的补充,groovy不仅给Strings添加了.toInteger()方法,还添加了toBigDecimal()toBigInteger()toBoolean()toCharacter()toDouble()toFloat()toList()toLong()

同样,如果可以将相关的 String 解析为相关格式,则 groovy 还会将 is* 添加到所有返回 true 的等效项。

相关GDK页面is here.

【讨论】:

  • 这是正确的答案 - 首先检查 isInteger(),然后执行 toInteger()... 也就是说,除非您更愿意添加 try/catch 块 :) 但是为此使用异常是个坏主意。
  • @anktastic 我认为我的答案更正确,因为该问题要求“Java 的 Integer.parseInt(String) 的 groovy 等价物”,即未经检查的转换
【解决方案4】:

我不确定它是否是在最近版本的 groovy 中引入的(最初的答案相当陈旧),但现在您可以使用:

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

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

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

【讨论】:

  • +1 最佳解决方案 IMO,因为除了转换前的类型检查外,它还包括空值检查
  • 我建议不要使用浮点数或双精度数,因为它们本质上是不准确的。由于 Groovy 使 BigDecimals 的使用与任何其他 Number 一样容易,如果您需要比 Integer 更高的精度,请使用它。其次,这种方法看起来很安全,但结果可能是 num == null,所以你需要小心
  • 对于第一个示例代码,我猜你想写mystring.toInteger() 而不是mystring.toFloat()。所以def num = mystring?.isInteger() ? mystring.toInteger() : null 是正确的。
【解决方案5】:

好吧,Groovy 可以很好地接受 Java 形式。如果你问有没有Groovier的方法,有方法可以去Integer

两者都显示在这里:

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

【讨论】:

  • 当字符串不是数字时也会抛出这个答案 - 注意!
【解决方案6】:

你也可以进行静态导入

import static java.lang.Integer.parseInt as asInteger

在此之后使用

String s = "99"
asInteger(s)

【讨论】:

  • 很好,我忘记了很多小事。
【解决方案7】:

toInteger() 方法在 groovy 中可用,你可以使用它。

【讨论】:

    【解决方案8】:

    实现这一目标的几种方法。示例如下

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

    希望对你有帮助

    【讨论】:

    • 这如何为 8 个现有答案中尚未出现的问题添加任何内容?
    • 我的错,这里有点贪心
    【解决方案9】:

    Groovy 风格转换:

    Integer num = '589' as Integer
    

    如果你有请求参数:

    Integer age = params.int('age')
    

    【讨论】:

      【解决方案10】:
      def str = "32"
      
      int num = str as Integer
      

      【讨论】:

        【解决方案11】:

        这是另一种方式。如果你不喜欢例外。

        def strnumber = "100"
        def intValue = strnumber.isInteger() ?  (strnumber as int) : null
        

        【讨论】:

        【解决方案12】:

        使用方式应该还是toInteger(),因为它并没有真正被弃用。

        int value = '99'.toInteger()
        

        不推荐使用 String 版本,但 CharSequence 是 String 实现的接口。因此,使用 String 是可以的,因为即使该方法仅适用于 CharSequence,您的代码仍然有效。 isInteger() 也是如此

        请参阅此问题以供参考: How to convert a String to CharSequence?

        我发表了评论,因为此方法中弃用的概念让我感到困惑,我想避免对其他人造成这种影响。

        【讨论】:

          【解决方案13】:

          在 Groovy 中将字符串转换为整数的更简单方法如下...

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

          现在“i”持有整数值。

          【讨论】:

          • 这对现有答案有什么好处? 9 年前发布的公认答案开头是:“使用toInteger() 方法来转换...
          猜你喜欢
          • 2018-11-03
          • 2016-01-25
          • 1970-01-01
          • 2014-03-10
          • 2011-10-02
          • 2011-03-06
          • 1970-01-01
          • 2018-07-05
          相关资源
          最近更新 更多