JSFのコンポーネント検証をしている後輩から「サンプルでこんなん書いたんですけど、駄目なケースがあります」と相談がきました。内容は、実数入力のテキストボックスで小数点以下の桁数を指定するもの。
以下のような例です。
<h:inputText id="inputText" value="#{validatorInput.inputValidatorTxt}" >
<f:validateDoubleRange id="vldDoubleRange" for="inputText" minimum="1.5" maximum="99.9" />
<f:converter id="cvt" for="inputText" converterId="javax.faces.Double" />
<f:convertNumber id="vldConvertNumber" for="inputText" type="number" maxFractionDigits="5" minFractionDigits="3" />
</h:inputText>
1つ目のValidatorは範囲を縛ってて「1.5以上、99.9以下」ですよ、と。
2つ目のConverterは実数(Double)にしなさない、と。
3つ目のConverterは実数の小数点以下で、最小3桁、最大5桁にしなさい、と。
ふむふむ。
触ってみると
テキストに「a」入力→'a' は数字ではありません。OK
テキストに「1」入力→検証エラー: 指定された属性が 1.5 と 99.9 の間の期待値にありません。OK
テキストに「2」入力→テキストに「2.000」と表示。OK
テキストに「99.8」入力→テキストに「99.800」と表示。OK
テキストに「2.123456」入力→テキストに「2.12346」と表示。仕様的に四捨五入決め打ちでいいか微妙ですが、まあOK
問題なさげで、「何が問題なの?」と聞くと「2a」と打ってくださいとのこと。
テキストに「2a」入力→「2.000」!?NGじゃね。ここは数字じゃない、と怒ってほしい所。
うーん。
順番が悪いんじゃない?と上下の順序を色々入れ替えたりしましたが、何かしら駄目な挙動があります。
わからない…。
結局二人で話し合った結果、小数点の最大桁数以上を入力して、コンバータで四捨五入された値が格納されることも微妙だよね、という話になって、小数点以下に指定した桁数以上を入れたら怒るようなカスタムバリデータを作ることにしました。
カスタム作らずに標準機能で何とかできないのかなぁ、なんか気になります。連休に考えてみるか…。