java - 检测字符串是否为数字的最优雅方法?

标签 java string parsing numbers

是否有比

更好、更优雅(和/或可能更快)的方式
boolean isNumber = false;
try{
   Double.valueOf(myNumber);
   isNumber = true;
} catch (NumberFormatException e) {
}

...?


编辑: 由于我无法选择两个答案,所以我选择正则表达式,因为 a) 它很优雅,b) 说“Jon Skeet 解决了问题”是同义反复,因为 Jon Skeet 本人就是所有问题的解决方案。

最佳答案

我认为 Java 中没有任何内置的东西可以更快且仍然可靠地完成它,假设稍后您会想要使用 Double.valueOf(或类似的)实际解析它。

我会使用 Double.parseDouble 而不是 Double.valueOf 来避免不必要地创建 Double,并且您还可以通过检查数字比异常更快地摆脱公然愚蠢的数字,e/E,- 和。预先。所以,像这样:

public boolean isDouble(String value)
{        
    boolean seenDot = false;
    boolean seenExp = false;
    boolean justSeenExp = false;
    boolean seenDigit = false;
    for (int i=0; i < value.length(); i++)
    {
        char c = value.charAt(i);
        if (c >= '0' && c <= '9')
        {
            seenDigit = true;
            continue;
        }
        if ((c == '-' || c=='+') && (i == 0 || justSeenExp))
        {
            continue;
        }
        if (c == '.' && !seenDot)
        {
            seenDot = true;
            continue;
        }
        justSeenExp = false;
        if ((c == 'e' || c == 'E') && !seenExp)
        {
            seenExp = true;
            justSeenExp = true;
            continue;
        }
        return false;
    }
    if (!seenDigit)
    {
        return false;
    }
    try
    {
        Double.parseDouble(value);
        return true;
    }
    catch (NumberFormatException e)
    {
        return false;
    }
}

请注意,尽管进行了几次尝试,这个仍然不包含“NaN”或十六进制值。您是否希望它们通过取决于上下文。

根据我的经验,正则表达式比上面的硬编码检查要慢。

关于java - 检测字符串是否为数字的最优雅方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/359625/

相关文章:

java - 消息源找不到 key

java - 在 CentOS Linux 上从 Tomcat 访问 Tensorflow

java - 如何检查是否按下了大写锁定键?

c - 从文件中读取多行到 C 中的字符串

mysql - 在 MySQL 上用 pdo 替换字符串

python - 如何在 Python 和 LXML 中解析 XML?

java - 将 java.sql.Timestamp 格式化为字符串

r - 字符串作为R中的函数参数

json - 如何跳过 JSON 对象流中的 'noise'?

android - ParseQuery Android - 获取项目的位置