PHP: если число (с запятой), преобразуйте его в правильный формат чисел (с точкой)

у меня есть массив из смешанных значений:

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

Как вы можете видеть, он содержит текст и как отрицательные, так и положительные запятые.

мне нужно преобразовать числовые значения в правильный формат чисел и оставить текстовые значения как есть.

теперь я перебираю значения:

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

два связанных вопроса, которые я исследовал, но не могу найти подходящее решение.

  • преобразование числа с запятой в качестве десятичного точка для float
  • мне нужно регулярное выражение php для числового значения, включая " - "и","

может ли кто-нибудь привести практический пример?

3 ответов


вам не нужно использовать регулярные выражения.

использовать str_replace() Как вам нужно, чтобы заменить ',' на '.', а затем использовать intval() или floatval() функции для получения числового значения. Вы также можете использовать strstr() искать '.' и решить, если с помощью intval() или floatval()

пример:

$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);

мы используем str_replace() для замены точки для запятой, таким образом, это международный поплавок нотации, даже если он находится на строке, этот путь позже далее мы можем проверить, если это число is_numeric()

мы используем is_numeric, чтобы проверить, является ли значение целочисленным float или text и вернуть соответствующее значение с помощью intval() или floatval() (значение без примененной замены не будет возвращено в качестве допустимого числа, только после переключения, и . он вернет true как numeric).

мы используем:$row = array_map('toNumber', $row); применить изменения в массиве.

прибыль xD


$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);

Примечание: это будет работать для php 5.3 или php 5.3+


использовать is_numeric чтобы проверить и number_format в формате

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