2013-03-12 50 views
5

Tôi có một mảng các giá trị hỗn hợp:PHP: Nếu số (với dấu phẩy), chuyển đổi nó sang định dạng số bên phải (với điểm)

$row = array('Unspecified risk','Yes','8','3','2','13','none','-1,49','-2,51','-1,46','-1,54'); -1,94 -1,55 

Như bạn có thể nhìn thấy nó chứa văn bản và cả dấu phẩy tiêu cực và tích cực -Số.

Tôi cần chuyển đổi giá trị số thành định dạng số đúng và để nguyên giá trị văn bản.

Bây giờ tôi đang lặp qua các giá trị:

foreach ($row as $value) { 
    // If $value is numeric, convert it to the 
    // right number format for use with MySQL (decimal(10,2)) 
    // If not, leave it be. 
} 

Hai câu hỏi liên quan Tôi đã điều tra nhưng không thể tìm thấy một giải pháp phù hợp.

bất cứ ai có thể cung cấp một ví dụ thực tế?

Trả lời

6

Bạn không cần sử dụng cụm từ thông dụng.

sử dụng str_replace() như bạn cần phải thay thế ',' cho một '.', và sau đó sử dụng intval() hoặc floatval() chức năng để có được những giá trị số. Bạn cũng có thể sử dụng strstr() để tìm '.' và quyết định nếu sử dụng intval() hoặc floatval()

Ví dụ:

$row = array('Unspecified risk', 'Yes', '8', '3', '2', '13', 'none', '-1,49', '-2,51', '-1,46', '-1,54'); 

    function toNumber($target){ 
     $switched = str_replace(',', '.', $target); 
     if(is_numeric($target)){ 
      return intval($target); 
     }elseif(is_numeric($switched)){ 
      return floatval($switched); 
     } else { 
      return $target; 
     } 
    } 

    $row = array_map('toNumber', $row); 

    var_dump($row); 

Chúng tôi sử dụng str_replace() để thay thế các dấu chấm cho dấu phẩy, cách này đó là một ký hiệu phao quốc tế , ngay cả khi nó trên chuỗi, cách này sau này chúng ta có thể kiểm tra xem đó là số với is_numeric() < - chức năng này là tuyệt vời như nó phát hiện từ một chuỗi nếu nó là một số hay không, không có vấn đề số nguyên hoặc phao vv. Chúng tôi sử dụng is_n umeric để kiểm tra nếu giá trị là số nguyên float hoặc văn bản và trả lại giá trị tương ứng bằng cách sử dụng intval() hoặc floatval() (giá trị không có thay thế được áp dụng sẽ không trở lại dưới dạng số hợp lệ, chỉ sau khi chuyển đổi, và. nó sẽ trả về true dưới dạng số).

Chúng tôi sử dụng $row = array_map('toNumber', $row); để áp dụng các thay đổi cho mảng.

Lợi nhuận xD

+0

Cảm ơn đã trả lời. Nhưng làm cách nào để phân biệt giữa giá trị văn bản và giá trị số? – maartenmachiels

+0

với is_numeric(), kiểm tra chỉnh sửa của tôi: D – aleation

+0

Giải pháp rất thanh lịch! Cảm ơn vì những nỗ lực của bạn: nó hoạt động như một sự quyến rũ. – maartenmachiels

1
$row = array('Unspecified risk','Yes','8','3','2','13','none','-1,49','-2,51','-1,46','-1,54'); 
    foreach($row as $key => $var) { 
     if(strstr($var, ",") && !is_numeric($var)) { 
      $var1 = str_replace(",","", $var); 
      if(is_numeric($var1)) { 
       $decimal = strstr($var, ',', TRUE); 
       $digits = str_replace($decimal, "", $var1); 
       $finalValue = $digits * pow(10,$decimal); 
       $row[$key] = $finalValue; 
      } 
     } 
    } 
    echo "<pre>"; print_r($row); 

Chú ý: Đây sẽ làm việc cho php 5.3 hoặc php 5.3+

+1

checkout floatval() trong tài liệu php, nếu bạn sử dụng floatval ($ var1) sau str_replace() nó sẽ nhận được giá trị trực tiếp.Bạn sẽ không cần phải thực hiện 4 thao tác sau – aleation

+1

Cảm ơn câu trả lời của bạn! – maartenmachiels

0

Sử dụng is_numeric để kiểm tra và number_format để định dạng

foreach ($row as &$value) { 
    $number = str_replace(',','.'); 
    if(is_numeric($number)) 
     $value = number_format($number, 2, '.', ''); 
} 
unset($value);