【问题标题】:Is there an alternative to StringUtils.isNumeric that does what I mean?是否有替代 StringUtils.isNumeric 的方法来实现我的意思?
【发布时间】:2012-06-05 06:10:00
【问题描述】:

StringUtils.isNumeric 对于“”返回 true,对于 7.8 返回 false。这当然是记录在案的行为,但对我来说确实不是最方便的。还有其他东西(最好是在 commons.lang 中)提供 isActuallyNumeric 吗?

【问题讨论】:

  • 3.2.1版本,该方法对空字符串返回false

标签: java apache-commons


【解决方案1】:

NumberUtils.isNumber 已弃用。

你应该使用

NumberUtils.isCreatable

NumberUtils.isParsable

都支持小数点值:

  • NumberUtils.isCreatable 支持十六进制、八进制数字、科学记数法和标有类型限定符的数字(例如 123L)。无效的八进制值将返回 false(例如 09)。如果你想得到它的值,你应该使用NumberUtils.createNumber
  • NumberUtils.isParsable 仅支持0~9 和小数点(.),任何其他字符(例如空格或其他任何内容)都将返回false

顺便说一下,StringUtils.isNumeric 的实现在 commons-lang 和 commons-lang3 之间有些不同。在 commons-lang 中,StringUtils.isNumeric("")true。但是在 commons-lang3 中,StringUtils.isNumeric("")false。您可以通过文档获取更多信息。

【讨论】:

    【解决方案2】:

    org.apache.commons.lang.math.NumberUtils 尝试isNumber(String)

    检查字符串 [is] 是否是有效的 Java 编号。

    有效数字包括用 0x 限定符标记的十六进制, 科学记数法和标有类型限定符的数字(例如 123L)。

    Null 和空字符串将返回 false

    更新 -

    isNumber(String) 现在已弃用。请改用isCreatable(String)

    感谢eav 指出。

    【讨论】:

    • 一些字符串,如 "5.f" 或 "5.d" 将注册为数字(我猜这与 double 或 float 表示法有关),但其他如 "5.x"不会。
    • 这个稍微好点。不幸的是:'+2' 结果不是 isNumber()。
    • 幸运的是,isNumber( "-2" ) 给出了 true
    • 更新:isNumber(String) 在 commons-lang3 3.5 中已弃用,我正在使用 isParseable(String),它工作正常 - 感谢您的提示。
    • 刚刚跳过这个答案,请记住:@deprecated This feature will be removed in Lang 4.0, use {@link NumberUtils#isCreatable(String)} instead
    【解决方案3】:

    这并不完全在 commons.lang 中,但它会起作用。

    try {
        double d = Double.parseDouble(string);
        // string is a number
    } catch (NumberFormatException e) {
        // string is not a number
    }
    

    【讨论】:

    • 此解决方案假定您只在双打域内使用以 10 为底的数字。大多数时候这不是一个坏假设,而且这个解决方案不会创建任何新的依赖项。 +1
    【解决方案4】:

    或者,您可以检查是否有任何字符与这样的非数字匹配..

    if(myStr.replaceAll("^$"," ").matches("[^\\d\\.]")) 那么你就知道里面有些东西不是 0-9 和/或 .

    这是等效的 javascript(修改字符串以进行实验)...

    http://jsfiddle.net/LzZE6/

    【讨论】:

    • 正则表达式不会找到(并拒绝)具有多个小数点的字符串,例如“123.9.1”
    • 我认为你的意思是 "[^\\D\\.]" ...否则你会有一个错误的转义字符序列。
    • @tim bender,是的,对不起......这是一个错字,大写的 D 也是如此
    • 如果数字有那个可选符号怎么办?喜欢 +42.1 或 -16.4
    • 好吧,你可以包含任何你不想寻找的字符,比如 - 和 +,因为这不是一个实际的数字评估器,这完全取决于你认为什么是有效的数字字符.例如,欧洲人使用 , 作为他们的小数点。
    猜你喜欢
    • 2021-04-04
    • 2021-01-22
    • 2021-11-06
    • 2023-03-21
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多