2014-06-21 16 views
7

mam ciąg jak:W PHP, jak uzyskać wartość zmiennoprzecinkową z mieszanego ciągu znaków?

$str = "CASH55.35inMyPocket"; 

Chcę dostać 55.35 tylko.

Próbowałem:

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

if($str>0){ 

    echo "Greater_Zero"; 


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

Próbowałem również:

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

if($str>0){ 

    echo "Greater_Zero"; 


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

Zgodnie z dokumentacją:

Struny najprawdopodobniej powrót 0 chociaż to zależy od LEFTMOST znaków ciągu.

Więc flotval i (float) najwyraźniej działają tylko wtedy, gdy ciąg jest coś takiego: 55.35aAbBcCdDeEfF ... ale nie będzie działać, jeśli to jest jak: aAbBcC55.35dDeEfF

czy istnieje sposób, aby uzyskać pływaka bez względu na pozycję tekstu?

+1

Prawdopodobnie trzeba użyć 'preg_match' – hindmost

+0

możliwy duplikat [Wyodrębnij liczby zmiennoprzecinkowe z ciągu w PHP] (http://stackoverflow.com/q/944400) – mario

+1

BRAK DUPPLICATE: Pytanie tam, "string" zaczyna się od 'Number' ... w moim pytaniu,' string' ** nie musi zaczynać się od cyfry ** ... –

Odpowiedz

16

Jeśli nie chcesz korzystać z wyrażeń regularnych używać filter_var:

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

Dzięki za '(float)' ... bez niego zwracana wartość jest ciągiem znaków –

+0

Proszę wyjaśnić część "FILTER_FLAG_ALLOW_FRACTION" ? .... nie może zrozumieć, dlaczego jest wymagane, inne niż posiadanie '' FILTER_SANITIZE_NUMBER_FLOAT "' sam .... thx –

+0

[Filtry do dezynfekcji] (http://www.php.net/manual/en/ filter.filters.sanitize.php), FILTER_SANITIZE_NUMBER_FLOAT usunie wszystkie znaki oprócz cyfr, jeśli ta flaga nie jest ustawiona, [więcej informacji] (http://www.itechtalk.com/thread496.html) – Danijel

1

Użyj regex:

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

Można spróbować trochę funkcji, aby wyodrębnić tę wartość dla Ciebie przed użyciem albo floatval lub (float).

Coś jak:

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 
    } 
} 

następnie Test:

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

To również pasuje do '3.3.3' lub' ... ' – hek2mgl

+1

Odpowiedź jest idealna dla:' CASH55.35inMyPocket' – ErickBest

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

myślę, że preg_replace mogłyby być pomocne tutaj (niesprawdzone):

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

Można przedłużyć preg tylko trochę więcej get [numer]. [numer], ale w tym przypadku myślę, że zadziała.

+0

Nie przydatne w przypadku, jeśli jest .CASH55.35inMyPocket => .55.35 –

3

To, co masz, nie może zostać przeniesione do float, ponieważ nie wygląda jak float z perspektywy PHP. Możliwe jest pobranie wartości za pomocą wyrażeń regularnych.

Jeśli nie masz pewności, czy zawsze będzie dziesiętny. Próbujesz uzyskać numer niezależnie od pozycji w tekście (jak na twoje pytanie).Można użyć:

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

pobierającą wartości liczbowych z następujących ciągów:

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

Objaśnienie: http://regex101.com/r/tM8eM0
Demo: http://rubular.com/r/Gw5HTzsejj
demo PHP: https://eval.in/165521

Zasadniczo wygląda na liczby w ciągu. Opcjonalnie sprawdza również po przecinku miejsca po przecinku.

+0

Czy to prawdopodobnie najszybsza droga na ziemi? –

+1

Najszybciej w jaki sposób? – PeeHaa

+0

w Performance. W porównaniu do innych odpowiedzi, Twoja wydaje się krótsza i zastanawiam się, czy jest Szybsza ... thx –

0

Modyfikowanie @ hek2mgl odpowiedź dostać oba numery pływak i całkowite

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 
Powiązane problemy