通过替换倒数第三个位置上的点,将货币数字转换为 preg_replace
convert money numbers with preg_replace by replacing dots on the third last position
我正在尝试转换以下数字,如果倒数第三个位置没有使用逗号或点,则所有数字都具有相同的值 5460,如果有逗号或点,则为 5460,00。
这是我的测试号码:
5460
5.460
5.460€
5460,00
5460,00€
5460.00
5460.00€
5.460,00
5.460,00€
5,460.00
5,460.00€
我在 preg_replace 中使用了以下正则表达式:
preg_replace('/[^0-9\,\-]+/','',$number);
结果如下
5460 -> 5460
5.460 -> 5460
5.460€ -> 5460
5460,00 -> 5460,00
5460,00€ -> 5460,00
5460.00 -> 546000 // wrong
5460.00€ -> 546000 // wrong
5.460,00 -> 5460,00
5.460,00€ -> 5460,00
我不知道如何优化正则表达式,这样错误的值也将被正确替换,如下所示:
5460.00 -> 546000 // wrong because should be 5460,00
5460.00€ -> 546000 // wrong because should be 5460,00
测试用例:
$numbers = array('5460', '5.460', '5.460€', '5460,00', '5460,00€', '5460.00', '5460.00€', '5.460,00', '5.460,00€');
foreach ($numbers as $number)
echo $number." -> ".preg_replace('/[^0-9\,\-]+/','',$number) . "\n";
所以我不知道如何检查最后两位数字之前是否有一个点,如果是用逗号替换它。但仅限于最后两位数。
谢谢
考虑到有多少种不同的货币书写方式(即使只是欧元),您可能很难使用简单的正则表达式来识别人们打算输入的 'true' 值。
您可能会受益于 PHP 的 money_format() to automatically correct for any possible confusion, by setting the locale with setlocale():
setlocale(LC_MONETARY, 'de_DE');
$numbers = array('5460', '5.460', '5.460€', '5460,00', '5460,00€', '5460.00', '5460.00€', '5.460,00', '5.460,00€');
foreach ($numbers as $number)
echo money_format('%i', $number) . "\n";
这将自动获取输入的任何值并将其转换为德语等价物。请记住,您还需要去掉欧元符号!
希望对您有所帮助! :)
这样就可以了,但可能还有更简单的解决方案:
$numbers = array('5460', '5.460', '5.460€', '5460,00', '5460,00€', '5460.00', '5460.00€', '5.460,00', '5.460,00€');
foreach ($numbers as $k => $number) {
$number = preg_replace('~[.,](?=\d{2}\b)|\p{Sc}~u', '#', $number);
$number = strtr(rtrim($number, '#'), ['#' => ',', '.' => '', ',' => '']);
echo $numbers[$k], ' -> ', $number, PHP_EOL;
}
模式匹配货币符号和后跟两位数字的点或逗号。它们被破折号代替。
例如:5.460,00€ => 5.460#00#
然后去掉右侧的破折号,strtr
剩余的破折号同时转换为逗号和逗号或点转换为空字符串。
我正在尝试转换以下数字,如果倒数第三个位置没有使用逗号或点,则所有数字都具有相同的值 5460,如果有逗号或点,则为 5460,00。
这是我的测试号码:
5460
5.460
5.460€
5460,00
5460,00€
5460.00
5460.00€
5.460,00
5.460,00€
5,460.00
5,460.00€
我在 preg_replace 中使用了以下正则表达式:
preg_replace('/[^0-9\,\-]+/','',$number);
结果如下
5460 -> 5460
5.460 -> 5460
5.460€ -> 5460
5460,00 -> 5460,00
5460,00€ -> 5460,00
5460.00 -> 546000 // wrong
5460.00€ -> 546000 // wrong
5.460,00 -> 5460,00
5.460,00€ -> 5460,00
我不知道如何优化正则表达式,这样错误的值也将被正确替换,如下所示:
5460.00 -> 546000 // wrong because should be 5460,00
5460.00€ -> 546000 // wrong because should be 5460,00
测试用例:
$numbers = array('5460', '5.460', '5.460€', '5460,00', '5460,00€', '5460.00', '5460.00€', '5.460,00', '5.460,00€');
foreach ($numbers as $number)
echo $number." -> ".preg_replace('/[^0-9\,\-]+/','',$number) . "\n";
所以我不知道如何检查最后两位数字之前是否有一个点,如果是用逗号替换它。但仅限于最后两位数。
谢谢
考虑到有多少种不同的货币书写方式(即使只是欧元),您可能很难使用简单的正则表达式来识别人们打算输入的 'true' 值。
您可能会受益于 PHP 的 money_format() to automatically correct for any possible confusion, by setting the locale with setlocale():
setlocale(LC_MONETARY, 'de_DE');
$numbers = array('5460', '5.460', '5.460€', '5460,00', '5460,00€', '5460.00', '5460.00€', '5.460,00', '5.460,00€');
foreach ($numbers as $number)
echo money_format('%i', $number) . "\n";
这将自动获取输入的任何值并将其转换为德语等价物。请记住,您还需要去掉欧元符号!
希望对您有所帮助! :)
这样就可以了,但可能还有更简单的解决方案:
$numbers = array('5460', '5.460', '5.460€', '5460,00', '5460,00€', '5460.00', '5460.00€', '5.460,00', '5.460,00€');
foreach ($numbers as $k => $number) {
$number = preg_replace('~[.,](?=\d{2}\b)|\p{Sc}~u', '#', $number);
$number = strtr(rtrim($number, '#'), ['#' => ',', '.' => '', ',' => '']);
echo $numbers[$k], ' -> ', $number, PHP_EOL;
}
模式匹配货币符号和后跟两位数字的点或逗号。它们被破折号代替。
例如:5.460,00€ => 5.460#00#
然后去掉右侧的破折号,strtr
剩余的破折号同时转换为逗号和逗号或点转换为空字符串。