我知道这个问题的变体以前经常被问过,但这 并不是 这些问题的 精确 重复。
我想检查a String是否为数字,如果是,我想将其存储为double。有几种方法可以做到这一点,但是所有这些方法似乎都不适合我的目的。
String
double
一种解决方案是使用Double.parseDouble(s)或类似方法new BigDecimal(s)。但是,如果存在逗号,这些解决方案将不起作用(因此,“ 1,234”将导致异常)。在使用这些技术之前,我当然可以删除所有逗号,但是这似乎在其他地区带来了很多问题。
Double.parseDouble(s)
new BigDecimal(s)
我看了Apache Commons NumberUtils.isNumber(s),但是却遇到了同样的逗号问题。
NumberUtils.isNumber(s)
我考虑过NumberFormat或DecimalFormat,但这些似乎太宽容了。例如,“ 1A”被格式化为“ 1”,而不是表示它不是数字。此外,类似“ 127.0.0.1”的内容将被计为数字127,而不是表示它不是数字。
NumberFormat
DecimalFormat
我觉得我的要求不是那么陌生,以至于我是第一个这样做的人,但是没有一个解决方案能够完全满足我的需求。我想我什至不知道我 到底 需要什么(否则我可以编写自己的解析器),但是我知道上述解决方案由于所指出的原因而无法使用。是否存在任何解决方案,或者我需要准确确定我需要什么并为此编写自己的代码?
听起来很怪异,但我会尝试遵循并使用java.util.Scanner。
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");
对于输入,如1A,127.0.0.1,1,234,6.02e-23我得到下面的输出:
1A
127.0.0.1
1,234
6.02e-23
Not a number Not a number 1234 6.02E-23
Scanner.useLocale 可用于更改为所需的语言环境。
Scanner.useLocale