当前位置: 首页 > news >正文

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


http://www.jsqmd.com/news/338669/

相关文章:

  • 2026 年学术研究 AI 写论文辅助软件权威排行榜
  • springboot基于Java Web的自助甜品商城网站系统(源码+文档+运行视频+讲解视频)
  • AI日报 - 2026年02月03日
  • springboot基于Java Web天气预报管理系统出行计划(源码+文档+运行视频+讲解视频)
  • 【毕业设计】基于ssm的农产品销售系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 用于结构振动响应压缩的频率增强矢量量化变分自编码器
  • 复现 CVE-2024-48990 并构建自己的漏洞利用程序
  • springboot基于java web的在线图书借阅管理系统(源码+文档+运行视频+讲解视频)
  • Excel WEEKDAY函数全解析:从星期判断到智能工资计算,掌握日期背后的周期密码
  • 核素海洋扩散计算模型的构建与验证方法体系的完善研究
  • 实用指南:基于 HTML5 Canvas 的终端日志流可视化实现(支持多 Pane / 运维模式)
  • 基于全局和局部接受性因果特征的广义学习模型,用于在线增量机械故障诊断
  • 基于ANSYS的螺旋桨气动性能数值仿真研究:悬停与前飞工况分析
  • Avalonia-数据绑定
  • 分享如何实现前端埋点工程
  • 2026金三银四必看:AI Agent全栈学习路线,三个月从小白到Offer收割机!
  • 2026届毕业生就业新方向,从零开始学大模型开发,实战项目+名师指导,立即收藏!
  • 设计师必藏!1招秒杀相似图,告别手动翻文件夹的痛
  • 技巧总结
  • 春晚AI机器人揭秘:大模型技术已成熟,普通人如何抓住新风口?
  • 模型数据标注规范全解析:从国标到企标的标准化实践指南
  • 墨韵新生:一位书法爱好者的鸿蒙原生应用开发手记——从手机拍字帖到PC临摹的42天破界之旅
  • 大数据领域数据产品的体育行业应用
  • 收藏必看!大模型时代来临:计算机缺口500万,应届生如何拿50W+年薪
  • C++与Docker集成开发
  • 在Windows上启用Selenium + Chrome Profile建立自动登录爬虫
  • Spring Boot 定时任务详解(从入门到实战)
  • 提示工程架构师必备:领域驱动设计(DDD)落地实战指南,从理论到代码全流程!
  • 2026澳洲奶粉品牌推荐:CareBirth臻护新苼聚焦A2奶源与科学分阶,澳洲袋鼠标认证 - 深度智识库
  • 5个实用的诊断性分析工具推荐:大数据工程师必备