2012-03-08 6 views
2

私はユーザーが入力した金額を確認し、それを検証したいと考えています。私はJSFバリデーターを書いていますが、これをすべての状況で動作させるのに問題があります。ここに私のシナリオは次のとおりです。
私は別のロケールのユーザーを持っているので、私は入力の様々な方法で対処する必要があるとオプション2 & 4が見られるよう、次のNumberFormatローカリゼーションの問題

English 
1234 
1,234 
1234.56 
1,234.5 

German & Spanish 
1234 
1.234 
1234,56 
1.234,5 

French 
1234 
1 234 
1234,56 
1 234,5 

私の問題は、フランス語であるようにしたいですこのコードを使用して無効にすると、解析がスペースで停止します。

public void validate(final FacesContext pContext, 
        final UIComponent pComponent, 
        final Object pValue) { 

    boolean isValid = true; 
    final Locale locale = (Locale)pComponent.getAttributes().get(USERS_LOCALE); 
    final Currency currency = (Currency)pComponent.getAttributes().get(CURRENCY); 

    final NumberFormat formatter = NumberFormat.getNumberInstance(locale); 
    formatter.setGroupingUsed(true); 
    formatter.setMinimumFractionDigits(currency.getDefaultFractionDigits()); 
    formatter.setMaximumFractionDigits(currency.getDefaultFractionDigits()); 
    final ParsePosition pos = new ParsePosition(0); 
    final String stringValue = (String)pValue; 

    if (pos.getIndex() != stringValue.length() || pos.getErrorIndex() != -1) { 
    isValid = false; 
    } 
    ... 

は、私はまた、以下は無効として扱われることを確実にしたいが、彼らはすべての

1,234,9.56(無効なグループ化)
1,234.567(あまりにも多くの小数点以下の桁(もちろんフランス語を除く)が正常に解析します)通貨の

任意の助けも
イアン

答えて

5

フランスの1000単位の区切りが実際に非ブレークでは理解されるであろうスペース、\u00a0。しかし、

DecimalFormat decimalFormatter = (DecimalFormat) formatter; 
DecimalFormatSymbols symbols = decimalFormatter.getDecimalFormatSymbols(); 
symbols.setGroupingSeparator(' '); 
decimalFormatter.setDecimalFormatSymbols(symbols); 

はこれをお勧めすることはできません:あなたが行うことができます

input = input.replace(' ', '\u00a0'); 

もう一つは、通常のスペースに区切り記号を変更です:あなたの入力は、通常のスペースを使用する場合は、入力を変更することができます。新しいフォーマッタは、グループ化文字として改行しないスペースを使用する数字を受け入れません。

+0

ありがとう、新しいことを学んだ。これに関する詳細はoracleのバグ・トラッカーを参照してください。http://bugs.sun.com/view_bug.do?bug_id=4510618 –

+0

応答をいただきありがとうございます。ハード・コードではなく、最初に機能しましたが、stringValue.replace ( ''、symbols.getGroupingSeparator()) – bluesky

+0

無効なグループ化と小数点以下の桁については、誰でも2番目の部分をお手伝いしますか? (これは別の質問になったはずです) – bluesky

関連する問題