2014-06-21 12 views
7

tôi nhận được một chuỗi như:Trong Php, cách lấy giá trị float từ một chuỗi hỗn hợp?

$str = "CASH55.35inMyPocket"; 

Tôi muốn nhận 55,35 chỉ.

tôi đã cố gắng:

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

if($str>0){ 

    echo "Greater_Zero"; 


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

Tôi cũng đã cố gắng:

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

if($str>0){ 

    echo "Greater_Zero"; 


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

Theo Tài liệu:

Strings rất có thể sẽ trở lại 0 mặc dù điều này phụ thuộc vào ký tự tận cùng bên trái của chuỗi.

Vì vậy, flotval(float) dường như chỉ có tác dụng nếu chuỗi là một cái gì đó như: 55.35aAbBcCdDeEfF ... nhưng sẽ không hoạt động nếu nó giống như: aAbBcC55.35dDeEfF

là có một cách để có được sự nổi không có vấn đề vị trí của văn bản?

+1

Có lẽ bạn phải sử dụng 'preg_match' – hindmost

+0

thể trùng lặp của [Trích xuất các số dấu chấm động từ một chuỗi trong PHP] (http://stackoverflow.com/q/944400) – mario

+1

KHÔNG DUPPLICATE: Câu hỏi ở đây, chuỗi 'bắt đầu bằng' Số' ... trong câu hỏi của tôi là ' string' ** không phải bắt đầu bằng một số ** ... –

Trả lời

16

Nếu bạn không muốn sử dụng biểu thức thông thường sử dụng filter_var:

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

Cảm ơn '(float)' ... không có nó, giá trị trả về là một chuỗi –

+0

Vui lòng giải thích phần "FILTER_FLAG_ALLOW_FRACTION" ? .... dường như không hiểu tại sao nó lại được yêu cầu ngoài việc có 'FILTER_SANITIZE_NUMBER_FLOAT '' một mình .... thx –

+0

[Sanitize filters] (http://www.php.net/manual/en/ filter.filters.sanitize.php), FILTER_SANITIZE_NUMBER_FLOAT sẽ xóa tất cả ký tự trừ chữ số nếu cờ đó không được đặt, [thêm thông tin] (http://www.itechtalk.com/thread496.html) – Danijel

1

Dùng regex:

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

Bạn có thể thử một chút chức năng để trích xuất giá trị đó cho bạn trước khi sử dụng một trong hai floatval hoặc (float).

Cái gì như:

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

sau đó kiểm tra:

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

Điều này cũng khớp với '3.3.3' hoặc' ... ' – hek2mgl

+1

Câu trả lời hoàn hảo cho:' CASH55.35inMyPocket' – ErickBest

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

Tôi nghĩ rằng một preg_replace có thể là hữu ích ở đây (chưa được kiểm tra):

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

Bạn có thể mở rộng preg nhiều hơn một chút để chỉ [số], nhưng trong trường hợp này tôi nghĩ nó sẽ hoạt động.

+0

Không hữu ích trong trường hợp nếu nó là .CASH55.35inMyPocket => .55.35 –

3

Những gì bạn không thể được đúc thành một phao, bởi vì nó không giống như một phao từ quan điểm của PHP. Có thể lấy giá trị bằng cách sử dụng regex.

Nếu bạn không chắc chắn liệu sẽ luôn có số thập phân hay không. Và bạn đang cố gắng để có được số lượng bất kể vị trí trong văn bản (theo câu hỏi của bạn).Bạn có thể sử dụng:

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

nào được các giá trị số từ chuỗi kí tự sau:

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

Giải thích: http://regex101.com/r/tM8eM0
Demo: http://rubular.com/r/Gw5HTzsejj
PHP demo: https://eval.in/165521

Về cơ bản nó sẽ tìm kiếm số trong chuỗi. Và tùy chọn nó cũng kiểm tra số thập phân sau đó.

+0

Đây có phải là cách nhanh nhất trên trái đất? –

+1

Nhanh nhất theo cách nào? – PeeHaa

+0

trong Hiệu suất. So với các câu trả lời khác, Yours có vẻ ngắn hơn và chỉ tự hỏi nếu nó cũng nhanh hơn ... thx –

0

Sửa @ hek2mgl câu trả lời để có được cả hai con số float và số nguyên

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 
Các vấn đề liên quan