news 2026/4/16 16:02:55

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/4/16 14:21:10

Java面试必看:如何高效列出所有文件?

文章目录Java面试必看&#xff1a;如何高效列出所有文件&#xff1f;引言正文一、File类的基本用法二、使用递归实现文件遍历三、使用NIO库实现高效文件遍历四、使用第三方工具类库五、性能优化六、总结结语好了&#xff0c;今天的分享就到这里。希望这篇文章能够帮助大家在Jav…

作者头像 李华
网站建设 2026/4/16 15:48:38

Nature | 清北合作研发全球首个全柔性存算一体AI芯片

FLEXI团队 投稿 量子位 | 公众号 QbitAI一张薄如纸片、能卷在手指上的柔性芯片&#xff08;不是柔性印刷电路板&#xff0c;是柔性集成电路&#xff09;&#xff0c;能做什么&#xff1f;在可穿戴设备中实时识别心律失常&#xff1f;在柔性机器人中执行复杂感知&#xff1f;在未…

作者头像 李华
网站建设 2026/4/16 14:32:12

模板代码性能测试

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

作者头像 李华
网站建设 2026/4/16 14:28:22

移动端前端适配:Rem、VW/VH 与媒体查询的综合应用指南

随着移动互联网的飞速发展&#xff0c;移动设备已成为用户访问互联网的主要入口。根据StatCounter 2024年最新统计数据显示&#xff0c;全球移动设备访问互联网的比例已达到62.8%&#xff0c;在中国这一比例更是高达75.3%。这一趋势对前端开发提出了新的挑战&#xff1a;如何确…

作者头像 李华
网站建设 2026/4/16 7:14:32

MWGA如何帮助7万行Winforms程序快速迁移到WEB前端

1.前言MWGA&#xff0c;是 Make Winforms Great Again 的缩写&#xff0c;是一个帮助 WinForms 程序快速迁移到 Blazor WASM 平台的高效工具软件。近期&#xff0c;我们借助 MWGA 成功将一个约 7 万行 C# 代码的成熟商业 WinForms 程序迁移至 Web 前端&#xff0c;整个过程快速…

作者头像 李华