我正在尝试解析一个浮点数,同时使用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(...)而不必为每种可能的情况添加特定的语言环境?
谢谢!
答案 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);