2012-08-07 31 views
0
1.449,00 
1.000.000,55 
19,90 
etc 
etc 

我知道我上面列出的是非常可變的,但有貨幣的可能性。我正在尋找一個preg_match()示例或任何其他函數來處理上面的可能情況。我試着用下面的例子,但它不能正常工作。有沒有機會給我一個最合適的模式呢?preg_match()或類似的功能檢查貨幣

if (! preg_match('/^[0-9.,]$/', $currency)) { echo 'No good.'; } 
+0

你應該看看[ 'NumberFormatter'](http://www.php.net/manual/en/class.numberformatter.php)。 – Florent 2012-08-07 16:19:35

回答

4

像這樣的東西應該工作:

/^((?:\d{1,3}[,\.]?)+\d*)$/ 

這符合:

^   - Start of string 
(  - Capture the following: 
(?:  
    \d{1,3} - One to three digits 
    [,\.]? - And an optional separator (comma or period) 
)+  - One or more times 
\d*  - Zero or more digits 
) 
$   - End of string 

它通過一切迭代匹配到分離器的左側(如果它存在),然後有\d*拿起任何可選的部分貨幣。你可以看到它通過all of your tests

編輯:更新的正則表達式如下:

^((?:\d\.\d{3}\.|\d{1,3}\.)?\d{1,3},\d{1,2})$ 

我們在哪裏匹配任何一種:

  • \d\.\d{3}\. - 一個數字,一個時期,三位,爲期或
  • \d{1,3}\. - 一位和三位數字,一段時間
  • 以上都不是(因爲?

然後,我們匹配:

  • \d{1,3}, - 一個三位數和一個逗號,後跟
  • \d{1,2} - 一位或兩位數字
+0

我覺得我的答案後修改了語法以減少可能性,所以只有'2或1位數字出現在逗號後面並且最多7位數字在逗號前面並且只與點分開。上面的鏈接給我「服務器錯誤」。對不起,我們可以修改你的代碼來減少這種模式嗎?謝謝 – BentCoder 2012-08-07 16:44:08

+0

@MadMax - 我已經更新了我的答案,它應該是你要找的。 – nickb 2012-08-07 16:53:42

+0

完美。謝謝 – BentCoder 2012-08-07 20:07:24

0

添加+]後允許不僅僅是一個性格比較。