确定String是否为数字并使用Java进行转换?

Mic*_*wan 24 java numbers bigdecimal string-parsing

我知道这个问题的变种频繁之前(见已被要求在这里这里的实例),但是这不是一个确切的重复.

我想检查a String是否是数字,如果是,我想将其存储为double.有几种方法可以做到这一点,但所有这些方法似乎都不适合我的目的.

一种解决方案是使用Double.parseDouble(s)或类似new BigDecimal(s).但是,如果存在逗号,则这些解决方案不起作用(因此"1,234"会导致异常).我当然可以使用这些技术之前去掉所有的逗号,但这似乎不会造成在其他语言环境的问题负载.

我查看了Apache Commons NumberUtils.isNumber(s),但是它遇到了同样的逗号问题.

我认为NumberFormat还是DecimalFormat,但这些似乎过于宽松.例如,"1A"被格式化为"1"而不是表示它不是数字.此外,像"127.0.0.1"这样的东西将被计为数字127而不是表示它不是数字.

我觉得我的要求不是那么奇特,我是第一个这样做,但没有一个解决方案完全符合我的要求.我想即使我不确切知道我需要什么(否则我可以编写自己的解析器),但我知道上述解决方案因指示的原因不起作用.是否存在任何解决方案,或者我是否需要准确弄清楚我需要什么并为其编写自己的代码?

Giu*_*lli 15

听起来很奇怪,但我会尝试按照这个答案使用java.util.Scanner.

Scanner scanner = new Scanner(input);
if (scanner.hasNextInt())
    System.out.println(scanner.nextInt());
else if (scanner.hasNextDouble())
    System.out.println(scanner.nextDouble());
else
    System.out.println("Not a number");
Run Code Online (Sandbox Code Playgroud)

对于输入,如1A,127.0.0.1,1,234,6.02e-23我得到下面的输出:

Not a number
Not a number
1234
6.02E-23
Run Code Online (Sandbox Code Playgroud)

Scanner.useLocale 可用于更改为所需的区域设置.

  • 之前没有看过扫描仪......整洁.但是,如果你通过"1 A"扫描仪单词分离会给你多个令牌,你所拥有的就会失败.因此,您需要修改上面的内容,以便在hasNextInt和hasNextDouble上设置数字'n',跳过最后的else,然后使用单独的if语句来查看扫描程序是否有任何后续标记,ala n!= null && scanner.hasNext().这个和ParsePosition都允许前导和尾随空格 - 所以这仍然是一个适当的操作处理,但有了这些修复,我认为你有一个很好的解决方案. (2认同)