当用户使用不同的语言环境时,DecimalFormat 强制使用拉丁数字
DecimalFormat force latin numbers when users have different locales
我正在尝试解析浮点数,同时使用 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:无效的浮点数:“١٥.٨٦”
当我 google 它时,我发现阿拉伯语书籍建议,所以我猜这是处理不同语言数字的其他方式。有什么办法可以强制使用 "regular" 数字来避免这种情况,这样我就可以简单地调用相同的 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();
}
问题出在设备语言是 arabis。如果是这样,DecimalFormatSymbols 会自动将拉丁数字转换为阿拉伯数字。最好的方法也是最简单的方法是直接设置语言环境:
final DecimalFormatSymbols decimalSymbol = new DecimalFormatSymbols(Locale.US);
我正在尝试解析浮点数,同时使用 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:无效的浮点数:“١٥.٨٦”
当我 google 它时,我发现阿拉伯语书籍建议,所以我猜这是处理不同语言数字的其他方式。有什么办法可以强制使用 "regular" 数字来避免这种情况,这样我就可以简单地调用相同的 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();
}
问题出在设备语言是 arabis。如果是这样,DecimalFormatSymbols 会自动将拉丁数字转换为阿拉伯数字。最好的方法也是最简单的方法是直接设置语言环境:
final DecimalFormatSymbols decimalSymbol = new DecimalFormatSymbols(Locale.US);