news 2026/4/18 3:32:27

el-input只能输入数字且支持小数,精度为n(14,6)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
el-input只能输入数字且支持小数,精度为n(14,6)

方案一:自定义指令(推荐,可复用)

<template> <!-- 使用自定义指令,精度(14,6) --> <el-input v-model="decimalValue" v-decimal="{ maxInt: 14, maxDecimal: 6 }" placeholder="整数最多14位,小数最多6位" /> <!-- 可配置不同精度 --> <el-input v-model="priceValue" v-decimal="{ maxInt: 8, maxDecimal: 2 }" placeholder="价格(8,2)" /> </template> <script setup> import { ref } from 'vue' // 自定义指令 const vDecimal = { mounted(el, binding) { const input = el.querySelector('input') if (!input) return const config = { maxInt: binding.value?.maxInt || 14, // 最大整数位数 maxDecimal: binding.value?.maxDecimal || 6, // 最大小数位数 allowNegative: binding.value?.allowNegative ?? true, allowZeroStart: binding.value?.allowZeroStart ?? false } input.addEventListener('input', (e) => { handleDecimalInput(e.target, config) }) input.addEventListener('blur', (e) => { formatDecimalValue(e.target, config) }) } } // 处理输入 const handleDecimalInput = (input, config) => { let value = input.value // 允许的字符:数字、小数点、负号 const allowedChars = config.allowNegative ? /[0-9.-]/g : /[0-9.]/g const filtered = value.match(allowedChars)?.join('') || '' // 处理多个负号 let processedValue = filtered if (config.allowNegative) { const dashCount = (processedValue.match(/-/g) || []).length if (dashCount > 1) { processedValue = '-' + processedValue.replace(/-/g, '') } if (processedValue.includes('-') && processedValue.indexOf('-') > 0) { processedValue = processedValue.replace(/-/g, '') } } // 处理多个小数点 const parts = processedValue.split('.') if (parts.length > 2) { processedValue = parts[0] + '.' + parts.slice(1).join('') } // 拆分整数和小数部分 const [integerPart = '', decimalPart = ''] = processedValue.split('.') // 限制整数部分长度 const limitedInteger = integerPart.slice(0, config.maxInt) // 限制小数部分长度 const limitedDecimal = decimalPart.slice(0, config.maxDecimal) // 重新组合 let result = limitedInteger if (limitedDecimal) { result += '.' + limitedDecimal } // 不允许以0开头(除非是0.xxx) if (!config.allowZeroStart && result.length > 1 && result.startsWith('0') && !result.startsWith('0.')) { result = result.substring(1) } if (result !== value) { input.value = result input.dispatchEvent(new Event('input')) } } // 格式化值 const formatDecimalValue = (input, config) => { let value = input.value if (value === '' || value === '-' || value === '.') { input.value = '' return } // 处理以小数点开头的情况 if (value.startsWith('.')) { value = '0' + value } if (value.startsWith('-.')) { value = '-0' + value.slice(1) } // 确保小数位数为配置的位数 const parts = value.split('.') if (parts.length === 2) { parts[1] = parts[1].padEnd(config.maxDecimal, '0').slice(0, config.maxDecimal) value = parts.join('.') } input.value = value input.dispatchEvent(new Event('input')) } const decimalValue = ref('') const priceValue = ref('') </script>

方案二:封装为组件(功能完整)

<!-- DecimalInput.vue --> <template> <el-input v-model="displayValue" v-bind="$attrs" @input="handleInput" @blur="handleBlur" @keydown="handleKeydown" /> </template> <script setup> import { ref, computed, watch, nextTick } from 'vue' const props = defineProps({ modelValue: [String, Number], maxInt: { // 最大整数位数 type: Number, default: 14 }, maxDecimal: { // 最大小数位数 type: Number, default: 6 }, allowNegative: { type: Boolean, default: true }, integerOnly: { // 是否只允许整数 type: Boolean, default: false }, trimZero: { // 是否去除末尾的0 type: Boolean, default: false } }) const emit = defineEmits(['update:modelValue', 'change']) // 显示值 const displayValue = ref('') // 同步外部值 watch(() => props.modelValue, (val) => { if (val !== undefined && val !== null) { displayValue.value = val.toString() } }, { immediate: true }) // 处理输入 const handleInput = (value) => { if (value === '') { updateValue('') return } // 构建正则表达式 const pattern = props.allowNegative ? /^-?\d*\.?\d*$/ : /^\d*\.?\d*$/ if (!pattern.test(value)) { // 回退到上一次有效值 nextTick(() => { displayValue.value = props.modelValue?.toString() || '' }) return } // 检查长度限制 const parts = value.split('.') const integerPart = parts[0].replace('-', '') const decimalPart = parts[1] || '' // 验证整数部分长度 if (integerPart.length > props.maxInt) { const limitedInteger = integerPart.slice(0, props.maxInt) const limitedValue = (value.startsWith('-') ? '-' : '') + limitedInteger if (decimalPart) { displayValue.value = limitedValue + '.' + decimalPart } else { displayValue.value = limitedValue } updateValue(displayValue.value) return } // 验证小数部分长度 if (decimalPart.length > props.maxDecimal) { const limitedDecimal = decimalPart.slice(0, props.maxDecimal) displayValue.value = parts[0] + '.' + limitedDecimal updateValue(displayValue.value) return } // 如果设置为只允许整数,移除小数点 if (props.integerOnly && value.includes('.')) { displayValue.value = value.replace('.', '') updateValue(displayValue.value) return } updateValue(value) } // 处理键盘事件 const handleKeydown = (e) => { // 阻止非数字、小数点、负号、控制键的输入 const allowedKeys = [ 'Backspace', 'Delete', 'Tab', 'Escape', 'Enter', 'Home', 'End', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown' ] if (allowedKeys.includes(e.key)) { return } // 允许的数字和小数点 if (/[0-9]/.test(e.key)) { return } // 允许小数点 if (e.key === '.' && !props.integerOnly) { const currentValue = displayValue.value if (!currentValue.includes('.')) { return } } // 允许负号 if (e.key === '-' && props.allowNegative) { const currentValue = displayValue.value if (!currentValue.includes('-')) { return } } e.preventDefault() } // 处理失去焦点 const handleBlur = () => { if (!displayValue.value || displayValue.value === '-' || displayValue.value === '.') { updateValue('') return } // 处理以小数点开头的情况 let value = displayValue.value if (value.startsWith('.')) { value = '0' + value } if (value.startsWith('-.')) { value = '-0' + value.slice(1) } // 补全小数位数 const parts = value.split('.') if (parts.length === 2) { if (props.trimZero) { // 去除末尾的0 parts[1] = parts[1].replace(/0+$/, '') if (parts[1] === '') { value = parts[0] } else { value = parts[0] + '.' + parts[1] } } else { // 补0到指定长度 parts[1] = parts[1].padEnd(props.maxDecimal, '0').slice(0, props.maxDecimal) value = parts.join('.') } } displayValue.value = value updateValue(value) } // 更新值 const updateValue = (value) => { emit('update:modelValue', value) emit('change', value) } </script>

使用封装组件

<template> <div class="form-container"> <!-- 精度(14,6) --> <el-form-item label="金额(14,6)"> <DecimalInput v-model="form.amount" :max-int="14" :max-decimal="6" placeholder="请输入金额,整数最多14位,小数最多6位" /> </el-form-item> <!-- 精度(8,2) --> <el-form-item label="单价(8,2)"> <DecimalInput v-model="form.price" :max-int="8" :max-decimal="2" placeholder="单价,保留2位小数" /> </el-form-item> <!-- 只允许整数 --> <el-form-item label="数量"> <DecimalInput v-model="form.quantity" :max-int="8" :integer-only="true" placeholder="请输入数量" /> </el-form-item> <!-- 不允许负数 --> <el-form-item label="百分比(0-100)"> <DecimalInput v-model="form.percentage" :max-int="3" :max-decimal="2" :allow-negative="false" placeholder="0-100,保留2位小数" /> </el-form-item> </div> </template> <script setup> import { reactive } from 'vue' import DecimalInput from './DecimalInput.vue' const form = reactive({ amount: '', price: '', quantity: '', percentage: '' }) </script>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 4:28:46

AI开发者实战手册:Qwen2.5-7B从下载到推理全流程

AI开发者实战手册&#xff1a;Qwen2.5-7B从下载到推理全流程 1. Qwen2.5-7B 模型概览与技术背景 1.1 大模型演进中的关键角色 随着大语言模型&#xff08;LLM&#xff09;在自然语言理解、代码生成和多模态任务中的广泛应用&#xff0c;阿里云推出的 Qwen2.5 系列 成为当前开…

作者头像 李华
网站建设 2026/4/17 20:52:53

Qwen2.5-7B长文档处理:法律合同分析案例

Qwen2.5-7B长文档处理&#xff1a;法律合同分析案例 1. 引言&#xff1a;为何选择Qwen2.5-7B进行法律合同分析&#xff1f; 1.1 法律文本处理的现实挑战 在企业法务、合规审查和合同管理场景中&#xff0c;动辄数千甚至上万字的法律合同是常态。传统NLP工具在处理这类长上下…

作者头像 李华
网站建设 2026/4/18 3:30:56

Qwen2.5-7B企业应用:知识库问答系统部署实战

Qwen2.5-7B企业应用&#xff1a;知识库问答系统部署实战 1. 引言&#xff1a;大模型驱动的企业级知识管理新范式 1.1 业务场景与痛点分析 在现代企业运营中&#xff0c;知识资产的积累速度远超组织消化能力。技术文档、客户案例、内部流程等非结构化数据分散在多个系统中&am…

作者头像 李华
网站建设 2026/4/8 6:47:07

Qwen2.5-7B代码补全:IDE插件开发实战指南

Qwen2.5-7B代码补全&#xff1a;IDE插件开发实战指南 随着大语言模型在编程辅助领域的广泛应用&#xff0c;开发者对高效、智能的代码补全工具需求日益增长。Qwen2.5-7B作为阿里云最新发布的中等规模语言模型&#xff0c;在代码理解与生成方面表现出色&#xff0c;尤其适合集成…

作者头像 李华
网站建设 2026/4/15 10:31:11

SW模型转点云PCD

一、将SW模型输出为STL格式二、下载软件CloudCompare安装完成打开软件重置中文简体&#xff0c;重启生效三、点云生成3.1加载STL文件3.2选中模型创建点云可以选择点云量参数可以看到全局点云坐标范围&#xff0c;以SW模型原点为参考坐标3.3保存PCD格式选择PCD格式选择binary格式…

作者头像 李华
网站建设 2026/4/10 9:30:21

Qwen2.5-7B部署教程:支持JSON结构化输出的完整配置指南

Qwen2.5-7B部署教程&#xff1a;支持JSON结构化输出的完整配置指南 1. 引言&#xff1a;为什么选择Qwen2.5-7B进行结构化输出部署&#xff1f; 随着大模型在企业级应用中的深入&#xff0c;结构化数据生成能力已成为衡量模型实用性的关键指标之一。传统的语言模型虽然能生成流…

作者头像 李华