I have a list of prices with a comma for a decimal point and a dot as the thousand separator.
Some examples:
12,30
116,10
1.563,14
These come in this format from a third party. I want to convert them to floats and add them together.
What is the best way to do this? number_format doesn't seem to work with this format, and str_replace seems like overkill, as I have to do it more that once on each number.
Is there are better way? Thanks.
This question is related to
php
parsing
floating-point
This function is compatible for numbers with dots or commas as decimals
function floatvalue($val){
$val = str_replace(",",".",$val);
$val = preg_replace('/\.(?=.*\.)/', '', $val);
return floatval($val);
}
This works for all kind of inputs (American or european style)
echo floatvalue('1.325.125,54'); // The output is 1325125.54
echo floatvalue('1,325,125.54'); // The output is 1325125.54
echo floatvalue('59,95'); // The output is 59.95
echo floatvalue('12.000,30'); // The output is 12000.30
echo floatvalue('12,000.30'); // The output is 12000.30
Might look excessive but will convert any given format no mater the locale:
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);
}
Output:
.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
You could use the NumberFormatter class with its parse
method.
If you're using PHP5.3 or above, you can use numfmt_parse to do "a reversed number_format". If you're not, you stuck with replacing the occurrances with preg_replace/str_replace.
Assuming they are in a file or array just do the replace as a batch (i.e. on all at once):
$input = str_replace(array('.', ','), array('', '.'), $input);
and then process the numbers from there taking full advantage of PHP's loosely typed nature.
from PHP manual:
str_replace — Replace all occurrences of the search string with the replacement string
I would go down that route, and then convert from string to float - floatval
Source: Stackoverflow.com