Php 通过替换最后三个位置上的点,使用preg_replace转换货币编号

Php 通过替换最后三个位置上的点,使用preg_replace转换货币编号,php,regex,preg-replace,Php,Regex,Preg Replace,我正在尝试转换以下数字,如果在最后三个位置没有使用逗号或点,则所有数字都具有相同的值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,如果有逗号或点,则为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";
所以我不知道如何检查最后两个数字之前是否有点,如果有,用逗号替换。但只有最后两位数


谢谢

考虑到即使是欧元也有许多不同的货币书写方式,您可能很难使用简单的正则表达式来识别人们想要输入的“真实”值

通过将区域设置设置为:

这将自动获取输入的任何值,并将其转换为德国等效值。请记住,你还想去掉欧元标志


希望这有帮助!:

这可以解决问题,但可能有一个更简单的解决方案:

$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.46000欧元


然后,右边的破折号被剥离,剩下的破折号与strtr一起被转换为逗号和逗号,或者同时被转换为空字符串的点。

但是。。。5460.00 != 546000 != 546万我不得不同意丹尼尔的困惑。你为什么要把5460.00转换成5460,00?此人是否有5000欧元,或54.6万欧元?你肯定希望逗号在三位数之前?在546000中,有时会有人输入5460.00。但在德国,它必须是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 $k => $number) {
    $number = preg_replace('~[.,](?=\d{2}\b)|\p{Sc}~u', '#', $number);
    $number = strtr(rtrim($number, '#'), ['#' => ',', '.' => '', ',' => '']);
    echo $numbers[$k], ' -> ', $number, PHP_EOL;
}