小编典典

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

java

有没有比这更好,更优雅(和/或更快)的方式

boolean isNumber = false;
try{
   Double.valueOf(myNumber);
   isNumber = true;
} catch (NumberFormatException e) {
}

…?


编辑 :因为我不能选择两个答案,所以我要使用正则表达式,因为a)很优雅,并且b)说“ Jon Skeet解决了问题”是一种重言式,因为Jon
Skeet自己就是所有问题的解决方案。


阅读 146

收藏
2020-11-13

共1个答案

小编典典

我不认为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”或十六进制值。是否要通过这些取决于上下文。

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

2020-11-13