确定字符串是否是一个数字并在Java中转换?

2022-09-01 20:29:56

我知道这个问题的变体以前经常被问到(例如,请参阅此处此处),但这并不是这些变体的精确副本。

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

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

我看了Apache Commons,但也有同样的逗号问题。NumberUtils.isNumber(s)

我考虑过或,但这些似乎太宽松了。例如,“1A”被格式化为“1”,而不是表示它不是一个数字。此外,像“127.0.0.1”这样的东西将被计为数字127,而不是指示它不是一个数字。NumberFormatDecimalFormat

我觉得我的要求不是那么奇特,我是第一个这样做的人,但没有一个解决方案能完全满足我的需求。我想即使我也不知道我需要什么(否则我可以编写自己的解析器),但我知道上述解决方案由于上述原因而不起作用。是否存在任何解决方案,或者我是否需要精确地找出我需要什么并为其编写自己的代码?


答案 1

听起来很奇怪,但我会尝试遵循这个答案并使用.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");

对于诸如 、 、 、 等输入,我得到以下输出:1A127.0.0.11,2346.02e-23

Not a number
Not a number
1234
6.02E-23

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


答案 2

您可以指定所需的区域设置:

NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
double myNumber = nf.parse(myString).doubleValue();

这应该适用于您的示例,因为德语区域设置具有逗号作为小数分隔符。