You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 11中货币的存储、计算与格式化的现代化实现方案

Laravel中货币存储、计算与显示的原生实现方案

一、存储:用整数存“分”单位

  • 数据库字段设为unsigned integer类型,直接存储以分为单位的整数值(比如1美元存100,1.5美元存150)。彻底规避浮点运算的精度丢失问题,这是金融场景的标准做法。

二、计算:直接基于整数操作

  • 加减运算直接用存储的整数值进行,比如$total = $order->subtotal + $order->tax,无需转换,高效又精准。
  • 涉及乘除非整数比例(如折扣)时,优先转成整数运算:比如打8折写$discounted = $original * 80 / 100,避免引入浮点中间值。

三、显示:优雅的格式化方式

1. 模型访问器(推荐)

在对应模型里定义访问器,自动完成“分转元+格式化”:

// 示例:Order模型
public function getFormattedTotalAttribute()
{
    return Number::currency($this->total / 100, 'USD'); // 替换为你的默认货币
}

使用时直接调用:$order->formatted_total,视图层无需写除法逻辑,代码更整洁。

2. 全局辅助函数

若多个模型需复用,可自定义全局辅助函数:

// 在app/helpers.php中添加
function format_currency(int $cents, string $currency = 'USD')
{
    return Number::currency($cents / 100, $currency);
}

任意场景直接调用:format_currency($order->total)。

3. Blade指令优化视图写法

如果视图中频繁使用,可注册Blade指令:

// 在AppServiceProvider的boot方法中添加
Blade::directive('currency', function ($expression) {
    return "<?php echo Number::currency($expression / 100); ?>";
});

视图里直接用:@currency($order->total)。

四、输入处理:前端转后端的精度保障

若前端传的是“元”单位数值(如用户输入10.50),后端接收时转成分存储:

$cents = (int)round($request->amount * 100);

用round避免浮点转换误差,确保数值精准。

内容的提问来源于stack exchange,提问作者Snappawapa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:54:54