如何将所有非数字字符换成货币格式


how can I swap out all non numeric characters to currency format

我需要有人帮助,我将不胜感激,非常感谢

下面作为左侧的几个示例,我想交换为货币格式/右侧

  • 123,00 至 123.00
  • 1.123,00€ 至 1,123.00
  • $11.123,00 至 11,123.00
  • 12.123,00 ZH 至 12,123.00
  • 12.123,00cH 至 12,123.00
  • £1.123.123,00 至 1,123,123.00
  • 112312300 KN 至 1,123,123.00

或例如

  • 1,123.00€ 至 1,123.00
  • $11.123.00 至 11,123.00
  • 12,123,00 ZH 至 12,123.00
  • 12.123,00cH 至 12,123.00
  • £1.123,123,00 至 1,123,123.00
  • 11,231230.0 KN 至 1,123,123.00

这意味着无论左侧的任何内容,都应更改为逗号作为千位数字,点更改为十进制数字,

似乎可以使用preg_replacestr_replace来完成,但是我该怎么办?

去掉非数字字符,然后通过number_format()

$val = preg_replace("/[^0-9]/", "", "11,231230.0 KN") / 100;
$formatted = number_format($val, 2, ".", ",");
// Outputs 1,123,123.00

编辑添加了/ 100,因为它在原始零之后添加了小数位。

最简单的方法是首先删除所有非数字内容,然后使用 number_format

// assuming $str holds the original string
$str = preg_replace('/[^0-9]/', '', $str);  // now just a string of numbers
$str = number_format( $str, 2 ); // 2 decimal places

你可以试试

print number_format(preg_replace('/'D/', '', $number), 2, '.', ',');

我不得不从货币上做同样的事情来规范我正在处理的项目的格式。

如果格式化为#####.##并支持以下输入,则代码正在重新处理要输出的任何字符串:

// 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()重新格式化标准化数字