【问题标题】:Android: Parsing EU currency into a NumberAndroid:将欧盟货币解析为数字
【发布时间】:2012-01-29 03:31:21
【问题描述】:

我有一个 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”中的逗号,因为该版本应该可以在国际范围内使用,我想要一些干净的、基于区域设置的方法。

编辑

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

【问题讨论】:

  • +1 现在想使用正则表达式!
  • 谢谢 - 是的,在这种情况下使用正则表达式可能会很痛苦,而且太多可能会出错(特别是因为有多种货币和潜在的用户输入方式),我相信有干净的解决方案,似乎找不到它:) ...
  • 你想把“10,40”和“10.40”处理成10.4在同一个设备上同一个locale吗?或者在例如德国语言环境中是“10,40”,在美国语言环境中是“10.40”?
  • @emazm:它将基于区域设置(我想我必须相信用户输入与他的区域设置匹配的货币......)。我需要 10.40 将其解析为 Number/BigDecimal,因为 10,40 不会解析。下一个棘手的事情是,如果用户 (EU) 输入 1.000,40 - 因为点是数千个欧盟货币的分隔符(尽管是可选的)。

标签: java android currency number-formatting


【解决方案1】:

看来你真的不需要货币格式。请改用NumberFormat.getNumberInstance()

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

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

【讨论】:

  • 谢谢!这可以完成工作:)
【解决方案2】:

您的字符串中缺少该语言环境的货币符号。

例如对于德国货币符号是€

您的用户插入数据应该是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);

【讨论】:

  • 感谢您的建议 - 正如我在原始帖子中所说,我实际上尝试了“10,40 €”但它不起作用 - 以无法解析的数字“10,40 €”失败。我只是再次尝试以确保。
  • 第二个问题是:如何从用户输入(即 10,40)达到 10,40 欧元?而且我无法从输入 10,40 中推断出用户的意思是欧元 - 我可以吗?我猜如果有其他可能使用逗号分隔符的货币,我想不会。除非我检查我猜的语言环境并确保它是欧元。
  • 根据区域设置,您可以将货币符号附加到字符串
  • 感谢您的提示,但例如在美国货币中,您将货币预先附加到字符串中,对吗?像这样:$20.00 如果我必须预先或附加货币符号,恐怕如果不检查(并了解)每种货币,我就无法知道?
【解决方案3】:

很遗憾,我无法为您提供有关使用 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

【讨论】:

  • 感谢您的建议,但是您确定这在国际范围内有效吗?我不确定日元,但我确信它不使用“美分”:)。但是,如果没有更好的基于语言环境的解析 10,40/10.40 的建议,我可能会考虑这个。此外,要将其转换为可解析的货币值,美分的分隔符(例如达到美元/欧元/日元的金额)在所有货币中始终必须为 100 - 对吧?
  • 虽然您已经找到了答案,但为了完整起见,我会在这里回复。有些国家将全部货币划分为非主要货币的 1/100 的子货币。我认为这对日本来说不是问题,因为他们使用完整的货币或 sen,但这里是货币及其子货币的列表。任何有 100 或没有的都可以,但像 1000 这样的其他货币会导致问题,因此请仔细考虑您是否希望它与这些货币兼容。 Currency List
猜你喜欢
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2020-09-15
  • 2018-09-06
  • 2017-04-04
相关资源
最近更新 更多