2017-07-19 3 views
1

私はJavaでプロジェクトに取り組んでいますが、価格はマイクロ単位で表示されています。マイクロユニットで表された所与の金額からユニットおよびサブユニット部品を抽出するにはどうすればよいですか?

マイクロ単位の価格は、1,000,000マイクロ単位が通貨の1単位に等しい価格です。たとえば、価格が「7.99ユーロ」の場合、price_amount_microsは「7990000」です。

別の文字列として7と99を抽出する必要があります。丸め誤差に関するいくつかの記事を読んだ、私は私が必要なものを達成するための正しい方法は、文字列に与えられた量を変換し、次の正規表現を使用してユニットとサブユニット部分を抽出することであると思う:

^(\d+)(\d{2})0000$ 

しかし、いくつかのために理由、私はそれがエレガントな方法ではないように感じる。

+1

Iドン必要なのは10^nで割ってフロア関数を適用するだけなので、丸め誤差を持つことができると思います。 –

+0

@CasimiretHippolyte、証明書でさらに詳細な回答をした場合、私もそれを受け入れるかもしれません:) –

答えて

1

あなたはそれを絞り込むことができます。

^(\d+)(\d{2})0{4}$ 

しかし、その後、あなたは私見で行われています。

私はすべての価格を私のデータベースのINTとして扱います。 7.99は799になります。 丸め誤差はありません。

0

それはやり過ぎのように見えるかもしれませんが、浮動小数点の問題に、より安全側にあることを、あなたはこのようBigDecimalベースのロジックを使用することができます。

void extractParts(String str) { 
    BigDecimal bd = new BigDecimal(str);   
    BigDecimal res = bd.scaleByPowerOfTen(-6); 
    BigDecimal rem = res.remainder(BigDecimal.ONE).stripTrailingZeros(); 

    System.out.printf("<%s> <%s>%n", res.longValue(), 
      rem.movePointRight(rem.scale()).abs().longValue()); 
} 

次にとしてそれを呼び出す:

extractParts("7990000"); 
//=> <7> <99> 

extractParts("-1835000"); 
//=> <-1> <835> 

extractParts("89000000"); 
//=> <89> <0> 
+0

それは83.5ではありませんか?それは835セントではなく83.5セントでなければなりません。 –

+0

このメソッドに送信する入力文字列は何ですか? – anubhava

関連する問題