タグを使用<f:convertNumber>
して 10 進入力を変換しています。
<f:convertNumber minFractionDigits="2" />
ただし、末尾のアルファベット文字は受け入れます。たとえば、入力12345.1234AAA
すると に変換され12345.123
ます。アルファベット文字をトリミングする代わりに、変換エラーをスローしたいと思います。どうすればこれを達成できますか?
タグを使用<f:convertNumber>
して 10 進入力を変換しています。
<f:convertNumber minFractionDigits="2" />
ただし、末尾のアルファベット文字は受け入れます。たとえば、入力12345.1234AAA
すると に変換され12345.123
ます。アルファベット文字をトリミングする代わりに、変換エラーをスローしたいと思います。どうすればこれを達成できますか?
これは単純に で使用されるの標準的な動作です。最初の許可されていない文字 (入力ロケールで定義されているもの以外の文字や小数点記号など) の後のすべてのエントリを削除します。問題のある文字が先頭にある場合にのみ変換が失敗します。java.text.NumberFormat
<f:convertNumber>
ユーザーは入力ミスした値がトリミングされたことに気付かない可能性があり、意図しない (さらに悪いことに) 気付かないうちに間違った値への自動修正が行われる可能性があるため、この動作はあまり好きではありません。
興味深いことに、特定の数値コンバーターの動作は異なります。Using<f:converter converterId="javax.faces.Double" />
は非数値入力を自動的に処理しませんが、代わりに変換に失敗します。ただし、このタグには、minFractionDigits や通貨記号など、convertNumber の追加属性はありません。
別のアプローチは、この回答で説明されているように、標準コンバーターを拡張する独自のカスタム コンバーターを作成することです。次に、文字の値を確認し、見つかった場合はそれ以降の処理を直接中止します (対応する変換例外をスローします)。値にすでに文字がない場合は、派生元のコンバーターの標準動作を呼び出すことができます。
どちらの方法の欠点も、 の追加機能が失われることですconvertNumber
。minFractionDigits
またはcurrencySymbol
on などの属性がない<f:converter>
ため、これが必要な場合は、パラメーターを渡す別の方法を見つける必要があります。私たちの実装ではこれらのいずれも必要としないため、これ以上詳しく調べていません (アプローチ A に進みました) が、この回答はそうするためのアプローチを示しています。