PHP小数128字符串格式化

PHP小数128字符串格式化,php,mongodb,Php,Mongodb,我使用MongoDB将值存储为小数128,并使用PHP和细枝来显示它们。我的问题是,输出是否有一种带有千位分隔符的格式?我尝试过使用number_格式,但不起作用,因为该值是字符串,而不是int或float。我不想对值进行类型转换,因为我希望值是精确的 示例: 1000.382 = 1,000.382 99.01 = 99.01 1900000 = 1,900,000 我写了一个函数来实现这一点。仍然在想是否有更好的方法 <?php $n = '12345.001'; echo

我使用MongoDB将值存储为小数128,并使用PHP和细枝来显示它们。我的问题是,输出是否有一种带有千位分隔符的格式?我尝试过使用number_格式,但不起作用,因为该值是字符串,而不是int或float。我不想对值进行类型转换,因为我希望值是精确的

示例:

1000.382 = 1,000.382
99.01    = 99.01
1900000  = 1,900,000
我写了一个函数来实现这一点。仍然在想是否有更好的方法

<?php
$n = '12345.001';

echo fNumString($n);

function fNumString ($number_string) {
    $ex_num = explode('.', $number_string);
    $whole_num_len = strlen($ex_num[0]);

    $formated = '';
    if ($whole_num_len > 3) {
        for ($i = 0; $i < $whole_num_len; $i++) {
            $formated .= $ex_num[0][$i];

            if ((($whole_num_len - ($i + 1)) % 3) == 0 && $whole_num_len != ($i + 1))
                $formated .= ',';
        }
    } else
        $formated = $ex_num[0];


    if (count($ex_num) == 2)
        $formated .= '.' . $ex_num[1];

    return $formated;
}
您可以:

  • 使用
    分解
    ,将数字字符串拆分为整数和小数部分
  • 使用strev
反转整数部分
  • 使用
    preg\u replace
    ,在整数部分内每隔3位添加一个千位分隔符
  • 使用
    strev
    将整数部分反向
  • 返回与小数点分隔符和小数部分串联的值
  • 代码:

    演示:


    注意:您可以省略
    number\u format
    的最后两个参数,为了清晰起见,我喜欢将它们保留在外面(以防以后由于某种原因更改默认值)。

    预期的输出是什么?您指的是千位分隔符,但您的示例是1.001。请分享一些输入/输出的示例(输入是您所拥有的,输出是您所需要的)。很抱歉,测试结果是这样的。对于像“1900000000000000000123.1239999999198”这样的数字,这不起作用
    function fNumString(string $numberString, string $decimalPoint = '.', string $thousandsSeparator = ','): string
    {
      [$integerPart, $decimalPart] = array_pad(explode('.', $numberString, 2), 2, null);
      $integerPart = strrev(preg_replace('/\d{3}(?=\d)/', '\0' . $thousandsSeparator, strrev($integerPart)));
    
      return $integerPart . ($decimalPart ? $decimalPoint . $decimalPart : '');
    }