2016-04-26 3 views
2

MonetaryAmountFormatをMoneta JSR-354の実装を使用してカスタマイズする方法は本当に混乱しています。Moneta(JavaMoney)JSR354の実装を使用してMonetaryAmountFormatをカスタマイズする

私の意図は、1.23$3.45の両方をMonetaryAmountとして解析できるようにすることです。ここで

は私のユニットテストである:ここで

@Test 
public void testString() { 
    Bid bid = new Bid("1.23"); 
    assertEquals(1.23, bid.getValue(), 0.0); 
    System.out.println(bid); 

    bid = new Bid("$3.45"); 
    assertEquals(3.45, bid.getValue(), 0.0); 
    System.out.println(bid); 
} 

は私のクラスである:

public final class Bid { 

    private static final CurrencyUnit USD = Monetary.getCurrency("USD"); 
    private MonetaryAmount bid; 

    /** 
    * Constructor. 
    * 
    * @param bidStr the bid 
    */ 
    public Bid(String bidStr) { 
     MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(
       AmountFormatQueryBuilder.of(Locale.US) 
       .set("pattern", "###.##") 
       .build()); 
     if (StringUtils.isNotBlank(bidStr)) { 
      bidStr = bidStr.trim(); 
      bidStr = bidStr.startsWith("$") ? bidStr.substring(1) : bidStr; 
      try { 
       bid = FastMoney.parse(bidStr, format); 
      } catch (NumberFormatException e) { 
       bid = FastMoney.of(0, USD); 
      } 
     } 
    } 

    /** 
    * Constructor. 
    * 
    * @param bidDouble the bid 
    */ 
    public Bid(double bidDouble) { 
     bid = FastMoney.of(bidDouble, USD); 
    } 

    public double getValue() { 
     return bid.getNumber().doubleValue(); 
    } 
} 

私は本当に単一MonetaryAmountFormatを使用して$の有無にかかわらずbidStrを解析できるようにしたかったですしかし、多くの時間を費やして、$をオプションにする方法を見つけようとした後、私は諦めました。残念ながら、1.23をUSDとして解析する方法を見つけることさえできません。モネタはNullPointerExceptionを投げます。 AmountFormatQueryBuilderを使用して通貨を設定する必要がありますか? AmountFormatQueryBuilderを使用して設定できるすべてのキーは何ですか?私はドキュメントを探しましたが、patternのようないくつかの一般的なキーを除き、どこでも見つけることができませんでした。

答えて

3

修飾されていない数字(たとえば1.23など)を解析しようとすると、JavaMoneyが正常に動作しないようです。デフォルトでは

MonetaryAmountFormatは(USD 1.23のような)を使用すると、通貨の名前を提供したい:

MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(Locale.US); 
MonetaryAmount amount = format.parse("USD 1.23"); 

あなたがCurrencyStyle.SYMBOLを設定した場合、あなたは、通貨名や記号によって解析し(そう、USD 1.23または$3.45のいずれか)することができます:

AmountFormatQuery formatQuery = AmountFormatQueryBuilder.of(Locale.US) 
    .set(CurrencyStyle.SYMBOL) 
    .build(); 
MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(formatQuery); 
MonetaryAmount amount1 = format.parse("USD 1.23"); 
MonetaryAmount amount2 = format.parse("$3.45"); 

これは、おそらくJavaMoneyに最も近いものです。

数字が同じ通貨のみであることがわかっている場合は、(正規表現などで)文字列を解析して一貫した入力形式に変換するほうがよいかもしれません(発見した通り)NullPointerException JavaMoneyが不幸なときは何の説明もありません。 patterngroupingSizesgroupingSeparators

限り使用可能なキーとして、あなたはorg.javamoney.moneta.format.AmountFormatParamsに定数を覗くことができます。

フォーマットを設定するときは、汎用currency sign¤を使用する必要があることに注意することが重要です。たとえば、.set("pattern", "¤#,##0.00")とします。

最後に、むしろ直接モネタRIからFastMoneyクラスを使用するよりも、あなたがMonetaryAmountFormatから右に解析することができます:

// rather than using Monata directly: 
MonetaryAmount amount = FastMoney.parse(bidStr, format); 

// use the API: 
MonetaryAmount amount = format.parse(bidStr); 
関連する問題