2010-05-31 47 views
1

PHP有許多內置函數來驗證數字,但他們都期望輸入計算機格式:1234.56。我需要驗證像1,234.56(英文)或1.234,56(西班牙文)以及一些典型屬性(可接受的範圍,最大小數位數等)之類的內容。驗證已知國家格式的十進制數

我開始寫我自己的功能,但我很快就迷路了。很容易讀取用戶輸入到浮點變量,但我想能夠檢測具有無效格式的數字,如1,23456.71..25

你對此有何建議?

(十進制和萬字都事先知曉的,它的好硬編碼數字組三,沒有必要支付Indian number format。)

回答

3

退房NumberFormatter::parse。你可以用它解析許多語言環境中的數字。整個intl擴展是有用的,儘管它還不是「那裏」。

+0

不幸的是,只適用於PHP 5.3+,但不錯的解決方案,不知道。 – 2010-05-31 10:22:35

-1

你執行所有的計算和結果的變量,你可以使用內置功能number_format按照您的要求進行格式化。

+0

我不想從float轉換爲string。我想驗證一個字符串是否包含國家格式的有效數字。 '12.345'是一個有效的數字,但我不能將它存儲在DECIMAL(4,2)列中。 '1000'是有效的號碼,但不是有效的折扣。 – 2010-05-31 09:53:49

1

我在php手冊的註釋中發現了一個有趣的功能:http://fr2.php.net/manual/en/language.types.float.php#92885 看一看。

+0

儘管沒有直接應用於我的問題,但這是一個詼諧的方法。太糟糕了,我在受到Windows實現中的一些錯誤後感到害怕setlocale()。 – 2010-05-31 10:35:46

1

您可以使用正則表達式來驗證數字:

$ds = '.'; // Decimal separator 
$ts = ','; // Thousand separator 

$isValidFloat = preg_match(
    '/^ 

     # Integer part, one of the two allowed formats: 
     # 1) with thousand separator, grouped by 3 digits 
     # 2) without thousand separator 
     (\d{1,3}(' . preg_quote($ts) . '\d{3})* | \d+) 

     # Optional decimal part 
     (' . preg_quote($ds) . '\d+)? 

    $/x', $string); 

,並將其轉換爲float這樣的:

$float = (float) strtr($string, array($ts => '', $ds => '.')); 
1

除了給定的解決方案,我建議PEAR Validation package驗證數字。

下面是從他們的網站的例子:

<?php 
require_once 'Validate.php'; 

$number = '-8,1'; 
if (Validate::number($number, 
    array('decimal' => '.,', 'min' => -9, 'max' => -7))) { 
    echo 'Valid'; 
} else { 
    echo 'Invalid'; 
} 

如果你想成爲的格式更嚴格,那麼你可以分析它爲float(您已完成),然後用number_format輸出浮動轉換爲您接受的格式,並嘗試將原始格式與您生成的任何格式進行匹配。

+0

我會看看它。 (最好不要那麼嚴格:對我來說,'1000.5'和'1,000.50'一樣有效。) – 2010-05-31 10:53:07