Java Android中是否可以对Numberformat进行区域设置感知解析?

Java Android中是否可以对Numberformat进行区域设置感知解析?,java,math,locale,Java,Math,Locale,我有一个Android应用程序,它做一些基本的数学运算 范例 try { NumberFormat nf = NumberFormat.getNumberInstance(); DecimalFormat df = (DecimalFormat) nf; a = Float.parseFloat(vw3.getText().toString()); f = Float.parseFloat(vw5.getText().toStr

我有一个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);
    }
}
 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);
    }
}
NumberFormat.getNumberInstance().parse(string);
当用户在美国时,计算工作正常,格式良好。正如你所料。1000.00格式,其中分组以逗号为单位,分隔符以小数点为单位。当用户在法国时,分组不同,分隔符也不同。以1000.00为例,在法国,数字的格式为1000,00。空格是分组分隔符,逗号是十进制分隔符。当您尝试运行计算时,这会导致问题,您将获得NumberFromatException(NFE)。我预测到了NFE问题,发现了它,并用正确的数字替换了可能的原因。但是,用空格替换任何逗号,用逗号替换任何句点也会生成NFE

范例

  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);
    }
}
 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);
    }
}
NumberFormat.getNumberInstance().parse(string);
编辑-正如Peter O所建议的那样。我尝试过用区域设置感知的方法解析数字

范例

  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);
    }
}
 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);
    }
}
NumberFormat.getNumberInstance().parse(string);

将产生“坏类”非法辩论


我正在寻找一个解决方案,我可以在应用程序编程中以可接受的方式进行计算,而不考虑语言环境,然后将结果格式化为语言环境。问题可能是或是,您是否为计算强制使用区域设置,然后为区域设置格式化结果?

如果这是您正在使用的代码,并且字符串将具有货币符号。在这种情况下,欧元是欧元符号

您的示例:

NumberFormat df = NumberFormat.getNumberInstance();
        String value = "10,40 €";
        Number valueParsed = df.parse(value);
        vw7.setText(valueParsed);
因此,
value
始终有一个您需要使用的货币符号

NumberFormat df= NumberFormat.getCurrencyInstance();

而不是
.getNumberInstance()
。这在我的系统上起作用,该系统当前设置为欧元符号为默认货币符号。您必须在带有$currency符号的系统上尝试,以验证它是否也在那里工作

Float.parseFloat
String.valueOf
无论语言环境如何,始终使用相同的格式约定。您需要使用区域设置感知的数字解析器。事实上,这个问题似乎是针对Java的,而不是针对Android的。可能是我尝试过的“myNumber=df.parse(myString);”的重复,它返回一个错误“Bad Class”。这就是问题所在。谢谢你的回复。非法的争论是由于欧元符号引起的。抓到了!这在我基于十进制分隔符的系统上确实有效。并回答了我的第一个问题。因此,我的解决方案是使用区域设置感知解析来解析数字,并格式化结果以供显示获取计算结果的带有货币符号的字符串表示形式,然后可以将其显示给用户。