【发布时间】:2011-07-13 11:49:18
【问题描述】:
是否有一种独特的方法来确定变量值是否为 一个数字,因为这些值也可以是科学计数法(例如,5.814e-10)?
【问题讨论】:
-
“有没有独特的方法”——不,这是 Perl,TMTOWTDI! :)
标签: regex perl numbers perl-module
是否有一种独特的方法来确定变量值是否为 一个数字,因为这些值也可以是科学计数法(例如,5.814e-10)?
【问题讨论】:
标签: regex perl numbers perl-module
核心模块Scalar::Util 导出looks_like_number(),它可以访问底层Perl API。
looks_like_number EXPR如果 perl 认为
EXPR是一个数字,则返回 true。
【讨论】:
来自 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 获得
【讨论】:
还有String::Numeric和Regexp::Common::number..看起来很方便。
String::Nummeric 也有一个"a comparison with Scalar::Util::looks_like_number()"
【讨论】:
改编自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' 不是数字。