2009-07-11 259 views
9

我正在使用Perl将一些XML转换为JSON。如果XML属性是一个数字,我不想在它周围加引号,以便JSON将它视为数字而不是字符串。我如何判断一个Perl字符串是否是一个数字(只包含数字0到9以及可能的一个小数点)?在Perl中,如何判断字符串是否是数字?

回答

19

JSON specification提供了一个数字的格式相当明确的规则,所以下面的正则表达式应该工作:

/^-?(0|([1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?$/ 
20

尝试Scalar::Util::looks_like_number

如:

use Scalar::Util qw(looks_like_number); 

if (looks_like_number($thingy)) { 
    print "looks like $thingy is a number...\n" 
} 
+7

只是意识到,look_like_number对'inf','nan','1E02'返回true,并且可能还有其他几个字符串,您可能不希望它们是数字。 – mirod 2009-07-11 05:01:58

+2

为什么`1E02`不能成为一个数字?它的科学计数为100. – 2009-09-11 12:30:03

2

我觉得this来自perlfaq的问题解决了您的问题。

通常问题在于确定您想要读取的数字是什么。

  • 是“-1.312”的有效数字吗?
  • 是“inf”?
  • 5.34123412E-03?
4

您可以强制它成为一个数字,然后将其与原始字符串进行比较。

if($value eq $value+0){ 
    print "$value is a number\n"; 
} 

(注:它只会为简单的数字的工作,像123或12.3)

-1

你只是读取XML到Perl中的数据结构,并让Perl的JSON可能更容易图书馆找出你的。它已经检查了这一点,所以除非你的数字实际上是XML中的一个字符串(例如它后面有一个空格等),否则JSON->encode()会将它编码为JSON数字。

3

我认为(从最近的经验)你犯了一个错误的手动XML-> JSON转换。在这个过程中,我遇到了很多问题,其中最重要的是涉及不正确逃脱的角色。

我会推荐用许多XML :: *模块之一(我使用XML :: Simple)解析XML,然后使用JSON :: XS将其渲染为JSON。 JSON :: XS允许您将Perl数据结构转换为JSON; XML :: Simple将XML解析为Perl数据结构。同时,您可以根据需要操作Perl数据结构。

底线是你不再关心引用/转义字符。

3

假设你不需要支持不同寻常的东西(如SCI-符号)这种近乎工作(而且是非常简单):

#!/usr/bin/perl 

my $foo = '1234.5'; 

if($foo =~ /\d+/){ 
    print "$foo is a number\n"; 
} 

的原因,它不完全工作,因为你可以有连字符和点(只要你有至少一个数字)。 '--1--2'评估为零,'1.2.3.4.5'评为1.2(第二个点和后面的所有内容都被忽略)。这对你来说可能是也可能不是问题。

相关问题