【问题标题】:Perl, how to determine if a variable value is a number?Perl,如何确定变量值是否为数字?
【发布时间】:2011-07-13 11:49:18
【问题描述】:

是否有一种独特的方法来确定变量值是否为 一个数字,因为这些值也可以是科学计数法(例如,5.814e-10)?

【问题讨论】:

标签: regex perl numbers perl-module


【解决方案1】:

核心模块Scalar::Util 导出looks_like_number(),它可以访问底层Perl API。

looks_like_number EXPR

如果 perl 认为 EXPR 是一个数字,则返回 true。

【讨论】:

    【解决方案2】:

    来自 perlfaq4:How do I determine whether a scalar is a number/whole/integer/float?

        if (/\D/)            { print "has nondigits\n" }
        if (/^\d+$/)         { print "is a whole number\n" }
        if (/^-?\d+$/)       { print "is an integer\n" }
        if (/^[+-]?\d+$/)    { print "is a +/- integer\n" }
        if (/^-?\d+\.?\d*$/) { print "is a real number\n" }
        if (/^-?(?:\d+(?:\.\d*)?|\.\d+)$/) { print "is a decimal number\n" }
        if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
                { print "a C float\n" }
    

    还有一些常用的任务模块。

    Scalar::Util(随 5.8 发布)提供对 perl 内部函数 looks_like_number 的访问,用于确定变量是否看起来像数字。

    Data::Types 导出使用上述和其他正则表达式验证数据类型的函数。

    第三,Regexp::Common 有正则表达式来匹配各种类型的数字。

    这三个模块可从 CPAN 获得

    【讨论】:

      【解决方案3】:

      还有String::NumericRegexp::Common::number..看起来很方便。

      String::Nummeric 也有一个"a comparison with Scalar::Util::looks_like_number()"

      【讨论】:

        【解决方案4】:

        改编自How do I tell if a variable has a numeric value in Perl?中的回答——

        for my $testable ( qw( 1 5.25 0.001 1.3e8 foo bar 1dd 0 ) )
        {
            printf("%10s %s a number\n",
                   $testable,
                   isa_number($testable) ? "is" : "isn't")
        }
        
        sub isa_number {
            use warnings FATAL => qw/numeric/;
            my $arg = shift;
            return unless defined $arg;
            eval { $arg + 0; 1 };
        }
        

        【讨论】:

        • 您的isa_number 认为'0' 不是数字。
        猜你喜欢
        • 2011-04-17
        • 1970-01-01
        • 2013-11-22
        • 2016-11-18
        • 1970-01-01
        • 2015-09-28
        • 2017-04-28
        • 1970-01-01
        • 2010-09-05
        相关资源
        最近更新 更多