基于Element的el-input实现一个可以显示千分位符的金额输入框
直接上代码
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实现一个可以显示千分位符的金额输入框的更多相关文章
- input框输入金额显示千分位
比如输入:1000000,则显示为1,000,000(或者是保留3位小数:1,000,000.000) 知识点: 1)JavaScript parseFloat() 函数: 定义:parseFloat ...
- JS返回一个数据的千分位格式
/** * 价钱转换-从右往左每3位数字加一个逗号 * @param price 需要转换的价格 */ formatPrice(price){ var newPrice = price.split(' ...
- 数据每三位增加一个逗号(即千分符) js
使用 toLocaleString() 另一种使用场景
- input输入框数字转带千分位的字符串
数字转带千分位的字符串 思路 先获取要转换的数字,对其进行分割 小数部分具体需要保留多少位,具体处理 整数部分用正则做替换 将小数部分和整数部分合计 代码 注意: 本文是基于 jQuery 写的,稍稍 ...
- 手把手教学~基于element封装tree树状下拉框
在日常项目开发中,树状下拉框的需求还是比较常见的,但是element并没有这种组件以供使用.在这里,小编就基于element如何封装一个树状下拉框做个详细的介绍. 通过这篇文章,你可以了解学习到一个树 ...
- 基于easyui框架中input 类型的checkbox拼接成字符串存入数据库和读取选中---善良公社项目
项目中我做修改用户个人资料的时候,有一个需求是帮助人员的帮助类型如图下所示: 当初想如果是asp.net控件的话应该很简单实现,如果不是基于easyUI框架那就太简单了,现在是受框架的限制与是前端ht ...
- 基于element UI 的上传插件
为了不再重复的上传文件,做了一个统一选择文件和上传文件的 基于 element UI :http://element-cn.eleme.io 前端实现文件下载和拖拽上传 演示 用法 <uploa ...
- krry-transfer ⏤ 基于 element 的升级版穿梭框组件发布到 npm 啦
博客地址:https://ainyi.com/81 基于 element ui 的==升级版穿梭框组件==发布到 npm 啦 看过我之前博客的同学或许知道我之前写过关于 element 穿梭框组件重构 ...
- 如何在js或者jquery中操作EL表达式的一个List集合
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 先说明此篇博客看明白了可以干嘛: 就是在js或者jquery中操作一个EL表达式的一个list集合或者复杂类型 ...
- 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil
基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...
随机推荐
- html css使用特殊自定义字体避免侵权
一般系统支持的网页常见中文字体有:宋体.雅黑.黑体.但是大多网站使用电脑自带微软雅黑(方正的)可能侵权 p { font-family: Arial,sans-serif; } 可免费商用字体百度自行 ...
- Qt编写ERP库存库房发货电子看板
一.前言 有了之前可视化大屏电子看板系统的经验,要做这个ERP库存库房发货电子看板,可以说是水到渠成轻车熟路,技术难度比之前做过的各种大屏系统的子模块都要简单.由于库存库房发货数据的特殊性,基本上都是 ...
- 古早的遗传算法碰到LLM->😊AutoDAN Generating Stealthy Jailbreak Prompts on💗Aligned Large Language Models
师兄推给我的一篇ICLR,抽出时间阅读整理了附录前的内容 这次没有完全翻译,因为我想组会上分享,转成自己的话 禁止盗用,侵权必究!!!欢迎大家积极举报
- 不为人知的网络编程(十六):深入分析与解决TCP的RST经典异常问题
本文由腾讯技术kernel分享,原题"TCP经典异常问题探讨与解决",下文进行了排版和内容优化等. 1.引言 TCP的经典异常问题无非就是丢包和连接中断,在这里我打算与各位聊一聊T ...
- IM通讯协议专题学习(三):由浅入深,从根上理解Protobuf的编解码原理
本文由码农的荒岛求生陆小风分享,为了提升阅读体验,进行了较多修订和排版. 1.引言 搞即时通讯IM方面开发的程序员,在谈到通讯层实现时,必然会提到网络编程.那么计算机网络编程中的一个非常基本的问题:到 ...
- 【狂神说Java】Java零基础学习笔记-JavaSE总结
[狂神说Java]Java零基础学习笔记-JavaSE总结 JavaSE总结: -完结-撒花- [[狂神说Java]Java零基础学习视频通俗易懂]https://www.bilibili.com/v ...
- MSM8953/SDM450 去PMI的USB3.0 TYPE-C Micro USB OTG功能适配
提前说明一下有哪些"坑". 1.PM8953 GPIO_8的TZ权限 2.PM8953 GPIO_8寄存器的写入保护 3.去掉高通默认的ID检测 4.增加dwc3的ID检测 5.增 ...
- 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-11- 标签页(tab)操作 - 下篇 (详细教程)
1.简介 本来按照计划这一系列的文章应该介绍Context和Page两个内容的,但是宏哥看了官方文档和查找资料发现其实和宏哥在Python+Playwright系列文章中的大同小异,差不了多少,再在这 ...
- 单片机的主程序中为什么都要加一个while(1)?
*** * C51 为什么都要加一个while(1)?****** while(1)的作用: while(1) 是一个死循环 为了不让代码继续向下执行. 单片机中使用while(1),大部分:为了防止 ...
- Spring Boot进阶教程--注解大全
springboot注解大全 SpringBoot注解就是给代码打上标签的能力.通过引入注解,我们可以简单快速赋予代码生命力,大大提高代码可读性和扩展性.注解本身不具有任何能力,只是一个标签,但是我们 ...