2011-12-28 35 views
2

我有一个EditText其应该工作如下(2.3.3的Android):的Android:解析EU货币成数

用户例如10,40(这是进入10欧元和欧盟货币40美分) - 我想要接下来的String输入并将其转换为BigDecimal(或Number等),以便进一步进行内部计算。

如果用户输入10.40(其中 - 在美元的情况下将等于10美元和40美分),则采用该字符串输入并将其转换为BigDecimal(或数字等等)... ) 例如。

我尝试以下(基于迈克尔Petrotta的答案here),它失败,“ParseException的:无法解析号码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(“,”,“。”),这对我来说似乎是一个坏主意,因为有些货币使用逗号作为数千的分隔符,例如如果我没有弄错的话就用美元。然而,我可以检查语言环境,但所有接缝的阴影:(并可能是错误的...

+0

+1现在想使用正则表达式! – fge 2011-12-28 11:56:54

+0

谢谢 - 是的,在这种情况下使用正则表达式可能是一个真正的痛苦,太多可能会出错(尤其是因为有很多货币,因此有潜在的用户输入方式),我相信这是一个干净的解决方案,只是可以似乎没有找到它:) ... – AgentKnopf 2011-12-28 12:01:41

+0

你想在相同的设备上使用相同的语言环境将“10,40”和“10.40”处理为10.4吗?或者例如在德语区域设置为“10,40”,在美国区域设置为“10.40”? – ernazm 2011-12-28 12:14:10

回答

2

看来你并不真正需要的货币格式。使用NumberFormat.getNumberInstance()来代替:

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

这将引发NumberFormatException虽然情况下,用户在格式不适合他的语言环境(例如,“10,40”为美国)输入值,而应在正规的情况下工作。

+0

谢谢!这样做的工作:) – AgentKnopf 2011-12-28 13:47:28

0

不幸的是我不能给你更多的使用语言环境的见解,但要回答你的问题的其他部分: 如果你想要的东西国际工程只要按照这样的:

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 
+0

谢谢你的建议,但是你确定这可以在国际上工作吗?我不知道日元,但我确定它不使用“美分”:)。但是,如果没有更好的,基于区域的解析10,40/10.40的建议,我可能会考虑这一点。此外,为了将其转换为可解析的货币值,美分的除数(例如达到美元/欧元/日元的数额)总是必须为100,所有货币 - 对吗? – AgentKnopf 2011-12-28 12:17:08

+0

虽然你已经找到你的答案,我会在这里回复完整性。 有些国家的全部货币分成不是主货币的1/100的子货币。我认为这对日本来说不会是一个问题,因为他们使用完整的货币或sen,但这里是货币及其次级货币清单。任何有100或者没有的东西都可以,但是其他的如1000会导致一个问题,所以仔细想想你是否希望它与这些货币兼容。 [货币列表](http://en.wikipedia.org/wiki/List_of_circulating_currencies) – 2012-01-01 14:54:40

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); 
+0

谢谢你的建议 - 正如我在我原来的帖子中说的,我实际上试过“10,40€”,它不起作用 - 失败的数字为“10,40€”。我只是试了一下,以确保。 – AgentKnopf 2011-12-28 12:19:49

+0

第二个问题是:如何从用户输入(10,40)到10,40€?我不能从输入10,40中推断出用户是指欧元 - 对吗?我想不是否有可能使用逗号分隔符的其他货币。除非我检查我认为的地区,并确保它是欧元。 – AgentKnopf 2011-12-28 12:21:02

+0

根据区域设置,您可以将货币符号附加到字符串 – 2011-12-28 12:46:58