Simple function to convert numbers from SI notation to float:
– decimal point separator – dot or comma
– thousands separator – space
In this case used to load money value from strings in different formats.
Examples:
##
# ###
# ###, #
# ###.#
#,###
12 -> 12
1 234 -> 1234
1 234,5 -> 1234.5
1 234.5 -> 1234.5
1,234 -> 1.234
<?php
$validTests = [
'1 234',
'-1 234',
'- 1 234',
'1 234.00',
'-1 234.00',
'1 234,00',
'-1 234,00',
'1234',
'-1234',
'1234.00',
'-1234.00',
'1234,00',
'-1234,00',
'1 234,00000000000',
'1234,00000000000',
'1 234,34545654565',
'-1 234,34545654565',
'1234,34545654565',
'-1234,34545654565',
'1 234 567',
'1 234 567.00343',
'1 234 567,34565',
'1.234',
];
$invalidTests = [
'-1 $',
'1,234.00',
'1.234,00',
'-1.234,00',
'-1.234.567',
'-1.234.567,00',
'-1,234,567.00',
];
function getAmountValue($money)
{
$value = trim($money);
$value = str_replace(' ', '', $value);
$invalidCharacters = preg_replace('/([0-9\.,-])/i', '', $value);
if (!empty($invalidCharacters)) {
throw new InvalidArgumentException('Money value string "' . $value . '" contains invalid characters: "' . $invalidCharacters . '"!');
}
$separatorsCount = mb_substr_count($value, '.') + mb_substr_count($value, ',');
if ($separatorsCount > 1) {
throw new InvalidArgumentException('Money value string "' . $value . '" contains more than 1 separator!');
}
$value = str_replace(',', '.', $value);
return (float)$value;
}
foreach ($validTests as $money) {
try {
$value = getAmountValue($money);
} catch (Exception $exception) {
$value = $exception->getMessage();
}
echo var_export($money, true) . ' = ' . var_export($value, true) . PHP_EOL;
}
echo '--- INVALID ---' . PHP_EOL;
foreach ($invalidTests as $money) {
try {
$value = getAmountValue($money);
} catch (Exception $exception) {
$value = $exception->getMessage();
}
echo var_export($money, true) . ' = ' . var_export($value, true) . PHP_EOL;
}