PHP 数字:小数点仅在需要时可见

Posted

技术标签:

【中文标题】PHP 数字:小数点仅在需要时可见【英文标题】:PHP number: decimal point visible only if needed 【发布时间】:2011-05-06 00:28:48 【问题描述】:

我想知道是否存在一些自动格式化数字的函数,如果我有的话:

<?php
    // $sql_result["col_number"] == 1,455.75
    number_format ($sql_result["col_number"], 2, ".", "");
    // will return 1455.75

    // $sql_result["col_number"] == 1,455.00
    number_format ($sql_result["col_number"], 2, ".", "");
    // could I get 1455 instead of 1455.00?
?>

所以我的回答是,如果我的数据库中只有当它是圆形的时候才具有 DECIMAL 数据格式,是否存在某种删除小数的方法?

或者我应该这样做吗?

<?php
    // $sql_result["col_number"] == 1,455.00
    str_replace(".00", "", (string)number_format ($sql_result["col_number"], 2, ".", ""));
    // will return 1455
?>

【问题讨论】:

这是一个简洁的答案:***.com/a/14531760/1431728 @JohnK,我刚刚意识到您提供的链接也是他去年提出的。哈哈哈 【参考方案1】:

floatval 或简单地转换为浮动

php > echo floatval(7.00);
7
php > echo floatval(2.30);
2.3
php > echo floatval(1.25);
1.25
php > echo floatval(1.125);
1.125

php > echo (float) 7.00;
7
php > echo (float) 2.30;
2.3
php > echo (float) 1.25;
1.25
php > echo (float) 1.125;
1.125

【讨论】:

转换为浮动是迄今为止最好的选择 任何想要将此应用于字符串的人都应该注意带有逗号的值,例如“1,000.99” 浮动此值将返回 1。 @YohanesAI 我知道。我在警告人们。【参考方案2】:

我实际上认为您的解决方法与任何解决方法一样好。简单明了,这里谈性能也没啥意义,干吧。

【讨论】:

你可以简单地加0 1455.00 + 0 ***.com/questions/14531679/… 替换解决方法将破坏以欧洲国家格式表示的数字,例如德国或西班牙。例如,德国的 9,000 是 9.000,00,这将变成 90,00 如何更改小数和千位分隔符? @Farzher【参考方案3】:

正如埃米尔所说,你的很好。但是如果你想从例如删除0 7.50也有,我有个建议,rtrim()

<?php
    // if $sql_result["col_number"] == 1,455.50
    rtrim(rtrim(number_format($sql_result["col_number"], 2, ".", ""), '0'), '.');
    // will return 1455.5
?>

【讨论】:

我认为在这种情况下使用rtrim会有一个错误,例如rtrim('1230.00','0.');会给出123而不是1230。 @bobo Halil 给出的代码不存在该错误,该代码使用按顺序执行的 2 个 rtrim。【参考方案4】:

您还可以使用 rtrim(),它会删除多余的 0,在您可能希望保留一位小数但不保留多余的零的情况下。 (例如,4.50 变为 4.5。)还允许您将小数位数从 2 更改为任何其他数字。

rtrim(rtrim((string)number_format($value, 2, ".", ""),"0"),".");

// 4.00 -> 4
// 4.50 -> 4.5
// 4.54000000 -> 4.54 (if you're doing more decimal places)

【讨论】:

如果您有其他字符用于小数分隔,这是最好的方法。 这对我来说似乎已将数字如 10400.00 修剪为 104【参考方案5】:

实际上,我认为对于刚刚进行搜索以寻找此类事情的人来说,我能想到的最干净的方法是这样做:

( number_format ($sql_result["col_number"], 2) * 100 ) / 100;

【讨论】:

我很惊讶这没有更多的赞成票,因为这是解决这个问题的最干净/最优雅的解决方案,恕我直言。【参考方案6】:

我被指控做了这样的事情:

 floatval($foo) == intval($foo) ? number_format($foo) : number_format($foo,2);

【讨论】:

【参考方案7】:

我的因为大部分数量或件数都不需要小数,所以这个功能只会在需要的时候显示小数。

str_replace(".00", "", number_format($this->pieces, 2));

【讨论】:

【参考方案8】:

如果您以美元为目标,我喜欢使用这种方法:

function moneyform($number, $symbol = true) 
    return str_replace(".00", "", money_format(($symbol? '%.2n' : "%!n"), $number));


moneyform(1300999);
-->$1,300,999

moneyform(2500.99);
-->$2,500.99

moneyform(2500.99, false);
-->2,500.99

【讨论】:

唯一的问题是 money_format 现在已被弃用,将来将被删除.. ref。 php.net/money_format【参考方案9】:

Warren.S 的回答帮助了我。我不需要 number_format 函数,所以我就这样做了

$value=$value-0;

但在 OP 的情况下,他需要 number_format 来删除逗号。所以这对他有用

$value=number_format ($sql_result["col_number"], 2, ".", "")-0;

【讨论】:

【参考方案10】:

由于找不到灵活的解决方案,我编写了一个简单的函数来获得最佳结果:

function getValueFormattedWithMinimalDecimals($value, $max_decimals = 2, $dec_point = ',', $thousands_sep = '') 
    $bestNumberOfDecimals = -1;
    $decimal = 0;
    while ($decimal <= $max_decimals) 
        $bestNumberOfDecimals = $decimal;
        $valueDecimals = number_format($value, $decimal);
        if (floatval($value) == $valueDecimals) 
            break;
        
        $decimal++;
    
    if($bestNumberOfDecimals > 0 && number_format($value, $bestNumberOfDecimals) == number_format($value, 0)) 
        $bestNumberOfDecimals = 0;
    

    return number_format($value, $bestNumberOfDecimals, $dec_point, $thousands_sep);

【讨论】:

【参考方案11】:

怎么样

number_format($value,2) - 0;

【讨论】:

以上是关于PHP 数字:小数点仅在需要时可见的主要内容,如果未能解决你的问题,请参考以下文章

带小数的PHP字符串到数字

仅在特定区域创建一位小数

php数字转化中 多位小数怎样处理

在 PHP 中处理货币 - 小数位和 number_format()

php中除法取整的方法(round,ceil,floor)

PHP检查数字没有小数比添加两个小数[重复]