首页 > 其他分享 >element-ui实现输入框千分位

element-ui实现输入框千分位

时间:2023-12-18 11:12:28浏览次数:36  
标签:el default 千分 value 输入框 num ui input

需求:

1.支持v-model。

2.支持el-input所有属性。

2.失去焦点添加千位符。

3.获取焦点去掉千位符。

组件一

组件GalaxyNumberInput

<template>
    <el-input 
        class="galaxy-num-input" 
        v-model="displayValue" 
        :size="size"
        :clearable="clearable"
        :disabled="disabled"
        :placeholder="placeholder"
        @change="changeInput"
        @blur="onBlur"
        @focus="focus">
    </el-input>
</template>
<script>
export default {
    props:{
        value:{
            type:[Number,String],
            default:""
        },
        min:{
            type:Number,
            default:-999999999999999
        },

        max:{
            type:Number,
            default:999999999999999
        },
        precision:{
            type:Number,
            default:2
        },
        size:{
            type:String,
            default:"",
        },
        disabled:{
            type:Boolean,
            default:false
        },
        clearable:{
            type:Boolean,
            default:true
        },
        placeholder: {
            type:String,
            default:"",
        }
    },

    data(){
        return {
           displayValue:"", 
        }
    },

    watch:{
        value(){
            this.displayValue = this.format(this.value);
        },

        displayValue(){
            
        }
    },

    mounted(){
        this.displayValue = this.format(this.value);
    },

    methods:{

        format (val) {
            if(this.checkRates(val)){
                return Number(this.th2Num(val)).toFixed(this.precision).replace(/\B(?=(\d{3})+(?!\d))/g,',');
            }else{
                return "";
            }
        },

        checkRates(str){
            if(str===null||str===undefined){
                return false
            }else{
                let numStr = str.toString().trim().replace(/,/g, "",)
                var re = /^([0-9]+\.?[0-9]*|-[0-9]+\.?[0-9]*)$/;
                return re.test(numStr);
            }
        },

        th2Num(str){
            if(str===null||str===undefined||str===""){
                return 0;
            }else{
                return Number(str.toString().trim().replace(/,/g, "",));
            }
        },

        onBlur(){
            this.changeInput(this.displayValue);
        },


        changeInput(val){
            console.log(val,"hhhhhhhhhhhhhhhhh")
            const {min,max} = this.$props;
            let num = Number(val.trim().replace(/,/g, ""));
            if(!this.checkRates(val)){
                this.displayValue = "";
            }else{
                if(num<min){
                    num = min;
                }
                if(num>max){
                    num = max;
                }
            }
            this.displayValue = this.format(num);
            this.$emit("input",Number(num.toFixed(this.precision)));
            this.$emit("change",Number(num.toFixed(this.precision)));
        },

        focus(){
            this.$emit("focus");
        },

    },
}
</script>
<style lang="scss" scoped>
.galaxy-num-input /deep/ .el-input__inner{
        text-align: center !important;
}
</style>

引用

// 全局引用
import GalaxyNumberInput from '@/components/GalaxyNumberInput'
Vue.component('galaxy-number-input', GalaxyNumberInput)
// 局部引用
import GalaxyNumberInput from '@/components/GalaxyNumberInput'
components: { GalaxyNumberInput  },

应用

   <galaxy-number-input style="width:100%;margin:6px 0" :min="0" v-model="availableAmount" :precision="2" :controls="false" size="mini" disabled />

原文:https://blog.csdn.net/zhiyanghejiaojiao/article/details/130701932

组件二

封装组件

<template>
    <div class="money-input">
        <el-input type="text" ref="input" v-model="noticeData" @blur="focusBlur('blur')"
                  :placeholder="placeholder" :disabled="disabled"
                  @focus="focusBlur('focus')"/>
    </div>
</template>
 
<script>
    export default {
        name: 'MoneyInput',
        props: {
            // 可以添加element-ui的所有属性(目前我只添加三个属性)
            value: {
                type: [ String, Number ],
                default: '',
            },
            placeholder: {
                type: String,
                default: '',
            },
            disabled: {
                type: Boolean,
                default: false
            }
        },
        data () {
            return {
                noticeData: ''
            };
        },
        created () {
 
        },
        mounted () {
            this.separate(this.value);
        },
        methods: {
            // 增加千位符
            addThousandSign (num) {
                if (num) {
                    const res = num.toString().replace(/\d+/, (n) => { // 先提取整数部分
                        return n.replace(/(\d)(?=(\d{3})+$)/g, ($1) => {
                            return $1 + ',';
                        });
                    });
                    return res;
                }
            },
            // 去掉千位符
            removeThousandSign (num) {
                if (num) {
                    num = num.toString();
                    num = num.replace(/,/gi, '');
                    num = num.replace(/[ ]/g, ''); //去除空格
                    return num;
                }
            },
            // 初始化 添加千位符赋值
            separate (val) {
                // 赋值前不能加非空判断,会导致组件值无法清空
                // if(val){
                //     this.noticeData = this.addThousandSign(val);
                // }
                this.noticeData = this.addThousandSign(val);
            },
            // 鼠标失去焦点鼠标获取焦点触发
            focusBlur (type) {
                if (type === 'blur') {
                    this.noticeData = this.addThousandSign(this.noticeData);
                    this.$emit('input', this.removeThousandSign(this.noticeData));
                } else if (type === 'focus') {
                    this.noticeData = this.removeThousandSign(this.noticeData);
                }
            }
        },
        computed: {},
        watch: {
            value (val) {
                this.separate(val);
            }
        }
    };
</script>
 
<style scoped>
 
</style>

使用组件

<template>
    <div class="dome_component">
        v-model="value":{{ value }}
        <MoneyInput v-model="value"/>
    </div>
</template>
<script>
    // 引入组件
    import MoneyInput from './components/money-input';
    export default {
        name: 'DomeComponent',
        components: {
            MoneyInput,
        },
        data () {
            return {
                value: '',
            };
        },
        watch: {
        },
        filters: {},
        computed: {},
        mounted () {
 
        },
        methods: {}
    };
</script>
<style lang="less" type="text/less">
    .dome_component {
 
    }
</style>

原文来自:https://blog.csdn.net/qq_43395232/article/details/120214266

方式三 - 自定义指令

thousands.js

// 金额展示千分位
// 方式一、在main.js直接创建 
Vue.directive("thousands", {
  inserted: function(el, binding) {
    // debugger
    // 获取input节点
    if (el.tagName.toLocaleUpperCase() !== "INPUT") {
      el = el.getElementsByTagName("input")[0];
    }
    // 千分位格式化
    el.value = parseFloat(el.value).toLocaleString("zh", {
      minimumFractionDigits: 2,
      maximumFractionDigits: 2
    });
    // 聚焦转化为数字格式(去除千分位)
    el.onfocus = e => {
      const a = el.value.replace(/,/g, ""); // 去除千分号的','
      el.value = parseFloat(a).toFixed(2);
    };
    // 失去焦点重新格式化
    el.onblur = e => {
      setTimeout(() => {
        // 恢复原始值
        // el.value = parseFloat(el.value);
        // 格式化为千分位
        el.value = parseFloat(el.getAttribute("aria-valuenow")).toLocaleString(
          "zh",
          {
            minimumFractionDigits: 2,
            maximumFractionDigits: 2
          }
        );
      }, 0);
    };
  },
  update: function(el, binding) {
    // debugger
    // 获取input节点
    if (el.tagName.toLocaleUpperCase() !== "INPUT") {
      el = el.getElementsByTagName("input")[0];
    }
     setTimeout(() => {
    // 千分位格式化
    const valueWithoutComma = el.value.replace(/,/g, ""); // 去除千分号的','
    // 转换为浮点数
    const floatValue = parseFloat(valueWithoutComma);
    // 格式化为千分位
    el.value = floatValue.toLocaleString("zh", {
      minimumFractionDigits: 2,
      maximumFractionDigits: 2
    });
    }, 100);
  }
});

// 方式二  封装
 /**
 * 展示千分位
 * Copyright (c) 2023
 */
 

 export default {
    inserted: function(el, binding) {
        // debugger
        // 获取input节点
        if (el.tagName.toLocaleUpperCase() !== "INPUT") {
          el = el.getElementsByTagName("input")[0];
        }
        // 千分位格式化
        el.value = parseFloat(el.value).toLocaleString("zh", {
          minimumFractionDigits: 2,
          maximumFractionDigits: 2
        });
        // 聚焦转化为数字格式(去除千分位)
        el.onfocus = e => {
          const a = el.value.replace(/,/g, ""); // 去除千分号的','
          el.value = parseFloat(a).toFixed(2);
        };
        // 失去焦点重新格式化
        el.onblur = e => {
          setTimeout(() => {
            // 恢复原始值
            // el.value = parseFloat(el.value);
            // 格式化为千分位
            el.value = parseFloat(el.getAttribute("aria-valuenow")).toLocaleString(
              "zh",
              {
                minimumFractionDigits: 2,
                maximumFractionDigits: 2
              }
            );
          }, 0);
        };
      },
      update: function(el, binding) {
        // debugger
        // 获取input节点
        if (el.tagName.toLocaleUpperCase() !== "INPUT") {
          el = el.getElementsByTagName("input")[0];
        }
         setTimeout(() => {
        // 千分位格式化
        const valueWithoutComma = el.value.replace(/,/g, ""); // 去除千分号的','
        // 转换为浮点数
        const floatValue = parseFloat(valueWithoutComma);
        // 格式化为千分位
        el.value = floatValue.toLocaleString("zh", {
          minimumFractionDigits: 2,
          maximumFractionDigits: 2
        });
        }, 100);
      }
 }
 

main.js

// 封装自定义指令引用
import thousands from './directive/thousands'

应用

在html界面使用例子如下(直接加入:v-thousands 即可)

				<el-input-number
                  v-thousands
                  v-if="isCanEdit"
                  v-model="addForm.base_header.atl_amt"
                  :step="1"
                  :min="0"
                  style="width: 160px;"
                  placeholder="0.00"
                  controls-position="right"
                  @change="changeAtlAmt"
                />

原文地址:https://blog.csdn.net/weixin_45869649/article/details/133339435?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~YuanLiJiHua~Position-2-133339435-blog-120214266.235^v39^pc_relevant_anti_vip_base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~YuanLiJiHua~Position-2-133339435-blog-120214266.235^v39^pc_relevant_anti_vip_base&utm_relevant_index=5

标签:el,default,千分,value,输入框,num,ui,input
From: https://www.cnblogs.com/axingya/p/17910601.html

相关文章

  • vue-element-ui 日期选择器 前后端联调
    前端:<el-col:span="8"><divclass="block"><el-col:span="4">交接日期</el-col><el-col:span="1"></el-col><el-col:span="16&quo......
  • Etcd Web UI
    etcdkeeper支持v3的api1.安装dockerrun-it-d--nameetcdkeeper\-p8080:8080\deltaprojects/etcdkeeper2.访问web本机ip:80803.登陆etcd数据库......
  • Unity3D 关于过大的UI帧动画如何处理详解
    Unity3D是一款流行的游戏开发引擎,它可以用来创建各种类型的游戏,包括2D和3D游戏。在游戏中,UI帧动画是一个常见的元素,它可以增加游戏的交互性和视觉效果。然而,当UI帧动画过大时,可能会导致游戏的性能下降和卡顿现象。本文将详细介绍如何处理过大的UI帧动画,并给出相应的技术详解和代码......
  • 2023 China Collegiate Programming Contest (CCPC) Guilin Onsite (The 2nd Universa
    题解:https://files.cnblogs.com/files/clrs97/2023Guilin_Tutorial.pdf Code:A.EasyDiameterProblem#include<bits/stdc++.h>usingnamespacestd;constintN=300;constintmod=1e9+7;typedefpair<int,int>pii;vector<pair<int,int......
  • 使用 Power Shell 修改 Hyper-V 虚拟机 UUID 的解决方案
    前言在研究了一下午k8s文档的时候,正准备开干,万万没想到一个uuid的问题卡了我几个小时,一直想在系统中解决,没想到最后在外部使用PowerSheel解决了,分享记录一二问题描述与尝试解决根据官方文档使用kubeadm创建k8s集群的准备,所以准备在之前文章中使用Hyper-V安装的Cen......
  • GUI
    importpandasaspdimporttkinterastkfromtkinterimportmessagebox#创建数据库表#Excel表中必须包含学号、班级、姓名这三列class_info=pd.read_excel('students.xlsx')#创建GUI程序root=tk.Tk()root.title('班级信息收集')#设置窗口大小window_width=400window_......
  • CF1906K Deck-Building Game记录
    CF1906KDeck-BuildingGame题目链接:https://codeforces.com/problemset/problem/1906/K题意有大小为$n$的多重集$A$。求找到两个不相交子集,使它们各自的异或和相等的方案数。很容易将其转换为求如下值:$$\sum_{S\subsetA}2^{|S|}\cdot[\oplus_{x\inS}x=0]$$......
  • GUI程序设计--班级信息收集系统
    因为没学过SQLandAccess的连接太麻烦了,所以是直接使用pandas库读写Excel文件的方法importpandasaspdimporttkinterastkfromtkinterimportmessagebox#创建数据库表#Excel表中必须包含学号、班级、姓名这三列class_info=pd.read_excel('students.xlsx')#创......
  • 超级好用的 HBase GUI 工具分享
    超级好用的HBaseGUI工具分享你是否曾为HBase数据管理而苦恼?别担心,这一款超级好用的HBaseGUI(HBaseAssistant)工具,让您在大数据世界中游刃有余。不再需要繁琐的命令行操作,也不再为复杂的配置感到头疼。主要功能直观和设计完善的图形用户界面,让您轻松应对数据库管理和开......
  • 简单实现mui-底部选项卡
    我在看官方的mui文档的时候发现并没有找到选项卡的位置,所以我并没有采纳可能是我太笨了吧接触的还少,先说说我原先是如何写底部选项卡的<navclass="mui-barmui-bar-tab"><aclass="mui-tab-itemmui-active"href="pSMain.html"> <spanclass="mui-icon"><imgsrc=......