返回

InputNumberZen.vue 数字输入 支持两位小数

发布时间:2022-10-15 06:27:21 249
<template>
  <span style="width: 200px; display: inline-block;">
    <Input v-model="inputNumberValue"
           :disabled="disabled"
           @on-keyup="keyup"
           @on-blur="blur"
           @on-keydown="keydown" />
  </span>
</template>

<script>
export default {
  name: 'InputNumberZen',
  components: {},
  props: {
    value: {
      type: [String, Number],
      default: ''
    },
    maxlength: {
      type: Number,
      default: 9
    },
    disabled: {
      type: Boolean,
      default: false
    }
  },
  data () {
    return {
      inputNumberValue: '',
      keyList: [
        8, // 退格键
        96, // 0
        97, // 1
        98, // 2
        99, // 3
        100, // 4
        101, // 5
        102, // 6
        103, // 7
        104, // 8
        105, // 9
        110, // .
        190, // .
        46, // del
        48, // 0
        49, // 1
        50, // 2
        51, // 3
        52, // 4
        53, // 5
        54, // 6
        55, // 7
        56, // 8
        57, // 9
        37, // left
        39 // right
      ]
    }
  },
  methods: {
    blur (e) {
      let val = this.inputNumberValue.toString()
      this.inputNumberValue = Number(val).toString()
    },
    formatDecimal (num, decimal) {
      num = num.toString()
      let index = num.indexOf('.')
      if (index !== -1) {
        num = num.substring(0, decimal + index + 1)
      } else {
        num = num.substring(0)
      }
      return parseFloat(num).toFixed(decimal)
    },
    keyup (e) {
      if (isNaN(this.inputNumberValue)) {
        this.inputNumberValue = ''
      }
      if (this.inputNumberValue === '') {
        return
      }
      console.info('inputNumberValue', this.inputNumberValue)
      // console.info('keyup::e', e)
      let val = this.inputNumberValue.toString()
      if (val.includes('.')) {
        if (val.indexOf('.') === val.length - 1) {
          // 最后一位是点 就不格式化
        } else {
          if (val.indexOf('.') < val.length - 2) { // 小数点后两位
            this.inputNumberValue = this.formatDecimal(Number(val), 2).toString()
          } else {
            const last1 = val.charAt(val.length - 1)
            const last2 = val.charAt(val.length - 2) + last1
            if (last1 === '0' || last2 === '00') {
              // 不格式化
            } else {
              this.inputNumberValue = Number(val).toString()
            }
          }
        }
      } else {
        this.inputNumberValue = Number(val).toString()
      }
    },
    // 最长10位 可以输入小数点后两位
    // 小数点后保留2位小数的正则表达式
    keydown (e) {
      // console.info('e.keyCode', e.keyCode, e.target.value)
      let across = this.keyList.includes(e.keyCode)
      if (!across) { // 只能输入数字点和退格键
        // console.info('1')
        e.preventDefault()
        return
      }
      // 点不能开头
      if (e.keyCode === 110 && this.inputNumberValue === '') {
        // console.info('2')
        e.preventDefault()
        return
      }
      // 有点了就不能再输入点了
      if (this.inputNumberValue.toString().indexOf('.') > -1 && e.keyCode === 110) {
        // console.info('3')
        e.preventDefault()
        return
      }
      if (this.inputNumberValue.length === this.maxlength && ![8, 37, 39].includes(e.keyCode)) {
        // console.info('4')
        e.preventDefault()
      }
      // let reg = /^(([1-9]{1}\d*)|(0{1}))(\.\d{0,2})?$/
      // let expression1 = reg.test(this.inputNumberValue)
      // let expression2 = this.inputNumberValue.length > this.maxlength
      // if (!expression1 || expression2) {
      //   e.preventDefault()
      // } else {
      //   this.$emit('input', this.inputNumberValue)
      // }
    }
  },
  watch: {
    value: function (val) {
      this.inputNumberValue = this.value.toString()
    },
    inputNumberValue: function (val) {
      this.$emit('input', val)
    }
  },
  created () { },
  mounted () {
    // console.info('InputNumberZen::value', this.value)
    this.inputNumberValue = this.value.toString()
  }
}
</script>

<style>
</style>

---------------------------------------------
生活的意义并不是与他人争高下,而在于享受努力实现目标的过程,结果是对自己行动的嘉奖。
↑面的话,越看越不痛快,应该这么说:

生活的意义就是你自己知道你要做什么,明确目标。没有目标,后面都是瞎扯!

新博客 ​​​https://www.VuejsDev.com​​ 用于梳理知识点

 

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
base-table 加入动态slot 流程 vue2 2022-10-15 05:54:56