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

时间:2017-01-02 21:42:33

标签: java android formatting number-formatting numberformatexception

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

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

然后解析浮点数我会调用以下内容:

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

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

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

由于Android设备处理数字和符号的区域设置和差异,我在NumberFormatException中遇到了几个不同的问题,因此我还在DecimalFormat中添加了以下内容:

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

我已经能够使用不同类型的逗号和减号来解决涉及某些案例的问题,但现在我遇到了这个问题: java.lang.NumberFormatException:无效的浮点数:“15.86”

当我谷歌它,我发现阿拉伯语书籍建议,所以我猜这是处理不同语言数字的其他方式。有没有办法强迫它使用“常规”数字来避免这种情况,这样我就可以简单地调用相同的Float.valueOf(...)而不必为每种可能的情况添加特定的语言环境?

谢谢!

2 个答案:

答案 0 :(得分:2)

该字符串中的字符是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();
}

答案 1 :(得分:0)

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

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