news 2026/7/5 20:10:59

Vue3 + TypeScript + el-input 处理金额输入(只能输入数字、负号和小数点,最多两位小数,不能0开头,不能小数点开头,只能开头输入负号,只能输入一次负号和小数点,不支持.01)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3 + TypeScript + el-input 处理金额输入(只能输入数字、负号和小数点,最多两位小数,不能0开头,不能小数点开头,只能开头输入负号,只能输入一次负号和小数点,不支持.01)

方法1:oninput 原生事件

代码:复杂的正则表达式代码

<!-- 方法1:oninput 原生事件,复杂的正则表达式代码 --> <el-input v-model="localCapitalInfo.capitalTotal" oninput="value=value.replace(/[^\d.-]/g, ``).replace(/^(-?)0+(\d)/, `$1$2`).replace(/(?!^)-/g, ``).replace(/^(-?)(\.)/, `$10.`).replace(/(\..*)\./g, `$1`).replace(/^(-?\d*\.\d{0,2}).*/g, `$1`)" clearable />

代码:易读的JavaScript代码(直接在这里写代码)

<!-- 方法1:oninput 原生事件,易读的JavaScript代码(直接在这里写代码) --> <el-input v-model="localCapitalInfo.capitalTotal" oninput=" let v = this.value; // 1. 只允许数字、小数点、负号 v = v.replace(/[^\d.-]/g, ''); // 2. 处理负号:只能出现在开头,且只出现一次 let hasNegative = false; if (v.includes('-')) { // 检查负号是否在开头 if (v[0] === '-') { hasNegative = true; // 保留开头的负号,移除其他位置的负号 v = '-' + v.slice(1).replace(/-/g, ''); } else { // 负号不在开头,移除所有负号 v = v.replace(/-/g, ''); } } // 3. 处理单独的小数点 if (v === '.') v = '0.'; if (v === '-.') v = '-0.'; // 4. 处理前导零:去除整数部分的前导零,但保留小数点和负数的情况 if (hasNegative) { // 负数情况:-0.12 应该保留为 -0.12 // 只有当负号后面有多个0,且这些0后面不是小数点时,才去除前导零 // 例如:-0123 应该变成 -123 v = v.replace(/^(-?)0+(\d)/, '$1$2'); } else { // 正数情况:0123 应该变成 123 v = v.replace(/^0+(\d)/, '$1'); } // 5. 去除多余的小数点(只保留第一个) const firstDot = v.indexOf('.'); if (firstDot !== -1) { const beforeDot = v.substring(0, firstDot + 1); const afterDot = v.substring(firstDot + 1).replace(/\./g, ''); v = beforeDot + afterDot; } // 6. 限制小数点后最多两位 const dotIndex = v.indexOf('.'); if (dotIndex !== -1) { const integerPart = v.substring(0, dotIndex); const decimalPart = v.substring(dotIndex + 1, dotIndex + 3); v = integerPart + '.' + decimalPart; } // 7. 特殊情况处理:如果只有负号或负号加0,保留它们 if (v === '-' || v === '-0') { this.value = v; return; } // 8. 处理以0开头的非小数情况 if (v.length > 1 && v[0] === '0' && v[1] !== '.') { v = v.substring(1); } this.value = v; " clearable />

代码:易读的JavaScript代码(使用常量)

1、创建常量 + 统一导出

src\constants\ExecutionCode.constants.ts

// 执行代码类常量 /** * 金额输入框数输入时执行的代码,遇到需转义的符号(如反斜杠 \),需要使用两个反斜杠(\\)处理反斜杠(\) */ // export const TOTAL_INPUT_EXECUTED_CODE = ` // let v = this.value; // // 1. 只允许数字、小数点、负号 // v = v.replace(/[^\\d.-]/g, ''); // // 2. 处理负号:只能出现在开头,且只出现一次 // let hasNegative = false; // if (v.includes('-')) { // // 检查负号是否在开头 // if (v[0] === '-') { // hasNegative = true; // // 保留开头的负号,移除其他位置的负号 // v = '-' + v.slice(1).replace(/-/g, ''); // } else { // // 负号不在开头,移除所有负号 // v = v.replace(/-/g, ''); // } // } // // 3. 处理单独的小数点 // if (v === '.') v = '0.'; // if (v === '-.') v = '-0.'; // // 4. 处理前导零:去除整数部分的前导零,但保留小数点和负数的情况 // if (hasNegative) { // // 负数情况:-0.12 应该保留为 -0.12 // // 只有当负号后面有多个0,且这些0后面不是小数点时,才去除前导零 // // 例如:-0123 应该变成 -123 // v = v.replace(/^(-?)0+(\\d)/, '$1$2'); // } else { // // 正数情况:0123 应该变成 123 // v = v.replace(/^0+(\\d)/, '$1'); // } // // 5. 去除多余的小数点(只保留第一个) // const firstDot = v.indexOf('.'); // if (firstDot !== -1) { // const beforeDot = v.substring(0, firstDot + 1); // const afterDot = v.substring(firstDot + 1).replace(/\\./g, ''); // v = beforeDot + afterDot; // } // // 6. 限制小数点后最多两位 // const dotIndex = v.indexOf('.'); // if (dotIndex !== -1) { // const integerPart = v.substring(0, dotIndex); // const decimalPart = v.substring(dotIndex + 1, dotIndex + 3); // v = integerPart + '.' + decimalPart; // } // // 7. 特殊情况处理:如果只有负号或负号加0,保留它们 // if (v === '-' || v === '-0') { // this.value = v; // return; // } // // 8. 处理以0开头的非小数情况 // if (v.length > 1 && v[0] === '0' && v[1] !== '.') { // v = v.substring(1); // } // this.value = v; // `; /** * 金额输入框数输入时执行的代码,使用 String.raw 可以原样处理字符串,不解析转义序列,对于正则表达式,String.raw 非常有用 */ export const TOTAL_INPUT_EXECUTED_CODE = String.raw` let v = this.value; // 1. 只允许数字、小数点、负号 v = v.replace(/[^\d.-]/g, ''); // 2. 处理负号:只能出现在开头,且只出现一次 let hasNegative = false; if (v.includes('-')) { // 检查负号是否在开头 if (v[0] === '-') { hasNegative = true; // 保留开头的负号,移除其他位置的负号 v = '-' + v.slice(1).replace(/-/g, ''); } else { // 负号不在开头,移除所有负号 v = v.replace(/-/g, ''); } } // 3. 处理单独的小数点 if (v === '.') v = '0.'; if (v === '-.') v = '-0.'; // 4. 处理前导零:去除整数部分的前导零,但保留小数点和负数的情况 if (hasNegative) { // 负数情况:-0.12 应该保留为 -0.12 // 只有当负号后面有多个0,且这些0后面不是小数点时,才去除前导零 // 例如:-0123 应该变成 -123 v = v.replace(/^(-?)0+(\d)/, '$1$2'); } else { // 正数情况:0123 应该变成 123 v = v.replace(/^0+(\d)/, '$1'); } // 5. 去除多余的小数点(只保留第一个) const firstDot = v.indexOf('.'); if (firstDot !== -1) { const beforeDot = v.substring(0, firstDot + 1); const afterDot = v.substring(firstDot + 1).replace(/\./g, ''); v = beforeDot + afterDot; } // 6. 限制小数点后最多两位 const dotIndex = v.indexOf('.'); if (dotIndex !== -1) { const integerPart = v.substring(0, dotIndex); const decimalPart = v.substring(dotIndex + 1, dotIndex + 3); v = integerPart + '.' + decimalPart; } // 7. 特殊情况处理:如果只有负号或负号加0,保留它们 if (v === '-' || v === '-0') { this.value = v; return; } // 8. 处理以0开头的非小数情况 if (v.length > 1 && v[0] === '0' && v[1] !== '.') { v = v.substring(1); } this.value = v; `;

src\constants\index.ts

export * from "./ExecutionCode.constants";

2、使用常量

src\views\capital\CapitalInfo.vue

<!-- 方法1:oninput 原生事件,易读的JavaScript代码(使用常量) --> <el-input v-model="localCapitalInfo.capitalTotal" :oninput="TOTAL_INPUT_EXECUTED_CODE" clearable />

效果:支持

0

0.0

0.00

0.1

0.01

123.45

-123.45

-0.1

不支持

.1> 0.1

-.1> -0.1

.01> 0.01

-0 > -0> 应该是0

-.0> -0.0> 应该是0.0

-.00> -0.00> 应该是0.00

-.01> -0.01


<!-- 处理金额输入(只能输入数字、负号和小数点,最多两位小数,不能0开头,只能开头输入负号,只能输入一次负号和小数点),支持.01 --> <!-- 方法1:oninput 原生事件 --> <el-input v-model="localCapitalInfo.capitalTotal" oninput="value=value.replace(/[^\d.-]/g, ``).replace(/^(-?)0+(\d)/, `$1$2`).replace(/(?!^)-/g, ``).replace(/(\..*)\./g, `$1`).replace(/^(-?\d*\.\d{0,2}).*/g, `$1`)" clearable />

效果:支持

.1

-.1

.01

-0

-.0

-.00

-.01


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 21:00:38

2026 年学术研究 AI 写论文辅助软件权威排行榜

一、综合排行榜 TOP10&#xff08;按综合评分排序&#xff09; 排名工具名称综合评分核心特性标签适用场景1PaperRed99 分全流程王者、合规标杆、免费 AIGC 不限次检测本科 / 硕士 / 博士全阶段论文、期刊投稿、查重降重全流程2毕业之家 AI94 分中文学术全流程、真实文献引用、…

作者头像 李华
网站建设 2026/7/2 3:22:13

用于结构振动响应压缩的频率增强矢量量化变分自编码器

1. 论文中文标题 用于结构振动响应压缩的频率增强矢量量化变分自编码器 2. 论文主要内容概括 本文针对结构健康监测中振动响应数据量大、传输存储困难的问题,提出了一种频率增强的矢量量化变分自编码器(FEVQVAE)压缩方法。传统自编码器只能将数据压缩为低维浮点特征,限制…

作者头像 李华
网站建设 2026/7/2 11:18:55

高性能压缩库实现

1、非修改序列算法这些算法不会改变它们所操作的容器中的元素。1.1 find 和 find_iffind(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第一个满…

作者头像 李华
网站建设 2026/7/1 15:07:29

C++中的享元模式实战

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第…

作者头像 李华
网站建设 2026/7/1 2:41:15

征稿通知 | 第二十届全国知识图谱与语义计算大会(CCKS 2026)

会议时间&#xff1a;2026年8月21日-23日会议主页&#xff1a;https://sigkg.cn/ccks2026/全国知识图谱与语义计算大会&#xff08;China Conference on Knowledge Graph and Semantic Computing&#xff0c;CCKS&#xff09;由中国中文信息学会语言与知识计算专业委员会主办&a…

作者头像 李华