Мне пришлось сделать то же самое из валюты, чтобы нормализовать формат для проекта, над которым я работаю.
Код обрабатывает любую строку для вывода, если отформатирован как #####.##
, и поддерживает следующие входные данные:
// these are my unit test check
0.00 returned by filtering 0
0.20 returned by filtering 0.2
0.20 returned by filtering 0,2
0.22 returned by filtering 0.22
0.22 returned by filtering 0,22
18.20 returned by filtering 18.2
1000.00 returned by filtering 1 000
1000.00 returned by filtering 1,000
1000.00 returned by filtering 1,000.00
1000.00 returned by filtering 1000,00
1000.00 returned by filtering 1 000,00
1000.20 returned by filtering 1 000,2
1000.20 returned by filtering 1 000,20 $
1000.20 returned by filtering abc1def00test0dot.twenty20
и любая другая комбинация чередуются с любыми нечисловыми символами
if (strpos($string, '.') === false
&& strpos($string, ',') === false
) {
$string .= '.00';
}
$string = preg_replace('/[^0-9.,]/', '', $string);
$string = preg_replace('/[.,]/', '.', $string);
while (
strpos($string, '.') != strrpos($string, '.')
|| strlen($string) - 1 - strrpos($string, '.') > 2
) {
$pos = strpos($string, '.');
if ($pos > 0) {
$string = substr($string, 0, $pos) . substr($string, $pos +1);
} else {
break;
}
}
return (float)$string;
И, наконец, используйте number_format()
для переформатирования стандартизированного числа