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

Laravel输入框使用number_format格式化数字后如何正确存储为数值

方案1:Blade端纯前端实现(无后端改造,更优雅)

用两个输入框配合JS实现即可,一个是面向用户的展示输入框,一个是隐藏的真实值提交框,完全兼容原有后端逻辑:

  • 展示用输入框:设置为type="text",值用你需要的撇号千分位格式化,用户输入时实时同步格式化,同时将去掉分隔符的纯数字同步到隐藏输入框
  • 隐藏输入框:设置为type="hidden",name属性保留原来的wbw,后端接收的就是这个隐藏框的合法数字值

对应代码示例:
Blade部分

{{-- 用户可见的格式化展示输入框 --}}
<input 
    id="wbw_display" 
    type="text" 
    class="form-control @error('wbw') is-invalid @enderror" 
    value="{{ number_format(old('wbw', $bw->wbw), 2, '.', '´') }}" 
    autofocus
>
{{-- 实际提交的隐藏输入框 --}}
<input 
    id="wbw" 
    type="hidden" 
    name="wbw" 
    value="{{ old('wbw', $bw->wbw) }}"
>
{{-- 原有错误提示逻辑不需要改动 --}}
@error('wbw')
    <div class="invalid-feedback">{{ $message }}</div>
@enderror

配套JS逻辑

const displayInput = document.getElementById('wbw_display');
const realInput = document.getElementById('wbw');

// 输入实时格式化+同步
displayInput.addEventListener('input', function(e) {
    // 提取纯数字和小数点内容
    let rawValue = e.target.value.replace(/[^\d.]/g, '');
    // 避免出现多个小数点
    if (rawValue.split('.').length > 2) {
        rawValue = rawValue.slice(0, rawValue.lastIndexOf('.'));
    }
    // 同步纯数字到隐藏提交框
    realInput.value = rawValue;
    
    // 格式化展示值
    if (rawValue) {
        const [integerPart, decimalPart] = rawValue.split('.');
        // 整数部分添加撇号千分位
        const formattedInteger = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, '´');
        // 拼接小数部分最多保留2位
        e.target.value = decimalPart !== undefined 
            ? `${formattedInteger}.${decimalPart.slice(0,2)}` 
            : formattedInteger;
    } else {
        e.target.value = '';
    }
});

// 页面加载时如果有旧值,自动格式化展示
window.addEventListener('load', function() {
    if (realInput.value) {
        displayInput.value = Number(realInput.value).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, '´');
    }
});
方案2:控制器端处理(改动量小,适合不想写前端代码的场景)

如果不愿意加前端逻辑,直接在控制器接收参数时预处理掉千分位撇号即可:

// 验证前先替换掉参数里的撇号
$request->merge([
    'wbw' => str_replace('´', '', $request->input('wbw'))
]);

// 后续验证、存储逻辑完全不变
$validated = $request->validate([
    'wbw' => 'required|numeric',
    // 其他字段验证规则
]);

$bw->update($validated);

注意使用这个方案需要把输入框的type改为text,原生numeric类型输入框不允许输入非数字字符,撇号会被自动过滤。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:27:01