2011-04-21 85 views
1

我需要能夠從幾個變量中去除字符,只留下數字和£符號(除非mysql本身可以添加它)?還有任何.分隔符。從變量中剝離出文本字符,留下數字和逗號?

所以如果變量$price_data contains

Now £193.95

我如何結束了

193.95

我需要這樣做的原因是我需要能夠將數據作爲十進制插入到字段中,並且能夠從最小到最昂貴的方式安排它。

+0

一個天真的正則表達式將是'的preg_replace( '/ [^ \ d \。] /', '',$ price_data)',但它不能保證你有一個有效的貨幣數字,只是該字符串現在只有數字和小數。 – 2011-04-21 19:47:26

回答

1

根據輸入數據,它可能是更可靠的,以消除任何開頭或結尾的非數字:

$price = preg_replace('_^\D+|\D+$_', "", $price_data); 

如果用數字括起來,它會留在點中,並且可以與文字£以及£轉義一起使用,並刪除任何尾隨的垃圾。

+0

工程太棒了! - 如果可能,你介意給'_^\ D + | \ D + $ _'一點解釋嗎?我理解它是選擇和替換某些字符的正則表達式,但它究竟會做什麼 - 關於我的可變數據? – Dave 2011-04-22 10:24:33

+0

這個例子中的這個正則表達式有兩個選擇,用'|'或破折號表示。第一部分查看字符串「^」的開頭,並刪除任何非小數點'\ D +'(一個或多個字符)。 '\ d'代表小數,但大寫的'\ D'是反值(=非小數)。 '|'後面的另一半查找相同的內容,但匹配字符串'$'的末尾。 – mario 2011-04-22 11:06:43

+0

非常感謝你! – Dave 2011-04-24 10:19:38

1

試試這個:

$price_data = "Now £193.95"; 

list($t, $price) = explode('£',$price_data); 

//$price should now contain 193.95 

這裏是一個演示:http://codepad.org/az87F5wA

1

財務數據應被存儲爲整數,而不是浮由於與浮動數據類型的精度損失:http://en.wikipedia.org/wiki/Precision_(computer_science)

因此,應在MySQL將其存儲爲一個整數(表示美分)用下面的代碼只提取數字:

$subject = 'Now £193.95'; 
preg_match_all('/\\d/', $subject, $result, PREG_PATTERN_ORDER); 
$result = implode('', $result[0]); 
if(!empty($result)){ 
    $result = intval($result); 
}else{ 
    $result = 0; 
} 
var_dump($result); 

另外,當你在整數類型上執行除法時要小心,因爲你可以「失去分」。

HTH