Android:将欧盟货币解析为数字

时间:2011-12-28 11:54:27

标签: java android currency number-formatting

我有一个EditText应该如下工作(Android 2.3.3):

用户输入例如10,40(欧元货币为10欧元和40美分) - 我想接受该字符串输入并将其转换为BigDecimal(或数字等...),例如,进一步的内部计算。

如果用户输入10.40(在美元的情况下将达到10美元和40美分),则同样应该有效,然后获取该字符串输入并将其转换为BigDecimal(或数字等...)例如。

我尝试了以下内容(基于Michael Petrotta的回答here),但失败了“ParseException:Unparsable Number 10,40”:

    // German input
    NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.GERMANY);
    // User input
    String value = "10,40";
    Number valueParsed = formatter.parse(value);

我也试过“10,40€”无济于事。所以要么我误解了NumberFormat.parse的目的,要么我在错误的轨道上一起......?我真的想避免使用正则表达式替换“10,40”中的逗号,因为该版本应该在国际上运行,我想要一些基于Locale的干净方法。

修改

我发现this question解决了同样的问题 - 正确的答案使用了与我相同的方法,所以我再次尝试(这次使用法国作为Locale),但它仍然失败,这似乎很奇怪。 ..引用问题下的评论建议使用replaceAll(“,”,“。”)对我来说这似乎是一个坏主意,因为有些货币使用逗号作为数千的分隔符,如美元,如果我没有弄错的话。然而,我可以检查现场,但所有接缝都是阴暗的:(并且可能是错误的......

3 个答案:

答案 0 :(得分:2)

您似乎并不真正需要货币格式。请改用NumberFormat.getNumberInstance()

String value = "10,40";
double d = (Double)NumberFormat.getNumberInstance().parse(value);
BigDecimal price = new BigDecimal(d);

这将抛出NumberFormatException,以防用户以不适合其语言环境的格式输入值(例如美国的“10,40”),但应该在常规情况下工作。

答案 1 :(得分:1)

您的字符串中缺少该区域设置的货币表示法。

例如德国货币符号是€

您的用户插入的数据应该是String value = "10,40 €";而不是String value = "10,40"

以下示例正常

NumberFormat formatter1 = NumberFormat.getCurrencyInstance(Locale.GERMANY);
            // User input
            String value = "10,40 €";
            Number valueParsed = formatter1.parse(value);
            System.out.println(valueParsed);

答案 2 :(得分:0)

不幸的是,我无法让您更深入地了解如何使用Locale,而是回答问题的其他部分: 如果你想要一些国际上有用的东西,请按照下列说明:

Strip everything but numbers and separators.

If there is a separator on the third place from the right?
 Strip all separators and you have the desired amount in cents
Else
 Strip all separators, multiply by 100 and you have the desired amount in cents