2009-07-11 304 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(第二個點和後面的所有內容都被忽略)。這對你來說可能是也可能不是問題。

相關問題