Java DecimalFormat在用户具有不同地区时强制使用拉丁数字
我试图解析一个浮点,同时使用十进制格式twoDForm来减少十进制数。 要设置小数位数,我已实例化如下:Java DecimalFormat在用户具有不同地区时强制使用拉丁数字,java,android,formatting,number-formatting,numberformatexception,Java,Android,Formatting,Number Formatting,Numberformatexception,我试图解析一个浮点,同时使用十进制格式twoDForm来减少十进制数。 要设置小数位数,我已实例化如下: twoDForm = new DecimalFormat("#.##"); Float.valueOf(twoDForm.format(cameraPosition.x) 然后,为了解析浮点值,我调用以下命令: twoDForm = new DecimalFormat("#.##"); Float.valueOf(twoDForm.format(cameraPosition.x)
twoDForm = new DecimalFormat("#.##");
Float.valueOf(twoDForm.format(cameraPosition.x)
然后,为了解析浮点值,我调用以下命令:
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:无效浮点:“١٥.٨٦”
当我在谷歌上搜索时,我发现了阿拉伯语书籍的建议,所以我猜这是处理不同语言数字的另一种方式。有没有办法强制使用“常规”数字来避免这种情况,这样我就可以简单地调用相同的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();
}
该字符串中的字符是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();
}
问题在于设备语言是阿拉伯语。如果是这样,自动十进制符号将把拉丁数字转换成阿拉伯数字。最好的方法和最简单的方法是直接设置区域设置:
final DecimalFormatSymbols decimalSymbol = new DecimalFormatSymbols(Locale.US);
问题在于设备语言是阿拉伯语。如果是这样,自动十进制符号将把拉丁数字转换成阿拉伯数字。最好的方法和最简单的方法是直接设置区域设置:
final DecimalFormatSymbols decimalSymbol = new DecimalFormatSymbols(Locale.US);
你对产生异常的文本做了什么?您正在调用什么命令?请注意,以防问题中不清楚-这些符号是阿拉伯数字。
是一个规则句点吗?可能是。阿拉伯零看起来像一个垂直居中的点,所以这可能是一个小数点。在我看来这就像是15.86
。你对产生异常的文本做了什么?您正在调用什么命令?请注意,以防问题中不清楚-这些符号是阿拉伯数字。
是一个规则句点吗?可能是。阿拉伯零看起来像一个垂直居中的点,所以这可能是一个小数点。所以在我看来这就像是15.86
。太好了,谢谢!我把我的问题编辑得更具体了,你能看一下吗?有没有办法简单地解释任何类型的语言环境,然后从十进制格式解析字符串?问题是我的用户遍布世界各地,我不知道他们使用的是哪种语言环境。好吧,一旦人们开始回答问题,你不应该真正改变这个问题——这会使他们的答案无效。请记住,堆栈溢出不仅仅适用于您。其他人会从这个问题中受益。但除此之外,为什么要使用十进制格式
将数字转换为字符串
,然后使用Float.valueOf
将其转换回数字?你不能把它作为一个数字,避免所有这些问题吗?是的,但我得到了一个警告,这个问题必须删除,因为它没有正确的表述,我现在问的是我本来想问的,我只是问得非常糟糕。。不管怎么说,这是因为我想限制小数位数,这是我唯一想到的解决办法。所以你真正的问题是如何将一个数字四舍五入到小数位数?而有关区域设置和阿拉伯数字的整个业务都是一条红鲱鱼?不是真的,我已经弄清楚了取整部分,问题是由于某种原因,在一个(在本例中是Android)设备上使用十进制格式,而该设备具有阿拉伯或任何其他区域设置,因此浮点解析失败。太好了,谢谢!我把我的问题编辑得更具体了,你能看一下吗?有没有办法简单地解释任何类型的语言环境,然后从十进制格式解析字符串?问题是我的用户遍布世界各地,我不知道他们使用的是哪种语言环境。好吧,一旦人们开始回答问题,你不应该真正改变这个问题——这会使他们的答案无效。请记住,堆栈溢出不仅仅适用于您。其他人会从这个问题中受益。但除此之外,为什么要使用十进制格式
将数字转换为字符串
,然后使用Float.valueOf
将其转换回数字?你不能把它作为一个数字,避免所有这些问题吗?是的,但我得到了一个警告,这个问题必须删除,因为它没有正确的表述,我现在问的是我本来想问的,我只是问得非常糟糕。。不管怎么说,这是因为我想限制小数位数,这是我唯一想到的解决办法。所以你真正的问题是如何将一个数字四舍五入到小数位数?而有关区域设置和阿拉伯数字的整个业务都是一条红鲱鱼?不是真的,我已经弄清楚了取整部分,问题是由于某种原因,在一个(在本例中是Android)设备上使用十进制格式,而该设备具有阿拉伯或任何其他区域设置,因此浮点解析失败。