当用户具有不同的区域设置时,DecimalFormat强制使用拉丁数字



我正在尝试解析浮点值,同时使用DecimalFormat twoDForm来减少小数位数。为了设置小数位数,我实例化如下:

twoDForm  = new DecimalFormat("#.##");

然后,为了解析浮点,我确实调用了以下命令:

Float.valueOf(twoDForm.format(cameraPosition.x)

在某些情况下,它似乎是基于区域设置抛出

NumberFormatException: Invalid float: "١٥.٨٦" non latin numbers or font

由于地区设置以及安卓设备处理数字和符号的方式不同,我在NumberFormatException中遇到了几个不同的问题,所以我还在DecimalFormat中添加了以下内容:

DecimalFormatSymbols dfs = new DecimalFormatSymbols();
dfs.setDecimalSeparator('.');
dfs.setMinusSign('-');
twoDForm.setDecimalFormatSymbols(dfs);

我已经能够使用不同种类的逗号和减号来解决一些涉及某些情况的问题,但现在我面临的是:java.lang.NumberFormatException:无效浮点:"١٥.٨ٰ">

当我在谷歌上搜索时,我会发现阿拉伯语书籍的建议,所以我猜这是处理不同语言的数字的其他方式。有没有什么方法可以强制使用"正则"数字来避免这种情况,这样我就可以简单地调用相同的Float.valueOf(…),而不必为每种可能的情况添加特定的区域设置?

谢谢!

该字符串中的字符是1、5、8和6的阿拉伯数字。你需要一个讲阿拉伯语的语言环境才能解析它们。

以下代码适用于我,并根据需要打印15.86。

Locale saudiArabia = new Locale("ar", "SA");
NumberFormat arabicFormat = NumberFormat.getInstance(saudiArabia);
try {
Number parsed = arabicFormat.parse("١٥.٨٦");
System.out.println(parsed);
} catch (ParseException e) {
e.printStackTrace();
}

问题在于设备语言是阿拉伯语言。如果是这样,DecimalFormatSymbols会自动将拉丁数字转换为阿拉伯数字。最好也是最简单的方法是直接设置区域设置:

final DecimalFormatSymbols decimalSymbol = new DecimalFormatSymbols(Locale.US);

最新更新