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
相关产品推荐
相关产品推荐

