Преобразование числа с запятой в качестве десятичной точки, чтобы плавать - PullRequest
57 голосов
/ 01 декабря 2010

У меня есть список цен с запятой для десятичной точки и точкой в ​​качестве разделителя тысяч.

Некоторые примеры:

12,30
116,10
1.563,14

Они приходят в этом формате от третьей стороны. Я хочу преобразовать их в числа с плавающей точкой и сложить их вместе.

Каков наилучший способ сделать это? number_format , похоже, не работает с этим форматом, а str_replace кажется излишним, так как мне приходится делать это больше, чем один раз для каждого числа.

Есть ли лучший способ? Спасибо.

Ответы [ 7 ]

95 голосов
/ 01 декабря 2010

Использование str_replace() для удаления точек не является излишним.

$string_number = '1.512.523,55';
// NOTE: You don't really have to use floatval() here, it's just to prove that it's a legitimate float value.
$number = floatval(str_replace(',', '.', str_replace('.', '', $string_number)));

// At this point, $number is a "natural" float.
print $number;

Это почти наверняка наименее ресурсоемкий способ, которым вы можете сделать это, и есть вероятность, что даже если вы используете какую-то необычную функцию, это то, что он делает под капотом.

16 голосов
/ 01 декабря 2010

Если вы используете PHP5.3 или выше, вы можете использовать numfmt_parse , чтобы сделать «перевернутый номер_формат».Если нет, то вы застряли с заменой вхождений на preg_replace / str_replace.

11 голосов
/ 01 декабря 2010

Вы можете использовать NumberFormatter класс с его parse методом .

8 голосов
/ 22 мая 2017

Эта функция совместима для чисел с точками или запятыми в виде десятичных дробей

function floatvalue($val){
            $val = str_replace(",",".",$val);
            $val = preg_replace('/\.(?=.*\.)/', '', $val);
            return floatval($val);
}
$number = "1.325.125,54";
echo floatvalue($number); // The output is 1325125.54
$number = "1,325,125.54"; 
echo floatvalue($number); // The output is 1325125.54
7 голосов
/ 01 декабря 2010

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

$input = str_replace(array('.', ','), array('', '.'), $input); 

и затем обработайте числа оттуда, используя все преимущества свободно набираемой природы PHP.

4 голосов
/ 25 января 2018

Может показаться чрезмерным, но конвертирует любой заданный формат, независимо от локали:

function normalizeDecimal($val, int $precision = 4): string
{
    $input = str_replace(' ', '', $val);
    $number = str_replace(',', '.', $input);
    if (strpos($number, '.')) {
        $groups = explode('.', str_replace(',', '.', $number));
        $lastGroup = array_pop($groups);
        $number = implode('', $groups) . '.' . $lastGroup;
    }
    return bcadd($number, 0, $precision);
}

Выход:

.12           -> 0.1200
123           -> 123.0000
123.91        -> 12345678.9100
123 456 78.91 -> 12345678.9100
123,456,78.91 -> 12345678.9100
123.456.78,91 -> 12345678.9100
123 456 78,91 -> 12345678.9100
1 голос
/ 01 декабря 2010

из руководства по PHP:

str_replace - заменить все вхождения строки поиска с замещающая строка

Я бы пошел по этому маршруту, а затем преобразовал бы из строки в float - floatval

...