【发布时间】:2017-05-24 21:39:23
【问题描述】:
我有一个 Android 应用程序,它可以做一些基本的数学运算。
例子
try {
NumberFormat nf = NumberFormat.getNumberInstance();
DecimalFormat df = (DecimalFormat) nf;
a = Float.parseFloat(vw3.getText().toString());
f = Float.parseFloat(vw5.getText().toString());
c = a / 100;
d = c * 1.036f;
e = f / 100;
g = e * 1.24f;
h = d + g;
String str1 = String.valueOf(df.format(h));
vw7.setText(str1);
} catch (NumberFormatException f) {
a = (0);
}
}
当用户在美国时,计算工作正常且格式正常。正如你所期望的那样。 1,000.00 格式,其中分组是逗号,分隔符是小数点。当用户在法国时,分组不同,分隔符也不同。以 1,000.00 为例,在法国,数字将被格式化为 1 000,00。空格是分组分隔符,逗号是小数分隔符。当您尝试运行计算时,这会导致问题,您将收到 NumberFromatException (NFE)。我预计会出现 NFE 问题并抓住它并用正确的数字替换可能的原因。但是,用空格替换任何逗号,用逗号替换任何句点也会产生 NFE。
例子
try {
NumberFormat nf = NumberFormat.getNumberInstance();
DecimalFormat df = (DecimalFormat) nf;
a = Float.parseFloat(vw3.getText().toString().replace(",",""));
f = Float.parseFloat(vw5.getText().toString().replace(",",""));
c = a / 100;
d = c * 1.036f;
e = f / 100;
g = e * 1.24f;
h = d + g;
String str1 = String.valueOf(df.format(h));
vw7.setText(str1);
} catch (NumberFormatException f) {
a = (0);
}
}
编辑 - 正如 Peter O 所建议的那样。我尝试使用区域设置感知方式解析数字。
例子
NumberFormat.getNumberInstance().parse(string);
或者
NumberFormat df = NumberFormat.getNumberInstance();
String value = "10,40 €";
Number valueParsed = df.parse(value);
vw7.setText(valueParsed);
将产生“Bad Class”非法参数。
我正在寻找一种解决方案,无论语言环境如何,我都可以在应用程序编程中以可接受的方式进行计算,然后将结果格式化为语言环境。问题可能是,也可能是,您是否强制使用语言环境进行计算,然后针对该语言环境格式化结果?
【问题讨论】:
-
Float.parseFloat和String.valueOf始终使用相同的格式约定,无论区域设置如何。您需要使用可识别区域设置的号码解析器。 -
其实这个问题似乎是Java特有的,而不是Android。
-
我试过“myNumber = df.parse(myString);”它返回“Bad Class”错误。因此问题。感谢您的回复。
-
非法争论是由于欧元符号。