Vue2.0+ElementUI实现输入框金额格式化

Vue2.0+ElementUI实现输入框金额格式化

如何用Vue实现输入框金额格式化呢?我们都知道,以元为单位时,金额往往是需要保存到小数点后两位的,用来表示角和分,并且为了能对金额位数一目了然,往往需要三位为一个间隔,用逗号分隔金额位数。基于以上需求,我们现在用Vue来实现功能。

首先我们需要知道,加了分隔符的金额就不再是数字类型了,而是字符串类型的。如果你们数据库对于金额的数据类型定义为数字的话,在存储到数据库之前是需要进行数据类型的转换的,而我们应该怎样设计才能达到,查看时是格式化的金额,而存储时是数字类型的呢?

此时我们就用到了ElementUI输入框中的两个事件,即:blur和focus,我们先来看一下ElementUI技术文档上的定义

图片引自ElementUI技术文档


根据ElementUI的技术文档我们可以得知,当鼠标点击输入框时,会让输入框获得焦点从而触发事件,同理,当鼠标点击输入框之外的部分会让其失去焦点同样也触发事件。所以我们在设计时应该是blur事件触发时金额被格式化,focus事件触发时金额恢复原貌。

<template>
  <el-input
      v-model.trim="totalprice"
      clearable
      maxlength="15" 
      placeholder="请输入金额"
      @focus="uninputMoney($event)"
      @blur="inputMoney($event)" >
     <template slot="append"></template>
   </el-input>
</template>
<script>
  export default {
   name: "contractList", 
  data(){
   return {
   totalprice:null
   methods: {
// 失去焦点金额格式化
  inputMoney(el) {
      let temp = Number(el.target.value) || null;
      this.totalprice = this.priceFormat(temp)
    // 获得焦点金额去掉格式
  uninputMoney(el) {
     if (!!el.target.value) {
       this.totalprice = this.delcommafy(el.target.value)
     }else {
       this.totalprice = null
priceFormat(num,n){  
   n = n || 2;
  let symbol = ",";
    if (num === null) return num;
    if(typeof num!=='number')throw new TypeError('num参数应该是一个number类型');
    if(n<0)throw new Error('参数n不应该小于0');
    let hasDot=parseInt(num)!=num;//这里检测num是否为小数,true表示小数
    let m = (n!=undefined&&n!=null)?n:1;
    num = m == 0?num.toFixed(m)+'.':hasDot?(n?num.toFixed(n):num):num.toFixed(m);
    symbol = symbol||',';
    num = num.toString().replace(/(\d)(?=(\d{3})+\.)/g,function(match, p1,p2) {
        return p1 + symbol;
    if(n==0||(!hasDot&&!n)){//如果n为0或者传入的num是整数并且没有指定整数的保留位数,则去掉前面操作中的小数位
        num =  num.substring(0,num.indexOf('.'));
    return num;
//去除千分位中的‘,’
delcommafy (num){
  if(!num) return num;
  num = num.toString();
  num = num.replace(/,/gi, '');
  if (num.indexOf('.00') >0) num = parseInt(num);