2014-06-21 58 views
7

我有一個像字符串:在PHP中,如何從混合字符串獲取浮點值?

$str = "CASH55.35inMyPocket"; 

我想只得到55.35

我想:

$str = floatval("CASH55.35inMyPocket"); 

if($str>0){ 

    echo "Greater_Zero"; 


    }else{ 
     echo "LessZERO!!"; 
     } 
// echo "LessZERO!!"; 

我也試過:

$str = (float)"CASH55.35inMyPocket"; 

if($str>0){ 

    echo "Greater_Zero"; 


    }else{ 
     echo "LessZERO!!"; 
     } 
// echo "LessZERO!!"; 

根據文檔:

字符串將最有可能返回0雖然這依賴於 最左邊的字符的字符串。

所以,flotval(float)顯然只如果字符串是一樣的東西工作: 55.35aAbBcCdDeEfF ......但是將不工作,如果是這樣的:aAbBcC55.35dDeEfF

有沒有辦法讓浮動不管文字的位置如何?

+1

也許你必須使用'preg_match' – hindmost

+0

可能重複[從PHP中的字符串中提取浮點數](http://stackoverflow.com/q/944400) – mario

+1

沒有重複:問題在那裏,'string'以'Number'開始......在我的問題中'字符串**不必以數字​​開頭** ... –

回答

16

如果你不想使用正則表達式使用filter_var

$str = "CASH55.35inMyPocket"; 
var_dump((float) filter_var($str, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)); // float(55.35) 
+3

感謝'(float)'...沒有它,返回的值是一個字符串 –

+0

請你可以解釋'FILTER_FLAG_ALLOW_FRACTION'部分?....似乎無法理解,除了單獨使用「FILTER_SANITIZE_NUMBER_FLOAT」以外,爲什麼還需要它.... thx –

+0

[清理過濾器](http://www.php.net/manual/en/ filter.filters.sanitize.php),FILTER_SANITIZE_NUMBER_FLOAT將刪除除數字之外的所有字符,如果該標誌未設置,[更多信息](http://www.itechtalk.com/thread496.html) – Danijel

1

使用正則表達式:

preg_match('/([0-9]+\.[0-9]+)/', 'CASH55.35inMyPocket', $matches); 
$number = (float) $matches[1]; // 55.35 
1

您可以嘗試一點點功能使用兩種floatval(float)之前提取該值給你。

喜歡的東西:

function myFloats($str) { 

    if(preg_match("#([0-9\.]+)#", $str, $match)) { // search for number that may contain '.' 
    return floatval($match[0]); 
    } else { 
    return floatval($str); // take some last chances with floatval 
    } 
} 

然後進行測試:

echo myFloats("CASH55.35inMyPocket"); 
+0

這也匹配'3.3.3'或'...' – hek2mgl

+1

答案是完美的:'CASH55.35inMyPocket' – ErickBest

-1
function extract_numbers($string) 
{ 
preg_match_all('/([\d]+)/', $string, $match); 
return $match[0]; 
} 
1

我覺得preg_replace可能是有益的在這裏(未經測試):

$float = preg_replace('/[^0-9\.]/', "", "CASH55.35inMyPocket"); // only show the numbers and dots 

你可以擴展只要再多提一點得到[數字]。[數字],但在這種情況下,我認爲它會起作用。

+0

沒有幫助的情況下,如果它是.CASH55.35inMyPocket => .55.35 –

3

你有什麼不能被轉換成浮點數,因爲它看起來不像PHP浮點數。儘管可以使用正則表達式來獲取值。

如果您不確定是否總會有小數。而且你正試圖獲取數字,而不管文本中的位置(根據你的問題)。你可以使用:

^.*?([\d]+(?:\.[\d]+)?).*?$ 

從以下字符串得到的數值:

CASH55.35inMyPocket 
CASH55inMyPocket 
55.35inMyPocket 
55inMyPocket 
inMyPocket55.35 
inMyPocket55 

說明:http://regex101.com/r/tM8eM0
演示:http://rubular.com/r/Gw5HTzsejj
PHP演示:https://eval.in/165521

基本上它看起來數字在字符串中。並且可選地,在此之後還檢查小數。

+0

這可能是地球上最快的方式嗎? –

+1

最快以什麼方式?性能中的 – PeeHaa

+0

。與其他答案相比,你的看起來更短,只是想知道它是否也更快...... thx –

0

修改@ hek2mgl答案,同時獲得float和整數

preg_match('/([0-9]+\.?[0-9].)/', 'CASH55.35inMyPocket', $matches); 
$number = (float) $matches[1]; // 55.35 

preg_match('/([0-9]+\.?[0-9].)/', 'CASH55inMyPocket', $matches); 
$number = (float) $matches[1]; // 55 

preg_match('/([0-9]+\.?[0-9].)/', 'Total.CASH55.35inMyPocket', $matches); //with a dot before number 
$number = (float) $matches[1]; // 55.35