FormValidator::SimpleのGREATER_THANが整数しか比較できない件
表題のまんま。こんな条件でバリデートした。
- nullじゃない
- 整数部は3桁、小数部は2桁まで
- ↑より長さは1から6(ドットも含めて
- 0より大きい
使ったのはCatalystのコードの中で$c->form使ってだけど、つまりはこんなこと
use strict; use warnings; use CGI; use FormValidator::Simple; local $\ = "\n"; my $q = CGI->new; $q->param( rate => 3.14); my $r = FormValidator::Simple->check( $q => [ rate => ['NOT_BLANK', ['DECIMAL', 3, 2], ['GREATER_THAN', 0], ['LENGTH', 1, 6]] ] ); print $r->invalid('rate');
実行結果。
% perl greater_than.pl GREATER_THAN
何でやねーんと思いつつ、よく言われてた神の教えを思い出しつつソース読む。
神「何だと思ったらソース読めばいいよ」
podしか読まなかったり、アレコレ入力値変えてうまくいったらワーイとかだった小童もミジンコ程度ですが進歩しましたありがとう。
vi /usr/lib/perl5/site_perl/5.8.5/FormValidator/Simple/Validator.pm
sub GREATER_THAN { my ($self, $params, $args) = @_; my $data = $params->[0]; my $target = $args->[0]; unless ( defined $target && $target =~ /^\d+$/ ) { FormValidator::Simple::Exception->throw( qq/Validation GREATER_THAN needs a numeric argument./ ); } return FALSE unless $data =~ /^\d+$/; return ( $data > $target ) ? TRUE : FALSE; }
「これより大きい」に指定した値に、数字以外の文字が入ってたら問答無用で偽を返してました。
えーpodだって
GREATER_THAN
numeric comparison
としか書いてないじゃーん使いづらいよこれー
ここだけ正規表現で手動バリデート?とか思ってたら
森「100倍してから比較したら?」
と言われた。あーc言語やってた頃、四捨五入するときにそのテクニック使ったわーと思いつつ目からウロコ。
せっかく勉強しても忘れるなら駄目ダメだね!orz
ありがとう森さん。
でもこのGREATER_THANは使いづらいよー