在 Android 中是不是可以对 Numberformat 进行区域感知解析?

Posted

技术标签:

【中文标题】在 Android 中是不是可以对 Numberformat 进行区域感知解析?【英文标题】:Is locale aware parsing for Numberformat possible in Android?在 Android 中是否可以对 Numberformat 进行区域感知解析? 【发布时间】: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.parseFloatString.valueOf 始终使用相同的格式约定,无论区域设置如何。您需要使用可识别区域设置的号码解析器。 其实这个问题似乎是Java特有的,而不是Android。 Best way to parseDouble with comma as decimal separator?的可能重复 我试过“myNumber = df.parse(myString);”它返回“Bad Class”错误。因此问题。感谢您的回复。 非法争论是由于欧元符号。 【参考方案1】:

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

你的例子:

NumberFormat df = NumberFormat.getNumberInstance();
        String value = "10,40 €";
        Number valueParsed = df.parse(value);
        vw7.setText(valueParsed);

这样value 总是有一个你需要使用的货币符号

NumberFormat df= NumberFormat.getCurrencyInstance();

而不是.getNumberInstance()。这适用于我当前设置的系统,因此€符号是默认货币符号。您必须在具有 $ 货币符号的系统上尝试它,以验证它也可以在那里工作。

【讨论】:

好收获!这确实适用于基于小数分隔符的系统。并回答了我的第一个问题。所以我的解决方案是使用区域感知解析来解析数字并格式化结果以供显示。 使用String val = df.format(valueCalculated); 获得一个带有货币符号的字符串表示,您可以将计算结果显示给用户。

以上是关于在 Android 中是不是可以对 Numberformat 进行区域感知解析?的主要内容,如果未能解决你的问题,请参考以下文章

Android - 是不是可以使用 Comparator.comparing 而不是 API < 24 上的自定义比较器对列表进行排序?

在 Android 中使用 Fragments 而不是 Views 有啥好处?

在可可中与货币作斗争

如何在Android中判断软键盘是不是弹出或隐藏

您是不是需要对 Java 有“完整”的了解才能编写 Android 应用程序? [关闭]

如何在android中获取Fragment的包名(不是Activity的)[重复]