最佳做法是将数字加总并格式化为带有2个小数点的美元值?

时间:2015-02-10 13:15:03

标签: php

这是我提出的代码,我想:

  1. 总价+运费总额
  2. 始终显示带有两个小数点的格式化数字
  3. 在所有三个值的开头都有一个美元符号
  4. 如果运费值为零,则显示替代“免运费”。
  5. PHP:

    $price0 = "356";
    $ship0 = "9.9";
    $tprice0 = $price0 + $ship0;
    
    $price1 = number_format((float)$price0, 2, '.', '');
    $ship1 = number_format((float)$ship0, 2, '.', '');
    $tprice1 = number_format((float)$tprice0, 2, '.', '');
    
    if($ship0 == 0) { $shipping1 = '<span class="free">Free Shipping</span>'; } else { $shipping1 = "$$ship1"; }
    

    HTML:

    Price: $<?php echo $price1; ?> 
    Shipping: <?php echo $shipping1; ?>
    Total: $<?php echo $tprice?>
    

    这是最佳做法吗? (例如,我使用双美元符号),有没有办法让代码更清洁/更短?

    修改 请注意,我希望在同一页面中对多个产品进行此练习,那么有没有办法缩短它?

    $price0b = "223";
    $ship0b = "5.5";
    $tprice0b = $price0b + $ship0b;
    
    $price1b = number_format((float)$price0b, 2, '.', '');
    $ship1b = number_format((float)$ship0b, 2, '.', '');
    $tprice1b = number_format((float)$tprice0b, 2, '.', '');
    
    if($ship0b == 0) { $shipping1b = '<span class="free">Free Shipping</span>'; } else { $shipping1b = "$$ship1b"; }
    

    EDIT2:

    我在这段代码中找不到类错误:

    <?php
    
    $price = "356";
    $shipping = "0";
    $total_price = $price0 + $ship0;
    
    $oNumberFormatter = new NumberFormatter('en_US', NumberFormatter::PATTERN_DECIMAL, '¤ #,##0.00');
    ?>  
    <!DOCTYPE html>
    <html>
    <head>
    </head>
    <body>
    Price: <?= $oNumberFormatter->format( (float) $price ); ?>
    Shipping: <?= !$ship0b ? "<span class=\"free\">Free Shipping</span>" : $oNumberFormatter->format( (float) $shipping ); ?>
    Total: <?= $oNumberFormatter->format( (float) $total_price ); ?>
    

2 个答案:

答案 0 :(得分:1)

要将数字格式化为en_US货币格式,您可以创建一个NumberFormatter对象,如下所示:

$oNumberFormatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);

在这种情况下,价格将格式化为给定区域设置的正常规则;例如 $ 9.95 代表'en_US`或€9,95 代表'nl_NL'


如果您想要特定的ICU Decimal format,可以使用:

$oNumberFormatter = new NumberFormatter('en_US', NumberFormatter::PATTERN_DECIMAL, '¤ #,##0.00');

格式中的货币符号(¤)会在回显时自动转换为区域设置字符串指定的正确符号;因此,对于'en_US',将使用美元符号( $ ) - 对于'nl_NL'欧元()等等。


无论哪种方式,在您的产品展示循环中,要显示格式正确的产品价格,您只需(假设您的产品价格为$price)使用:

<?= $oNumberFormatter->format( (float) $price); ?>

...以及免费送货插页:

<?= !$shipping ? "<span class=\"free\">Free Shipping</span>" : $oNumberFormatter->format( (float) $shipping ); ?>

NumberFormatter课程的完整详情位于:http://php.net/manual/en/class.numberformatter.php


只需编辑即可回复评论中的问题

  

好的,谢谢。你能解释一下你对运输部件做了什么吗?一世   不明白这种格式是如何运作的。另外,如何插入一个   美元符号,如果暂时我将使用免费送货“:number_format((浮动)$ shipping,   2,'。',''); ?&GT; ?

<?=<?php echo

的简写

我只是使用三元运算符:http://php.net/manual/en/language.operators.comparison.php(稍微向下滚动页面) - 它只是一种基于if()else()表示法:

!$shipping等同于$shipping == false等同于$shipping == 0,因为PHP是松散类型的,所以:

<?= !$shipping ? "<span class=\"free\">Free Shipping</span>" : $oNumberFormatter->format( (float) $shipping ); ?>

......等同于......

<?php
if($shipping == 0) {
  echo "<span class=\"free\">Free Shipping</span>";
}
else {
  echo $oNumberFormatter->format( (float) $shipping );
}
?>

从字面上输出$字符串...只需使用非插值字符串文字。 PHP有两种类型的string literal(井,4种带有heredoc语法)但实际上插值字符串用双引号括起来并解析变量。

<?php
$sWord = "BADGERS";
echo "I like $sWord";
?>

I like BADGERS

中的结果

而非插值字符串(用撇号括起来)将逐字处理$ - 它不会插入变量:

<?php
$sWord = "BADGERS";
echo 'I like $sWord';
?>

I like $sWord字面上的结果。

因此,您可以使用带有前缀的美元符号来回显您的货币值,如下所示:

echo '$' . number_format( (float) $shipping, 2, '.', '');

答案 1 :(得分:0)

我很可能会这样做

PHP     

$price = "356";
$ship = "9.9";
$tprice = $price + $ship;

HTML

Price: $<?php echo setdecimalPoint($price); ?> 
<?php if($ship == 0) { ?>
<span class="free">Free Shipping</span>
<?php }else{ ?>
Shipping: <?php echo setdecimalPoint($shipping); ?>
<?php } ?>
Total: $<?php echo setdecimalPoint($tprice)?>