2011-07-30 20 views
1

でのBigDecimalを使用してアイテムの価格を実装し、私は他の場所でそのfloatまたはdoubleを読んfield.I価格は丸め誤差とのBigDecimalによる通貨フィールドのために使用すべきではありません持っているItemForSaleをモデルにしたいですこのpurpose.Iのための適切なタイプは、これらのクラスを作成しているWebアプリケーションのJava

class ItemForSale { 
    private String name; 
    private BigDecimal price; 
    ... 
} 

class MyUtils{ 
    ... 
    public static BigDecimal parsePriceOfItem(String priceStr){ 
     BigDecimal price; 
     BigDecimal zero = new BigDecimal(0); 
     try{ 
      price = new BigDecimal(priceStr); 
     }catch(NumberFormatException nfe){ 
      price = zero; 
     } 
     if(price.doubleValue() < zero.doubleValue()){ 
      price = zero; 
     } 
     return price; 
     } 
    } 

が、これは(ユーザーが入力した通り)の価格文字列を解析するための正しい方法ですか?私は否定し、無効な文字列を扱うたかった(「ABCD」と言います) 0

もっと良い方法があれば教えてください

おかげ

マーク

答えて

4

は、なぜあなたは0として無効な入力を処理するのでしょうか?確かに、あなたは彼らがゼロをタイプしたかのように扱うのではなく、間違いを犯したとユーザに伝えたいでしょう。

ユーザー入力を解析する場合は、おそらくBigDecimalコンストラクタの代わりにDecimalFormatを使用している必要があります。そうすれば、適切な文化情報が使用されます。 (BigDecimal代わりのdoubleDecimalFormat解析を行うためにsetParseBigDecimalを使用してください。)

を次に代わりに、使用ダブルスにはBigDecimal値に変換する:

if (price.compareTo(BigDecimal.ZERO) < 0) 

は、私はあなたがユーザーに3つの異なる状態を示すべきであることを示唆しています:

  • 数は
  • 数が負(または他のいくつかの方法で、おそらく無効だっ解析することはできません。やります最大値または最大桁数)を持っていますか?
  • 番号が有効であった
1

ここに私の提案です:

public static BigDecimal parsePriceOfItem(String priceStr) { 
    try { 
     BigDecimal price = new BigDecimal(priceStr); 
     return price.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : price; 
    } catch(NumberFormatException nfe) { 
     return BigDecimal.ZERO; 
    } 
} 
3

あなたの最も高価な項目がどのようにコストがかかるのですか?それが21,474,836.47ドル未満の場合は、普通のintで保持されているセントの数で安全にその価格を表現することができます。

floatdoubleは避けてください。通常の解決策は、intまたはlongを使用してセントの数を保持し、それに応じて出力書式を調整することです。通常、複雑さと速度の問題に陥る必要はありません。BigDecimalです。

+0

+1:または92233,720,368,547,758.07を持つことができます。これより大きい値を持つ場合は、BigDecimalを使用します;) –

+0

@PeterLawrey:はい、縮尺の整数を使用できますが、どうしてでしょうか? BigDecimal **は**スケーリングされた整数なので、通貨を表すのに理想的です。また、任意の方法でパーセンテージを処理できます。なぜ車を再発明し、BigDecimalが既に何をしているのですか?定数のスケーリングは、BigDecimalを使用するよりも高速ではありません。 –

+0

@RudyVelthuis BigDecimalは妥当な選択肢ですが、まだ扱いにくく、言語サポートはありません。これは、コードの読み取りと検証がはるかに難しいことを意味します。開発者のオーバーヘッドであり、BigDecimalを使用する際の保守性が向上しますが、これは最大の問題です。バランスを取るために、私は人々に 'double 'を適切に(丸めて)使用することを学ぶことを勧めます。これは私の経験で維持するのが最も簡単です。 –

関連する問題