用逗号作为小数分隔符解析双精度

Posted

技术标签:

【中文标题】用逗号作为小数分隔符解析双精度【英文标题】:Parsing double with comma as decimal separator 【发布时间】:2014-03-17 10:13:27 【问题描述】:

我从用户那里获取输入并逐行读取。然后我使用拆分方法对输入进行标记。像这样:

Scanner input=new Scanner(System.in);
String input1=input.nextLine();
String[] tokens=input1.split(" ");
method1(Double.parseDouble(tokens[0]),Double.parseDouble(tokens[1])); 

这里是method1

 public static void method1 (double a, double b) 
    System.out.println(a);
    System.out.println(b);
 

当我声明 3.5 和 5.3 输出时;

   3.5
   5.3

这里没有问题,但如果我声明 3,5 和 5,3 我的代码在下面给出错误;

Exception in thread "main" java.lang.NumberFormatException: For input string: "3,5"
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at java.lang.Double.parseDouble(Unknown Source)

我该如何解决这个问题?

【问题讨论】:

当您尝试将 42,42 解析为 double 时,您认为会发生什么? 3,5 怎么是双倍?显然它会抛出NumberFormatException 致投反对票的人:42,7,在某些文化中,逗号是被广泛接受的数字。 【参考方案1】:

使用NumberFormat,您可以执行以下操作:

NumberFormat f = NumberFormat.getInstance(Locale.FRANCE);
double myNumber = f.parse("3,5").doubleValue();

现在您可以将myNumber 传递给接受double 值的方法。

当使用Locale.FRANCE 时,您告诉Java 您使用, 而不是. 编写double 数字。

【讨论】:

现在 OP 需要发布另一个问题,因为它不能解析 3.5 :) 您应该建议将, 替换为. :) 我也不能使用期望 @Abraam 避免异常表明不愿意使用 Java 标准实践。如果您不希望传播异常,请捕获并处理它。 @hexafraction 这不是我愿意或不愿意。我说我不能用!三思而后行【参考方案2】:

你可以像这样使用DecimalFormat

DecimanFormat df = new DecimalFormat("#.#", DecimalFormatSymbols.getInstance());
Double returnValue = Double.valueOf(df.format(input1));

所以DecimalFormatSymbols.getInstance() 将获得默认语言环境及其正确符号。

阅读更多关于DecimalFormat的信息。

【讨论】:

【参考方案3】:

我猜是: 您通过扫描仪输入的是

3.5 5.3

你已经申请了

String[] tokens=input1.split(" ");

所以它已将您的字符串划分为子字符串,即 3.5 和 5.3 如果您将输入作为

3.5,5.3 

这将是成功的,它会编译没有错误..

你的情况

input 3,5 5,3

您只需要在拆分方法中添加一个“,”,例如:

String[] tokens=input1.split(",");

它将与输出一起工作......

3

5 5

3

【讨论】:

以上是关于用逗号作为小数分隔符解析双精度的主要内容,如果未能解决你的问题,请参考以下文章

当全球化将逗号设置为小数分隔符时,如何在 OpenXML Excel 单元格中存储小数/双精度

强制点(“。”)作为java中的小数分隔符

强制点(“。”)作为java中的小数分隔符

用逗号作为小数分隔符解析Double的最佳方法?

使用随机逗号或点分隔符从文件中解析双精度

将带逗号的双引号作为分隔符从 S3 导入 Amazon Redshift