news 2026/5/30 23:23:17

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/5/28 21:08:29

基于区块链的传感器数据存证与溯源系统

基于区块链的传感器数据存证与溯源系统:用“不可篡改的指纹”守护数字世界的真实 一、引入:一盒冰淇淋的信任危机 夏天的午后,小明抱着刚从超市买的进口香草冰淇淋往家跑——包装盒上明明白白写着“全程冷链≤-18℃”。可打开时,冰淇淋已经化成了黏糊糊的液体。 他拿着购…

作者头像 李华
网站建设 2026/5/29 1:09:47

代码动态生成技术

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

作者头像 李华
网站建设 2026/5/29 0:05:17

第一批笃信AI的人,也被解雇了

最近有这么个新闻&#xff0c;还怪幽默的。1月25日消息&#xff0c;俄甲知名俱乐部索契透露了前教练罗伯特莫雷诺被解雇的原因&#xff1a;他让AI替他工作。这位前西班牙国家队教练&#xff0c;大概是网上大家羡慕的那种最先拥抱AI的人。作为ChatGPT的忠实粉丝&#xff0c;他让…

作者头像 李华
网站建设 2026/5/30 16:40:15

在腾讯偶遇姚顺雨,这一次他是来发科研奖金的…

闻乐 发自 凹非寺量子位 | 公众号 QbitAI来围观腾讯青云奖学金颁奖&#xff0c;竟然偶遇了姚顺雨。这位27岁的腾讯首席AI科学家&#xff0c;在腾讯大楼的线下公开亮相&#xff0c;不是发布重磅产品&#xff0c;也不是解读战略布局——而是给一群青年研究者颁发青云奖学金&#…

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

硅谷甘愿“裸奔”,中国大厂连夜“铺路”:Moltbot凭什么横扫中美?

出品 | 网易科技作者 | 辰辰编辑 | 王凤枝它真的“太好使唤”了。2026年开年&#xff0c;一只名为Moltbot的“龙虾”让中美科技圈罕见地达成了一种默契的狂热。从硅谷的车库到中关村的云端&#xff0c;这个AI智能体正以病毒般的速度接管全球开发者的电脑。你像给秘书发微信一样…

作者头像 李华