suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Problem mit dem Währungsformat in PHP behoben

<p><code>numfmt_format_currency(new NumberFormatter('en',2), 31,005, "USD")</code> Dieser Code sollte 31,01 $ ausgeben. Dieser Code gibt 31,00 $ aus. Es sollten aber 31,01 $ ausgegeben werden. Wie kann dieses Problem gelöst werden? ? </p><p>PHP ignoriert die Konvertierung von 0,005 in 0,01 im Preisformat. </p><p>Ich habe versucht, das Währungsformatierungsproblem von Magento zu beheben, habe aber ein Problem mit PHP festgestellt.</p><p><br /></p>
P粉322319601P粉322319601558 Tage vor740

Antworte allen(1)Ich werde antworten

  • P粉275883973

    P粉2758839732023-08-09 10:40:33

    31.005实际上在两个数字之间,请查看https://php.net/float上的浮点精度。

    > ini_set('precision', 23)
    = "14"
    
    > 31.005
    = 31.00499999999999900524

    (在PHP和其他语言中,没有31.005这个数字。.)

    你需要提供足够精度的数字,但要尽可能少地出现误差,以匹配你的显示要求。这可以通过指定舍入模式来实现,例如,如果你想将31.005四舍五入到31.01,你可以选择向上舍入或向下舍入。

    $formatter = new NumberFormatter('en', NumberFormatter::CURRENCY);
    
    $formatter->setAttribute(
        NumberFormatter::ROUNDING_MODE, 
        NumberFormatter::ROUND_HALFUP
    );
    
    
    echo $formatter->formatCurrency(31.005, 'USD'), "\n";
    # Output: $31.01
    

    这就是droopsnoot评论的内容

    数字格式化默认模式和创建

    如Olivier在评论中提醒的那样,默认模式是半偶数舍入,也称为银行家舍入。

    同时,他们指出使用类常量NumberFormatter::CURRENCY会“更加规范”,而不是使用魔术数字2

    $formatter = new NumberFormatter('en', 2);
    $formatter = new NumberFormatter('en', NumberFormatter::CURRENCY);
    

    这将使您的代码更好地进行通信,否则数字2可能会被解读为数字的位数或精度,但在这种情况下并非如此。您可以在PHP手册中找到所有的样式常量。

    备注:这并不只是PHP特有的问题,当您将这些数字传递给Javascript并且需要在Javascript中对它们进行格式化时,您会遇到相同的问题。

    Antwort
    0
  • StornierenAntwort