FormValidator::SimpleのGREATER_THANが整数しか比較できない件

表題のまんま。こんな条件でバリデートした。

  1. nullじゃない
  2. 整数部は3桁、小数部は2桁まで
  3. ↑より長さは1から6(ドットも含めて
  4. 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は使いづらいよー