2017-07-18 34 views
0

我試圖轉換下列數字,以便所有具有相同的值5460(如果在第三個最後位置或5460處沒有逗號或點) ,如果有逗號或點,則爲00。使用preg_replace將貨幣數字換成第三個最後位置的點數

這裏是我的測試號:

5460 
5.460 
5.460€ 
5460,00 
5460,00€ 
5460.00 
5460.00€ 
5.460,00 
5.460,00€ 
5,460.00 
5,460.00€ 

我用了preg_replace以下的正則表達式:

preg_replace('/[^0-9\,\-]+/','',$number); 

的結果如下

5460 -> 5460 
5.460 -> 5460 
5.460€ -> 5460 
5460,00 -> 5460,00 
5460,00€ -> 5460,00 
5460.00 -> 546000 // wrong 
5460.00€ -> 546000 // wrong 
5.460,00 -> 5460,00 
5.460,00€ -> 5460,00 

我不知道如何優化正則表達式,這樣錯誤的值也會被正確地替換爲:

5460.00 -> 546000 // wrong because should be 5460,00 
5460.00€ -> 546000 // wrong because should be 5460,00 

測試用例:

$numbers = array('5460', '5.460', '5.460€', '5460,00', '5460,00€', '5460.00', '5460.00€', '5.460,00', '5.460,00€'); 
foreach ($numbers as $number) 
    echo $number." -> ".preg_replace('/[^0-9\,\-]+/','',$number) . "\n"; 

所以我不知道如何檢查,如果最後兩個數字前有一個點,如果是用逗號來取代它。但只限於最後兩位數字。

感謝

+0

但是...... 5460.00!= 546000!= 5460,00 – Daniel

+2

我必須同意丹尼爾的困惑。你爲什麼試圖將'5460.00'轉換爲'5460,00'?這個人是否有5千歐元,或54.6萬歐元?當然,你希望逗號在*三位數之前出現?像'546,000'一樣? –

+0

查看http://ideone.com/Juj0Hd –

回答

1

這做工作,但可能還有一個更簡單的解決方案:

$numbers = array('5460', '5.460', '5.460€', '5460,00', '5460,00€', '5460.00', '5460.00€', '5.460,00', '5.460,00€'); 
foreach ($numbers as $k => $number) { 
    $number = preg_replace('~[.,](?=\d{2}\b)|\p{Sc}~u', '#', $number); 
    $number = strtr(rtrim($number, '#'), ['#' => ',', '.' => '', ',' => '']); 
    echo $numbers[$k], ' -> ', $number, PHP_EOL; 
} 

模式的貨幣符號和點或逗號後面只有兩個數字相匹配。他們被替換爲破折號。

例如:5.460,00€ => 5.460#00#

然後破折號被剝離在右邊,並用剩餘的strtr破折號同時轉換爲逗號和逗號或點到空字符串。

0

考慮有多少不同的方式來寫的貨幣(甚至只是用歐元),你可能很難用一個簡單的正則表達式來識別「真」價值人正打算進入。

你可以從像PHP的money_format()獲益系統自動校正任何可能的混亂,通過與setlocale()設置地方:

setlocale(LC_MONETARY, 'de_DE'); 

$numbers = array('5460', '5.460', '5.460€', '5460,00', '5460,00€', '5460.00', '5460.00€', '5.460,00', '5.460,00€'); 
foreach ($numbers as $number) 
    echo money_format('%i', $number) . "\n"; 

這會自動帶輸入的任何值,並將其轉換爲德國等同。請記住,您還需要去掉歐元符號!

希望這會有所幫助! :)