Преобразование числа с запятой в виде десятичной точки для плавания
У меня есть список цен с запятой для десятичной точки и точкой в виде разделителя тысяч.
Некоторые примеры:
12,30
116,10
1.563,14
Они поступают в этом формате от третьего лица. Я хочу преобразовать их в float и добавить их вместе.
Каков наилучший способ сделать это? number_format, похоже, не работает с этим форматом, а str_replace кажется излишним, поскольку я должен сделать это больше, чем один раз на каждом номере.
Есть ли лучший способ? Спасибо.
Ответы
Ответ 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.
Ответ 3
Вы можете использовать класс NumberFormatter с помощью parse
method.
Ответ 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