为啥数字格式不正常?

Posted

技术标签:

【中文标题】为啥数字格式不正常?【英文标题】:Why is the number formatting abnormal?为什么数字格式不正常? 【发布时间】:2014-04-25 07:43:39 【问题描述】:

所以我想显示一个计数器,每个字符都包含在一个标签中,并添加一个千位分隔符。

数字必须至少为 3 个字符长。

案例 1:

我拿了一个号码12

代码:

$number = 12 //number 12
$number = number_format($number, 0, '', ','); //add a thousand seprator
$number = str_pad($number,3,0,STR_PAD_LEFT); //pad if length less than 3
$counter = "";
foreach (str_split($number) as $key => $digit) 
    $counter .= '<b>' . $digit . '</b>';

输出:012(忽略&lt;b&gt;标签)

案例 2:

我拿了一个号码1234

代码:

$number = 1234 //number 1234
$number = number_format($number, 0, '', ','); //add a thousand seprator
$number = str_pad($number,3,0,STR_PAD_LEFT); //pad if length less than 3
$counter = "";
foreach (str_split($number) as $key => $digit) 
    $counter .= '<b>' . $digit . '</b>';

输出:1,234(忽略&lt;b&gt;标签)

案例 3:

我拿了一个号码0012

代码:

$number = 0012 //number 0012
$number = number_format($number, 0, '', ','); //add a thousand seprator
$number = str_pad($number,3,0,STR_PAD_LEFT); //pad if length less than 3
$counter = "";
foreach (str_split($number) as $key => $digit) 
    $counter .= '<b>' . $digit . '</b>';

输出:010(忽略&lt;b&gt;标签)


那么案例3出了什么问题?

更新:

如何避免这种情况?

【问题讨论】:

0012不是小数。它被解释为记录的八进制表示法。 @arkascha 嗯,它一个整数。八进制整数... :) 【参考方案1】:

答案是,因为八进制

$number = 0012;

0 前缀使 php 使用八进制到十进制转换来转换 12;和 12 八进制 == 10 十进制。

为避免这种情况,您可以改用字符串值:

$number = '0012';

另请参阅:Integer notation

【讨论】:

如何避免这种情况?所以将其定义为(int) 将是合适的 @blo 更新了答案。 (int) 类型转换无济于事,因为它已经是一个整数。 @blo 整数不包括格式信息。 “0012”(忽略八进制)与 12 与 0000012 具有相同的 。整数本身就是 “12”,前导零无关紧要给它。您只在格式化输出数字时添加前导零。 我试过'0012'它输出012而预期是0,012。我猜这种格式无效,对吗? @blo 那是因为'0012' 表示为一个数字小于一千,因此不需要千位分隔符。如果这是您的要求,则不应使用 number_format()

以上是关于为啥数字格式不正常?的主要内容,如果未能解决你的问题,请参考以下文章

为啥优盘在windows系统下显示正常,在linux系统上无法显示呢

创建函数正常数字格式?

为啥会出现“数字格式异常”?

ps的批量处理脚本为啥显示无法处理图片?

为啥我的子集总和方法不正确?

为啥自动关闭延迟评估和正常关闭不?