Подтвердить что ты не робот

Преобразование числа с запятой в виде десятичной точки для плавания

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

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

12,30
116,10
1.563,14

Они поступают в этом формате от третьего лица. Я хочу преобразовать их в float и добавить их вместе.

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Если вы используете PHP5.3 или выше, вы можете использовать numfmt_parse для выполнения "обратного number_format". Если вы этого не сделаете, вы застряли с заменой записей с помощью preg_replace/str_replace.

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

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