2012-06-28 12 views
5

<f:convertNumber>タグを使用して10進数の入力を変換しています。f:convertNumberは末尾のアルファベット文字を10進数で変換しません

<f:convertNumber minFractionDigits="2" /> 

しかし、末尾の英数字を受け入れています。たとえば、12345.1234AAAを入力すると、12345.123に変換されます。私はアルファベットの文字をトリミングするのではなく、その上に変換エラーをスローするようにしたいと思います。どうすればこれを達成できますか?

答えて

3

これは単に<f:convertNumber>で使用されるjava.text.NumberFormatstandard behaviorである:それは最初の許可されていない文字(例えば、文字または入力ロケールで定義されたものより小数セパレータその他)の後にすべてのエントリをトリミング。問題のキャラクタが先頭にある場合にのみ変換が失敗します。

誤って入力された値が意図しない値になったり、(さらに悪いことに気づいていない)自動補正が間違った値になったりすることがありません。

興味深いことに、特定の数値コンバータは異なる動作をします。 <f:converter converterId="javax.faces.Double" />を使用しても、数値以外の入力は自動的には処理されませんが、変換は失敗します。ただし、タグには、minFractionDigitsや通貨記号など、convertNumberの追加属性はありません。

別の方法として、in this answerのように標準コンバータを拡張する独自のカスタムコンバータを作成する方法があります。その後、文字の値をチェックして、それが見つかった場合にはさらに処理を中止します(変換例外に従う)。値にすでに文字がない場合は、あなたが派生したコンバータの標準的な動作を呼び出すことができます。

両方の点の欠点は、convertNumberの追加機能が失われていることです。 minFractionDigitscurrencySymbolなどの属性は<f:converter>にありません。必要な場合は、別の方法でパラメータを渡す必要があります。私たちの実装はこれらを必要としないので、これ以上検討していません(アプローチAに進みました)。しかし、this answerはそのようなアプローチを示しています。

関連する問題