2011-12-28 7 views
2

にEUの通貨を解析、私は次のように動作するはずのEditText(アンドロイド2.3.3)を持っている:アンドロイド:ナンバー

ユーザーがインスタンス10,40のために入る(EU通貨で10ユーロと40セントであります) - 私はその文字列入力を受け取り、さらに内部的な計算のためにBigDecimal(またはNumber等...)に変換したいと思います。

ユーザーが10.40を入力した場合(米国ドルの場合は10ドルと40セントになります)、文字列入力を取得してBigDecimal(またはNumberなど)に変換します。 ) 例えば。

私は失敗した、(マイケルPetrottaの答えhereに基づいて)次のことを試してみました無駄に10,40€を "「はParseException:解析できません番号10,40)

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

私も試してみました"。だから私はNumberFormat.parseの目的を誤解しているのか、間違ったトラックを一緒にしているのか...?正規表現を使って、バージョンが "10,40"になるのを避けたいのですが、私はロケールをベースにしたきれいなアプローチをしたいと思います。

EDIT

私は同じ問題に対処するthis questionを見つけました - 正解は私と同じアプローチを使用していますので、私は再びフランス語をロケールとして使用しましたが、それでもなお失敗します。引用された質問は私に間違っていると思われる場合、米ドルのような何千もの通貨の分数としてコンマを使用するので、私には悪い考えであるreplaceAll( "、"、 "。")を使って示唆された質問。あなたはその何かをしたい場合は :私は、しかし

+0

+1は正規表現を使いたい! – fge

+0

ありがとうございます - このケースでは正規表現を使用すると本当に苦しいことがありますし、あまりにも多くの通貨があり、したがってユーザー入力の潜在的な方法があるので、特に間違っている可能性があります。それを見つけると思われる:) ... – AgentKnopf

+0

「10,40」と「10.40」を10.4に同じロケールの同じデバイスで処理しますか?あるいは、例えば、ドイツロケールでは「10,40」、米国ロケールでは「10.40」となりますか? – ernazm

答えて

2

正常に動作します。代わりにNumberFormat.getNumberInstance()を使用してください:

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

場合には、ユーザが(例えば、「10,40」は、米国のために)彼のロケールの不適切な形式で値を入力しますが、通常の場合には動作するはずですが、これはNumberFormatExceptionがスローされます。

+0

ありがとうございます!これは仕事です:) – AgentKnopf

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

+0

あなたの回答は既に見つかりましたが、私はここで完全に回答します。 一部の国では、主要通貨の100分の1でないサブ通貨で全通貨が分割されています。私はこれが全通貨またはセンを使用しているため、日本にとって問題ではないと考えていますが、ここには通貨とそのサブ通貨のリストがあります。 100またはなしのものは問題ありませんが、1000のようなものは問題を引き起こすため、これらの通貨に対して互換性があるかどうかを慎重に考えてください。 [通貨一覧](http://en.wikipedia.org/wiki/List_of_circulating_currencies) –

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

+0

2番目の質問は、ユーザー入力(10,40)から10,40€に到達する方法です。そして私はユーザーがユーロを意味するということを入力10,40から推論することはできません。私は、カンマ区切りを使用する他の通貨が潜在的に存在するかどうかは考えていません。私がロケールをチェックしない限り、私はそれがユーロであることを確かめます。 – AgentKnopf

+0

ロケールに応じて、文字列に通貨表記を追加することができます –

関連する問題