vant金额输入框

news2024/11/26 0:36:39

1.在components中新建文件夹currency,新建index.js

import Currency from './src/currency.vue'
 
Currency.install = function (Vue) {
  Vue.component(Currency.name, Currency)
}
 
export default Currency

2.在currency中新建文件夹src,在src中间currency.vue。写入核心代码

<template>
  <van-field v-model="liveValue" :name="name" :placeholder="placeholder" :disabled="disabled" :readonly="readonly" @focus="handleFocus" @blur="handleBlur" @change.native="handleChange" v-bind="$attrs" @keydown.native="handleKeydown"></van-field>
</template>
 
<script>
import { formatter, unFormatter, numberKeyCodes, decimalKeyCodes, plusKeyCodes, minusKeyCodes, operKeyCodes } from '../../currentcy.js'
export default {
  name: 'Sjjcurrency',
  props: {
    name: 'String',
    value: {
      type: [String, Number],
      default: ''
    },
    format: {
      type: String,
      default: '16|2'
    },
    placeholder: String,
    separator: {
      type: String,
      default: ','
    },
    decimalSymbol: {
      type: String,
      default: '.'
    },
    disabled: {
      type: Boolean,
      default: false
    },
    readonly: {
      type: Boolean,
      default: false
    },
    rounding: {
      type: Boolean,
      default: false
    },
    appendKeyCodes: Array,
    preFormatter: Function
  },
  components: {
    UnInput
  },
  data () {
    return {
      hiddenValue: '', // 合法金额值
      liveValue: '' // 展示值
    }
  },
  created () {
    let userFormatVal = this.value + ''
    if (this.preFormatter) {
      userFormatVal = this.preFormatter(userFormatVal)
    }
    this.liveValue = formatter(userFormatVal + '', this.separator, this.decimalSymbol, this.format, this.integerFormat, this.rounding)
    this.hiddenValue = unFormatter(this.liveValue, this.separator)
  },
  watch: {
    value (val, oldVal) {
      let userFormatVal = this.value + ''
      if (this.preFormatter) {
        userFormatVal = this.preFormatter(userFormatVal)
      }
      this.liveValue = formatter(userFormatVal + '', this.separator, this.decimalSymbol, this.format, this.integerFormat)
      this.hiddenValue = unFormatter(this.liveValue, this.separator)
    }
  },
  methods: {
    focus () {
      let inputInner = this.$el.querySelector('.van-field_control')
      inputInner.focus()
    },
    blur () {
      let inputInner = this.$el.querySelector('.van-field_control')
      inputInner.blur()
    },
    select () {
      let inputInner = this.$el.querySelector('.van-field_control')
      inputInner.select()
    },
    handleFocus (event) {
      this.liveValue = this.hiddenValue
      this.$emit('focus', event)
    },
    handleBlur (event) {
      let userFormatVal = this.liveValue
      if (this.preFormatter) {
        userFormatVal = this.preFormatter(userFormatVal)
      }
      this.liveValue = formatter(userFormatVal + '', this.separator, this.decimalSymbol, this.format, this.integerFormat, this.rounding)
      this.hiddenValue = unFormatter(this.liveValue, this.separator)
      this.$emit('input', this.hiddenValue)
      this.$nextTick(() => {
        this.$emit('blur', event)
      })
    },
    handleChange (val) {
      if (/[\u4e00-\u9fa5]/g.test(val)) { // 非IE,忽略可输入的中文
        val = this.hiddenValue
      }
      let userFormatVal = val
      if (this.preFormatter) {
        userFormatVal = this.preFormatter(val)
      }
      this.liveValue = formatter(userFormatVal + '', this.separator, this.decimalSymbol, this.format, this.integerFormat, this.rounding)
      this.hiddenValue = unFormatter(this.liveValue, this.separator)
      this.$emit('input', this.hiddenValue)
      this.$nextTick(() => {
        this.$emit('change', this.hiddenValue)
      })
    },
    handleKeydown (event) {
      if (this.readonly || this.disabled) {
        return
      }
      let keyCode = event.keyCode
      if (event.shiftKey) {
        keyCode = -9 + '' + keyCode
      }
      if (event.ctrlKey) {
        keyCode = -7 + '' + keyCode
      }
      // 获取光标位置
      let cursurPosition = 0
      let inputInner = this.$el.querySelector('.van-field_control')
      if (inputInner) {
        if (inputInner.selectionStart !== null && inputInner.selectionStart !== undefined) {
          // 非IE、IE11
          cursurPosition = inputInner.selectionStart
        } else {
          // IE10-
          let range = document.selection.createRange()
          range.moveStart('character', -inputInner.val().length)
          cursurPosition = range.text.length
        }
      } else {
        cursurPosition = -1
      }
      keyCode = parseInt(keyCode)
      let allowKeyCodes = [
        ...numberKeyCodes,
        ...decimalKeyCodes,
        ...operKeyCodes,
        ...plusKeyCodes,
        ...minusKeyCodes
      ]
      if (this.appendKeyCodes && this.appendKeyCodes.length) {
        allowKeyCodes = allowKeyCodes.concat(this.appendKeyCodes)
      }
      // let signalKeyCodes = plusKeyCodes.concat(minusKeyCodes)
      if (allowKeyCodes.indexOf(keyCode) < 0 || (this.liveValue.indexOf('.') >= 0 && decimalKeyCodes.indexOf(keyCode) >= 0) || ((this.liveValue.indexOf('+') >= 0 || this.liveValue.indexOf('-') >= 0) && minusKeyCodes.indexOf(keyCode) >= 0) || ((this.liveValue.indexOf('+') >= 0 || this.liveValue.indexOf('-') >= 0) && plusKeyCodes.indexOf(keyCode) >= 0) || (cursurPosition > 0 && plusKeyCodes.concat(minusKeyCodes).indexOf(keyCode) >= 0)) {
        event.preventDefault()
      } else {
        if (cursurPosition === 0 && (plusKeyCodes.indexOf(keyCode) >= 0 || minusKeyCodes.indexOf(keyCode) >= 0)) {
          // if ((this.liveValue.indexOf('-') < 0 && minusKeyCodes.indexOf(keyCode) >= 0) || (this.liveValue.indexOf('+') < 0 && plusKeyCodes.indexOf(keyCode) >= 0)) { // 可输入+
        if ((this.liveValue.indexOf('-') < 0 && minusKeyCodes.indexOf(keyCode) >= 0)) {
            // 不可输入+
          } else {
            event.preventDefault()
          }
        }
      }
    }
  }
}
</script>

3.currentcy.js

import { BigDecimal, RoundingMode } from 'bigdecimal'
export const numberKeyCodes = [44, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105] // 允许的数字键的keyCode
export const decimalKeyCodes = [190, 110] // 小数键的keyCode
export const plusKeyCodes = [107, -9187] // 正号的keyCode 【小键盘+, 187=(配合shift使用)】
export const minusKeyCodes = [109, 189] // 负号的keyCode
export const operKeyCodes = [9, 46, 8, 37, 39, 35, 36, -767, -786] // 操作特殊字符的KeyCode
 
function __getIntDigitLength__ (intDigitStr) {
  let len = {}
  let intLength = ''
  let decimalLength = ''
  intDigitStr = intDigitStr.trim()
  if (intDigitStr && intDigitStr !== '|' && /^(\d*)\|(\d*)$/g.test(intDigitStr)) {
    intLength = RegExp.$1
    decimalLength = RegExp.$2
    len.intLength = intLength
    len.decimalLength = decimalLength
    return len
  } else {
    return false
  }
}
 
function __getStringRegExp__ (str) {
  try {
    if (str && /[\][{}()*+?.\\^$|]/g.test(str)) {
      if (str !== '\\') return '\\' + str
      else return '\\'
    } else return str || ''
  } catch (e) {
    throw new Error('__getStringRegExp__:' + e.message)
  }
}
 
function __removeSeparator__ (value, separator) {
  try {
    // var _me = this
    var separatorRegExp = __getStringRegExp__(separator) || ''
    if (separatorRegExp) {
      var dh = new RegExp(separatorRegExp, 'img')
      if (value && dh.test(value)) {
        return value.replace(dh, '')
      }
    }
    return value || ''
  } catch (e) {
    throw new Error('__removeSeparator__:' + e.message)
  }
}
 
export function formatter (value, separator, decimalSymbol, intDigitStr, isIntegerOnly, rounding) {
  try {
    // let valueValid = false
    var _currencyValue = {
      intLength: '16',
      decimalLength: '2',
      NegativeValue: '',
      intValue: '',
      decimalValue: '',
      formatValue: ''
    }
    value = value + ''
    if (!value || value === '-' || value === '+') {
      return ''
    }
    // var _me = this,
    var separatorRegExp, _value, __decimalLen, __intLen // 整数部分
    var lenObj = __getIntDigitLength__(intDigitStr)
    if (lenObj) {
      _currencyValue.intLength = lenObj.intLength
      _currencyValue.decimalLength = lenObj.decimalLength
    }
    __intLen = parseInt(_currencyValue.intLength, 10)
    __decimalLen = rounding ? parseInt(_currencyValue.decimalLength, 10) + 1 : parseInt(_currencyValue.decimalLength, 10)
 
    // var isNegative = false // 是否负数
    var valArr = /^-([^-]+)$/.exec(value)
    if (valArr) {
      // isNegative = true // 表示是负数
      _currencyValue.NegativeValue = '-'
      value = valArr[1]
    }
 
    if (separator === '') {
      return ''
    }
 
    _value = value // 整数部分
    _currencyValue.decimalValue = '' // 小数部分
    if (value.indexOf('.') > -1) { // 若含有小数点,则处理得到整数部分和小数部分
      _currencyValue.decimalValue = value.substring(value.indexOf('.') + 1)
      _value = value.substring(0, value.indexOf('.'))
    }
    // 若未输入整数部分,则自动取成0----------------------------------------------------
    _value = _value === '' ? '0' : _value
    // _value === '' ? _value = '0' : _value = _value
 
    if (separator !== '') {
      separatorRegExp = __getStringRegExp__(separator)
      _value = __removeSeparator__(_value, separator) // 去分隔符
    }
    if (isNaN(_value) || isNaN(_currencyValue.decimalValue) || isNaN(value)) { // 若不是数字则报错,isNaN('')=false
      return ''
    }
    // modify begin
    if (isIntegerOnly && value.indexOf('.') < 0) { // 纯整数格式化且不含.时,对纯整数进行格式化
      if (_currencyValue.decimalLength !== '') {
        if (_value.length > __decimalLen) {
          _currencyValue.decimalValue = _value.substring(_value.length - __decimalLen)
          _value = _value.substring(0, _value.length - __decimalLen)
        } else {
          var _s = _value
          for (var i = 0; i < (__decimalLen - _value.length); i++) {
            _s = '0' + _s
          }
          _currencyValue.decimalValue = _s
          _value = '0'
        }
      } else {
        _currencyValue.decimalValue = ''
      }
    } else {
      if (_currencyValue.decimalLength !== '') {
        if (_currencyValue.decimalValue.length < __decimalLen) {
          var _d = _currencyValue.decimalValue
          for (var j = 0; j < (__decimalLen - _currencyValue.decimalValue.length); j++) {
            _d += '0'
          }
          _currencyValue.decimalValue = _d
        } else {
          if (_currencyValue.decimalValue.length > __decimalLen) {
            // valueValid = false
          }
          _currencyValue.decimalValue = _currencyValue.decimalValue.substring(0, __decimalLen)
        }
      }
    }
    // modify end
 
    var _intVal = _value
    if (_currencyValue.intLength !== '') { // 若存在整数位的限制
      if (_currencyValue.intLength < _intVal.length) {
        // valueValid = false
      }
      _intVal = _intVal.substring(0, __intLen)
    }
    _currencyValue.intValue = _value = _intVal
    // 整数处理完毕 end
    var _digitpoint = (_currencyValue.decimalValue ? decimalSymbol : '')
    let zeroFilter = (_currencyValue.intValue + '').split('').filter(x => {
      return x !== '0'
    })
    if (zeroFilter.length === 0) { // 输入所有位数都是0的情况,设置后直接返回
      _currencyValue.intValue = '0'
      let zeroFilterDec = (_currencyValue.decimalValue + '').split('').filter(x => {
        return x !== '0'
      })
      // 去掉输入全部为0时的负号
      if (zeroFilterDec.length === 0) {
        _currencyValue.NegativeValue = ''
      }
 
      _currencyValue.formatValue = _currencyValue.NegativeValue + '0' + (_currencyValue.decimalValue !== '' ? (_digitpoint + _currencyValue.decimalValue) : '')
      if (rounding) {
        _currencyValue.formatValue = new BigDecimal(_currencyValue.formatValue).setScale(__decimalLen - 1, RoundingMode.HALF_UP()).toString()
      }
      return _currencyValue.formatValue
    }
    // 处理整数的前缀0
    if (/^0+/g.test(_currencyValue.intValue) && !(/^(0+)$/g.test(_currencyValue.intValue)) && !(/^0$/g.test(_currencyValue.intValue))) {
      _currencyValue.intValue = _currencyValue.intValue.replace(/^0+/, '')
      _value = _intVal = _currencyValue.intValue
    }
 
    if (rounding) {
      let rVal = _value + _digitpoint + _currencyValue.decimalValue
      let roundingVal = new BigDecimal(rVal).setScale(__decimalLen - 1, RoundingMode.HALF_UP()).toString()
      _value = roundingVal.substring(0, roundingVal.indexOf(_digitpoint))
      _currencyValue.decimalValue = roundingVal.substring(roundingVal.indexOf(_digitpoint) + 1)
    }
 
    // 整数部分的分隔符处理开始
    if (separator !== '') {
      _value = _value + separator
      var re = new RegExp('(\\d)(\\d{3}' + separatorRegExp + ')') // 以3个字符串为一组
      while (re.test(_value)) {
        _value = _value.replace(re, '$1' + separator + '$2')
      }
      _value = _value.replace(new RegExp(separatorRegExp + '$'), '') // 去掉末尾的分隔符
    }
    _currencyValue.formatValue = _currencyValue.NegativeValue + _value + (_currencyValue.decimalValue !== '' ? (_digitpoint + _currencyValue.decimalValue) : '')
    if (+_currencyValue.formatValue < 0) {
      // 去除-号
      return _currencyValue.formatValue.substr(1)
    } else {
      return _currencyValue.formatValue
    }
    // return _currencyValue.formatValue
  } catch (e) {
    throw new Error('formatter', e.message)
  }
}
export function unFormatter (value, separator) {
  return (value + '').replace(new RegExp(separator, 'ig'), '')
}

4.然后就是最愉快的代码引入了(代表10位整数6位小数)

<currency v-model="money" :format="10|6" placeholder="请输入内容" />

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/876232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pyinstaller打包exe(包括其他资源数据)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、说明二、打包步骤三、其他 前言 记录&#xff1a;简单记录使用Pyinstaller将py和资源文件打包为exe的过程 一、说明 环境&#xff1a;anconda版本python …

SAP 选择屏幕组件名描述翻译时字符长度不够问题处理

问题&#xff1a;有时候我们在开发report程序的时候&#xff0c;要求程序显示支持中英文&#xff0c;如果程序是在中文环境下开发的时候&#xff0c;需要进行翻译处理&#xff0c;但是我们发现选择屏幕上的组件的描述支持的默认长度是30位&#xff0c;如果超过该如何处理呢 解…

【数据结构】二叉树篇|『构造二叉树』刷题

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 所谓自由&#xff0c;不是随心所欲&#xff0c;而是自我主宰。——康德 目录 一、前言二、刷题1、最大二叉树2、从前序与中序遍历序列构造二…

压测秒杀场景常见问题

很多人在做秒杀场景的压测时&#xff0c;经常出现以下两个问题&#xff1a; 1&#xff0c;用自己的笔记本电脑瞬间发起1000个请求 2&#xff0c;没有使用虚拟ip&#xff08;发起的请求都是同样的一个ip&#xff09; 其实现在很多人在做秒杀压测的时候&#xff0c;都会遇到这两…

学会智慧工地有多爽?能省时间又高效?

当今社会&#xff0c;科技的迅速发展正在深刻地改变着各行各业&#xff0c;建筑领域也不例外。在这一背景下&#xff0c;"智慧工地"这一概念应运而生&#xff0c;它代表了将创新技术和数字化解决方案引入建筑工地&#xff0c;以提升效率、安全性和可持续性的愿景。 智…

视频高效剪辑,轻松平均分割视频,生成高质量M3U8

您是否在处理视频剪辑时常常面临繁琐的切分工作&#xff1f;是否希望能够快速而精准地平均分割视频&#xff0c;并生成适用于在线播放的高质量m3u8文件&#xff1f;现在&#xff0c;我们的智能视频剪辑大师为您提供了一种简便而高效的解决方案&#xff01;无需复杂操作&#xf…

分布式系统监控zabbix安装部署以及使用

文章目录 分布式系统监控zabbix安装部署及使用一.zabbix监控1.什么是zabbix2.zabbix功能3.zabbix的构成4.zabbix的3种架构4.1 C/S架构4.2 分布式架构&#xff1a;zabbix-proxy-client架构4.3 master-node-client架构 5.zabbix工作原理及数据流向6.zabbix监控模式 二.zabbix部署…

DVI端口静电防护,如何设计保护电路图?

Digital Visual Interface&#xff0c;简称DVI&#xff0c;中文名&#xff1a;数字视频接口&#xff0c;是一种视频接口标准&#xff0c;用来传输未经压缩的数字化视频&#xff0c;广泛应用于LCD、数字投影机等显示设备上。DVI端口的种类非常多&#xff0c;有DVI-A、DVI-D、DVI…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(8 月 8 日论文合集)

文章目录 一、检测相关(13篇)1.1 FSD V2: Improving Fully Sparse 3D Object Detection with Virtual Voxels1.2 Dimensionality Reduction for Improving Out-of-Distribution Detection in Medical Image Segmentation1.3 FeatEnHancer: Enhancing Hierarchical Features for…

如何构建一个 NodeJS 影院微服务并使用 Docker 部署

文章目录 前言什么是微服务&#xff1f;构建电影目录微服务构建微服务从 NodeJS 连接到 MongoDB 数据库总结 前言 如何构建一个 NodeJS 影院微服务并使用 Docker 部署。在这个系列中&#xff0c;将构建一个 NodeJS 微服务&#xff0c;并使用 Docker Swarm 集群进行部署。 以下…

华为开源自研AI框架昇思MindSpore应用案例:基于MindSpore框架的UNet-2D案例实现

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 二、环境准备与数据读取三、模型解析Transformer基本原理Attention模块 Transformer EncoderViT模型的输入整体构建ViT 四、模型训练与推理模型训练模型验证模型推理 近些年&#xff0c;随着基于自注意&…

【CTF-MISC】1和0的故事(二维码定位点补全)

题目链接&#xff1a;https://ctf.bugku.com/challenges/detail/id/216.html 文件中得到一个01方阵&#xff0c;可以在010 Editor中高亮设置将1涂为黑色、0涂为白色&#xff0c;如下图所示。 截图以后调整大小再加入三个定位点即可得到二维码。 扫描即可得到答案。 要注意的是…

基于TICK的DevOps监控实战(Ubuntu20.04系统,Telegraf+InfluDB+Chronograf+Kapacitor)

1、TICK简介 TICK是InfluxData开发的开源高性能时序中台&#xff0c;集成了采集、存储、分析、可视化等能力&#xff0c;由Telegraf, InfluDB, Chronograf, Kapacitor等4个组件以一种灵活松散、但又紧密配合&#xff0c;互为补充的方式构成。TICK专注于DevOps监控、IoT监控、实…

vscode的配置和使用

1.侧边栏调整大小 放大&#xff1a;View -> Appearance -> Zoom in&#xff08;快捷键Ctrl &#xff09; 缩小&#xff1a;View -> Appearance -> Zoom out&#xff08;快捷键Ctrl -&#xff09; 侧边栏字体调整到合适大小后&#xff0c;可以按下一步调整代码区…

【软件测试】我的2023面试经验谈

最近行业里有个苦涩的笑话&#xff1a;公司扛过了之前的三年&#xff0c;没扛过摘下最近的一年&#xff0c;真是让人想笑又笑不出来。年前听说政策的变化&#xff0c;大家都满怀希望觉得年后行情一片大好&#xff0c;工作岗位激增&#xff0c;至少能有更多的机会拥抱未来。然而…

网页显示摄像头数据的方法---基于web video server

1. 背景&#xff1a; 在ros系统中有发布摄像头的相关驱动rgb数据&#xff0c;需求端需要将rgb数据可以直接在网页上去显示。 问题解决&#xff1a; web_video_server功能包&#xff0c;相关链接&#xff1a; web_video_server - ROS Wiki 2. 下载&#xff0c;安装和编译&a…

scope穿透(二)

上篇文章已经讲了,如何穿透样式,今天我们进入element-ui官网进行大规模的穿透处理。 1.输入框 <template><div class""><el-input v-model"input" placeholder"请输入内容"></el-input></div> </template>…

shiro框架基本概念介绍

目录 什么是Shiro: Shiro的核心功能包括&#xff1a; Shiro主要组件及相互作用&#xff1a; Shiro 认证过程&#xff1a; Shiro 授权过程&#xff1a; 资料获取方法 什么是Shiro: Shiro 是一个强大灵活的开源安全框架&#xff0c;可以完全处理身份验证、授权、加密和会话…

亚马逊悄悄创建广告产品团队,并将自己定位为广告领域的有力竞争者。

据外媒报道&#xff0c;为了加速广告收入的增长&#xff0c;亚马逊正在采取战略举措&#xff0c;建立一个专门面向发布商的广告产品团队。这家零售巨头正在为其新成立的“PubTech”团队&#xff08;亚马逊广告的一个部门&#xff09;招募人才。目前&#xff0c;亚马逊“PubTech…

对于d3dcompiler_47.dll丢失问题,几种详细解决方法

d3dcompiler_47.dll是Direct3D编译器的动态链接库文件&#xff0c;它是DirectX的一部分。DirectX是由微软开发的一组应用程序接口&#xff08;API&#xff09;&#xff0c;用于在Windows操作系统上实现多媒体和游戏的高性能图形和声音效果。d3dcompiler_47.dll的作用是编译Dire…