【问题标题】:currency format in laravellaravel 中的货币格式
【发布时间】:2018-04-01 14:18:03
【问题描述】:

我在刀片文件的很多地方都使用货币格式。我正在使用 number_format 来显示正确的货币格式。所以它看起来像这样

<p>${{ number_format($row->nCashInitialBalance, 2) }}</p> // $1,123.00
<p>${{ number_format($row->nCashCalculatedBalance, 2) }}</p> // $300.50
<p>${{ number_format($row->nCashPaymentsReceived, 2) }}</p> // $2,341.15
<p>${{ number_format($row->nCardFinalBalance, 2)}}</p> // $234.10

如果我不使用它看起来像这样

<p>${{ $row->nCashInitialBalance }}</p> // $1123
<p>${{ $row->nCashCalculatedBalance }}</p> // $300.5
<p>${{ $row->nCashPaymentsReceived }}</p> // $2341.15
<p>${{ $row->nCardFinalBalance }}</p> // $234.1

对于我在很多地方使用toFixed(2) 的输入字段也是如此。

#nDiscount_fixed").val() = parseFloat( $("#nDiscount_fixed").val()).toFixed(2);

难道没有一种最简单的方法可以将所有变量显示为正确的货币格式吗?我已经使用了number_formattoFixed(2) 几乎超过 50 次了。

【问题讨论】:

  • 试试money_format!!
  • 对于 2020 年来到这里的任何人。money_format 已弃用,请勿尝试 :)

标签: laravel currency-formatting


【解决方案1】:

查看my money package 的 PHP (Laravel)。

在配置中,您可以选择小数点后的小数位数和货币来源(int 或 float):

'decimals' => 2,
'origin' => MoneySettings::ORIGIN_INT,

之后,所有货币对象都将保留 2 位小数。 对于 INT 来源,100$ 将是 10000 (100 * 10^2) 数字。

然后创建一个实例并显示它:

money(10000)->toString(); // "$ 100"
money(10000, currency('RUB'))->toString(); // "100 ₽"

您可以通过将每个对象传递给money() 辅助函数来轻松添加自定义显示,或者您可以通过设置配置文件将其应用于所有其他对象。

【讨论】:

    【解决方案2】:

    如果你使用 Laravel Cashier,你可以使用 Laravel 内置的 formatAmount() 方法。
    AppServiceProvider 中的boot() 方法中

    Blade::directive('money', function ($expression) {
        return "<?php echo laravel\Cashier\Cashier::formatAmount($expression, 'gbp'); ?>";
    });
    

    在您的刀片视图中 Total: @money($proudct-&gt;price)

    产出-总计:100.00 英镑

    注意:

    • 别忘了导入
    • 清除配置(如果需要)php artisan config:clear

    【讨论】:

      【解决方案3】:

      使用这个解决方案:

      {{"$ " . number_format($data['total'], 0, ",", ".")  }}
      

      【讨论】:

      【解决方案4】:

      您可以创建一个custom Laravel directive。您仍然需要在每个需要它的地方调用该指令,但它的好处是,如果您想更改代码(例如,用其他内容替换 number_format),您只需更新该指令。

      示例(取自文档并针对您的用例进行了更新)(在您的 AppServiceProvider boot 方法中):

      Blade::directive('convert', function ($money) {
          return "<?php echo number_format($money, 2); ?>";
      });
      

      在 Blade 中使用它:

      @convert($var)
      

      【讨论】:

      • 我猜它比每次写number_format($money, 2) 都要短。如果我使用 money_format (github.com/cknow/laravel-money)。我还需要包装变量吗?即@money(500, 'BRL') ?
      • 我认为不一定,但如果您这样做了,您将受益于仅将特定代码放在一个地方,例如,如果您找到另一个包,则更容易更改它。该包中包含的 Blade 指令看起来不错。
      • @jonlink 实际上这不是真的。函数 money_format 将在 PHP7.4 中被弃用,而不是 number_format
      • @GijsdeJong 哎呀我的错误。一定是脑袋放屁了。我的朋友,无需防御。我会删除评论。谢谢你的收获。
      • 好主意。指令名称虽然可以使用一些工作。没有人会知道 @convert() 究竟做了什么。
      【解决方案5】:

      如果你想格式化负数,你需要这样做:

      Blade::directive('money', function ($amount) {
              return "<?php
                  if($amount < 0) {
                      $amount *= -1;
                      echo '-$' . number_format($amount, 2);
                  } else {
                      echo '$' . number_format($amount, 2);
                  }
              ?>";
       });
      

      在你的刀片文件中使用:

      @money(-10)
      

      如果您对指令进行编辑,则需要清除视图:

      php artisan view:clear
      

      【讨论】:

        【解决方案6】:

        您可以在AppServiceProvider.php 文件的boot() 方法中添加custom Blade directive

        例如:

        Blade::directive('money', function ($amount) {
            return "<?php echo '$' . number_format($amount, 2); ?>";
        });
        

        在你的 Blade 文件中,你只需要像这样使用@money()

        @money($yourVariable)
        

        【讨论】:

          【解决方案7】:

          我最不会使用“指令”...我发现在模型上执行与访问器相同的逻辑会更简洁。

          public function getAmountAttribute($value)
          {
              return money_format('$%i', $value);
          }
          

          【讨论】:

          猜你喜欢
          • 2015-10-24
          • 2012-01-22
          • 1970-01-01
          • 2021-03-31
          • 1970-01-01
          • 2010-09-24
          相关资源
          最近更新 更多