2010-11-04 80 views
3

在perl中,我想检查给定的变量是否包含浮点数。要检查这个我使用,检查一个数是int还是浮点数

my $Var = 0.02 # Floating point number 

if (int($Var) != $Var) { 

    # floating point number 
} 

但上面的代码不会为0.0工作,

我怎样才能做到这一点?

+3

什么正确回答你的问题完全取决于你为什么想知道的。你计划对浮点数有什么不同? – ysth 2010-11-04 09:18:33

回答

14

这是一个常见问题解答。请参见How do I determine whether a scalar is a number/whole/integer/float?

您也可以使用Scalar::Util::Numeric

有趣的是,

#!/usr/bin/perl 

use strict; use warnings; 
use Scalar::Util::Numeric qw(isint); 

my $x = 0.0; 
print "int\n" if isint $x; 

打印int(如果你看看源代码并不奇怪),基于@ tchrist的评论,应该可以看的变量结构提供的信息来区分00.0

#!/usr/bin/perl 

use strict; use warnings; 
use Devel::Peek; 

my $x = 0.0; print Dump $x; 
my $y = 0; print Dump $y; 
    $y *= 1.1; print Dump $y; 

输出:

SV = NV(0x18683cc) at 0x182c0fc 
    REFCNT = 1 
    FLAGS = (PADMY,NOK,pNOK) 
    NV = 0 
SV = IV(0x182c198) at 0x182c19c 
    REFCNT = 1 
    FLAGS = (PADMY,IOK,pIOK) 
    IV = 0 
SV = PVNV(0x397ac) at 0x182c19c 
    REFCNT = 1 
    FLAGS = (PADMY,NOK,pNOK) 
    IV = 0 
    NV = 0 
    PV = 0

在我看来,检查将不得不看看是否设置了NOK标志。即使是最简单的XS也要花费我很长时间,所以我不会提供实现。

+0

你必须寻找是否有NV的独特IV。 – tchrist 2010-11-04 06:58:57

+1

使用基于glibc的系统,您可以区分:'$ x eq - $ x? 'IV':'NV'' – ysth 2010-11-04 09:17:02

7
($Var - int($Var))?'float':'int' 
+1

警告:这将调用一个字符串“int”。它验证数字,但不能保证'$ Var'实际上是数字。 – stevesliva 2017-08-09 18:00:00

1

您可以使用自动装箱::通用模块,这是autobox的一部分。

#! /usr/bin/perl 

use autobox::universal qw(type); 

my $x = 42; 
print type($x), "\n";; 

$x = 42.0; 
print type($x), "\n"; 

输出:

INTEGER 
FLOAT