PHP格式小数部分

时间:2017-10-06 20:24:14

标签: php number-formatting

我有号码0.000432532我希望像这样打破小数部分千位

0.000 432 532 

number_format()只格式化float的整个部分,而不是小数部分。

是否有单一功能可以做到?

3 个答案:

答案 0 :(得分:2)

不知道是否有更好的解决方案,但正则表达式会做到这一点。

$re = '/(\d{3})/'; // match three digits
$str = '0.000432532';
$subst = '$1 '; // substitute with the digits + a space

$result = preg_replace($re, $subst, $str);

echo $result;

https://regex101.com/r/xNcfq9/1

这有一个限制,数字不能大于99或数字的整数部分将开始" break"起来。
但似乎你只使用小数字。

答案 1 :(得分:1)

只要您使用小于99的数字,Andreas的答案就会正常工作,但如果您打算使用> 99号码,我建议您:

$input = '0.000432532';

// Explode number
$input = explode('.', $input);

// Match three digits
$regex = '/(\d{3})/';
$subst = '$1 '; // substitute with the digits + a space
// Use number format for the first part
$input[0] = number_format($input[0], 0, '', ' ');
// User regex for the second part
$input[1] = preg_replace($regex, $subst, $input[1]);

echo implode($input, '.');

这个适用于所有数字

答案 2 :(得分:1)

正则表达式方法比所有这些各种数组转换更有效,但只是为了参数,它可以在没有正则表达式的情况下完成:

list($int, $dec) = explode('.', $number);
$result = implode('.', [$int, implode(' ', str_split($dec, 3))]);

对于正则表达式,我认为这应该处理大多数情况:

$formatted = preg_replace('/(\d+\.\d{3}|\d{3})(?!$)/', '$1 ', $number);