直接上代码

1 <template>
2 <!-- 定义一个 Element UI 的输入框组件 -->
3 <el-input
4 v-model="formattedValue"
5 @input="handleInput"
6 @change="handleChange"
7 ></el-input>
8 </template>
  1 <script>
2 /**
3 * MyFormattedInput 组件,用于格式化输入的数字,并添加千分位分隔符
4 *
5 * @props {Number|String} value - 输入的值,默认为 0
6 */
7 export default {
8 // 组件名称
9 name: "MyFormattedInput",
10 // 定义组件的 props
11 props: {
12 value: {
13 // 支持的类型为数字或字符串
14 type: [Number, String],
15 // 默认值为 0
16 default: 0,
17 },
18 },
19 // 计算属性
20 computed: {
21 formattedValue: {
22 /**
23 * 获取格式化后的值
24 *
25 * @returns {String} 格式化后的字符串,添加了千分位分隔符
26 */
27 get() {
28 // 打印获取值时的日志
29 console.log("get", this.value);
30 // 将值转换为字符串,并添加千分位分隔符
31 return this.value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
32 },
33 /**
34 * 设置格式化后的值,并触发 input 事件
35 *
36 * @param {String} formattedValue - 格式化后的值
37 */
38 set(formattedValue) {
39 // 打印设置值时的日志
40 console.log("set", formattedValue);
41 // 获取小数点的索引
42 const pointIndex = formattedValue.indexOf(".");
43 // 判断最后一个字符是否为小数点
44 const hasLastPoint = formattedValue[formattedValue.length - 1] === ".";
45 // 判断是否包含小数点
46 const hasPoint = formattedValue.includes(".");
47 if (hasPoint && hasLastPoint) {
48 // 如果包含小数点且最后一个字符是小数点,移除逗号并触发 input 事件
49 this.$emit("input", formattedValue.replace(/,/g, ""));
50 } else if (hasPoint && !hasLastPoint) {
51 if (formattedValue.length - 2 > pointIndex) {
52 // 如果包含小数点且有足够的小数位数,移除逗号并保留两位小数
53 this.$emit(
54 "input",
55 this.toFixedNoRound(parseFloat(formattedValue.replace(/,/g, "")), 2)
56 );
57 } else {
58 // 如果小数位数不足,移除逗号并触发 input 事件
59 this.$emit("input", formattedValue.replace(/,/g, ""));
60 }
61 } else {
62 // 如果不包含小数点,移除逗号并转换为数字,若为 NaN 则为 0
63 this.$emit(
64 "input",
65 parseFloat(formattedValue.replace(/,/g, "")) || 0
66 );
67 }
68 },
69 },
70 },
71 // 组件的方法
72 methods: {
73 /**
74 * 处理输入事件
75 *
76 * @param {String} value - 输入的值
77 */
78 handleInput(value) {
79 // 打印输入事件的日志
80 console.log("handleInput", value);
81 // 计算小数点出现的次数
82 var pointShowCount = value.split(".").length - 1;
83 if (pointShowCount == 0 || pointShowCount == 1) {
84 // 如果小数点出现 0 或 1 次
85 if (isNaN(parseFloat(value.replace(/,/g, "")))) {
86 // 如果移除逗号后不是数字,触发 input 事件并传入 0
87 this.$emit("input", 0);
88 }
89 }
90 },
91 /**
92 * 处理值改变事件
93 *
94 * @param {String} value - 改变后的值
95 */
96 handleChange(value) {
97 // 打印值改变事件的日志
98 console.log("handleChange", value);
99 if (isNaN(parseFloat(value.replace(/,/g, "")))) {
100 // 如果移除逗号后不是数字,触发 change 事件并传入 0
101 this.$emit("change", 0);
102 } else {
103 // 如果是数字,移除逗号并转换为数字,若为 NaN 则为 0
104 this.$emit("change", parseFloat(value.replace(/,/g, "")) || 0);
105 }
106 },
107 /**
108 * 截取指定小数位数,不进行四舍五入
109 *
110 * @param {Number} num - 要处理的数字
111 * @param {Number} decimals - 保留的小数位数
112 * @returns {String} 处理后的字符串,保留指定小数位数
113 */
114 toFixedNoRound(num, decimals) {
115 // 计算乘数
116 const multiplier = Math.pow(10, decimals);
117 // 截取小数部分
118 const truncatedNum = Math.trunc(num * multiplier) / multiplier;
119 // 转换为字符串并保留指定小数位数
120 return truncatedNum.toFixed(decimals);
121 },
122 },
123 };
124 </script>
  • get() 方法:将 this.value 转换为字符串,并使用正则表达式 /\B(?=(\d{3})+(?!\d))/g 添加千分位分隔符。
  • set() 方法:根据输入值的不同情况处理小数点和小数位数,并触发 input 事件。
  • handleInput(value):处理输入事件,计算小数点出现的次数,若移除逗号后不是数字,则触发 input 事件并传入 0。
  • handleChange(value):处理值改变事件,若移除逗号后不是数字,则触发 change 事件并传入 0;否则,移除逗号并转换为数字,若为 NaN 则为 0。
  • toFixedNoRound(num, decimals):截取指定小数位数,不进行四舍五入。

基于Element的el-input实现一个可以显示千分位符的金额输入框的更多相关文章

  1. input框输入金额显示千分位

    比如输入:1000000,则显示为1,000,000(或者是保留3位小数:1,000,000.000) 知识点: 1)JavaScript parseFloat() 函数: 定义:parseFloat ...

  2. JS返回一个数据的千分位格式

    /** * 价钱转换-从右往左每3位数字加一个逗号 * @param price 需要转换的价格 */ formatPrice(price){ var newPrice = price.split(' ...

  3. 数据每三位增加一个逗号(即千分符) js

    使用  toLocaleString()  另一种使用场景

  4. input输入框数字转带千分位的字符串

    数字转带千分位的字符串 思路 先获取要转换的数字,对其进行分割 小数部分具体需要保留多少位,具体处理 整数部分用正则做替换 将小数部分和整数部分合计 代码 注意: 本文是基于 jQuery 写的,稍稍 ...

  5. 手把手教学~基于element封装tree树状下拉框

    在日常项目开发中,树状下拉框的需求还是比较常见的,但是element并没有这种组件以供使用.在这里,小编就基于element如何封装一个树状下拉框做个详细的介绍. 通过这篇文章,你可以了解学习到一个树 ...

  6. 基于easyui框架中input 类型的checkbox拼接成字符串存入数据库和读取选中---善良公社项目

    项目中我做修改用户个人资料的时候,有一个需求是帮助人员的帮助类型如图下所示: 当初想如果是asp.net控件的话应该很简单实现,如果不是基于easyUI框架那就太简单了,现在是受框架的限制与是前端ht ...

  7. 基于element UI 的上传插件

    为了不再重复的上传文件,做了一个统一选择文件和上传文件的 基于 element UI :http://element-cn.eleme.io 前端实现文件下载和拖拽上传 演示 用法 <uploa ...

  8. krry-transfer ⏤ 基于 element 的升级版穿梭框组件发布到 npm 啦

    博客地址:https://ainyi.com/81 基于 element ui 的==升级版穿梭框组件==发布到 npm 啦 看过我之前博客的同学或许知道我之前写过关于 element 穿梭框组件重构 ...

  9. 如何在js或者jquery中操作EL表达式的一个List集合

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 先说明此篇博客看明白了可以干嘛: 就是在js或者jquery中操作一个EL表达式的一个list集合或者复杂类型 ...

  10. 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil

    基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...

随机推荐

  1. Mac触控板设置以及使用

    Mac 触控板体验是非常好的,很多同学甚至直接用触控板代替鼠标操作,但是默认设置中有一些功能是没有开启的,需要手动配置. 本文就来说说 如何更改 Mac 触控板默认设置,让触控板变得更高效. 一.启用 ...

  2. Qt安卓开发经验011-020

    安卓中一个界面窗体对应一个Activity,多个界面就有多个Activity,而在Qt安卓程序中,Qt这边只有一个Activity那就是QtActivity(包名全路径 org.qtproject.q ...

  3. 国产系统UOS上的视频监控系统

    一.功能特点 (一)软件模块 视频监控模块,各种停靠小窗体子模块,包括设备列表.图文警情.窗口信息.云台控制.预置位.巡航设置.设备控制.悬浮地图.网页浏览等. 视频回放模块,包括本地回放.远程回放. ...

  4. IM开发技术学习:揭秘微信朋友圈这种信息推流背后的系统设计

    本文由徐宁发表于腾讯大讲堂,原题"程序员如何把你关注的内容推送到你眼前?揭秘信息流推荐背后的系统设计",有改动和修订. 1.引言 信息推流(以下简称"Feed流" ...

  5. Linux安全加固(一)

    1.Linux关键用户文件/etc/password文件 Root:x:0:0:root:/bin/bash ●用户名:代表用户账号的字符串.通常长度不超过8个字符,并且由大小写字母和/或数字组成.登 ...

  6. Linux 运维必备 150 个命令汇总

    地址:https://www.linuxcool.com 线上查询及帮助命令 man:全拼manual,用来查看系统中自带的各种参考手册. help:用于显示shell内部命令的帮助信息. 文件和目录 ...

  7. 微服务技术架构、监控、Docker、服务治理等详解

    1.什么是微服务 1)一组小的服务(大小没有特别的标准,只要同一团队的工程师理解服务的标识一致即可) 2)独立的进程(java的tomcat,nodejs等) 3)轻量级的通信(不是soap,是htt ...

  8. 解决线程安全问题的方式三:Lock锁 --- JDK5.0新增

    Lock( 锁) 从JDK 5.0开始,Java提供了更强大的线程同步机制--通过显式定义同步锁对象来实现同步.同步锁使用Lock对象充当. java.util.concurrent.locks. ...

  9. 最佳产品奖,TeleDB拿下!

    近日,第十三届PostgreSQL技术大会在杭州举行.本次大会以"聚焦云端创新,汇聚智慧共享"为主题,行业大咖.学术精英.技术专家和技术爱好者齐聚一堂,共同探讨数据库领域的发展趋势 ...

  10. Windows中使用http-server搭建一个本地服务

    我们在开发中,经常会需要搭建一个本地服务去浏览开发的静态html文件,如果当静态文件中存在一些http.https或者访问文件之类的请求时,直接双击打开html文件是会报错预览不成功的,这时候就需要将 ...