Vue实现金钱输入框组件自动带千位逗号

news2025/1/11 21:57:46

新建PriceInput.vue

<template>
  <div id="bord">
    <el-input
    v-model="inputValue"
    v-bind="$attrs"
    :maxlength="maxlength"
    @input="handleInput"
    @focus="handleFocus"
    @blur="handleBlur"
    @change="handleChange"
  >
    <template slot="append">
      <slot name="append"></slot>
    </template>
  </el-input>

  </div>

</template>

<script>
import { inputNumber } from '@/utils/inputNumber'
import { formatMoney } from '@/utils/formatMoney'
export default {
  // name:'priceInput',
  props: {
    value: {
      type: [String, Number],
      default: ''
    },
    // 金额位数格式(a-b);a:整数位数;b:小数位数
    format: {
      type: String,
      default: '9-2'
    }
  },
  data () {
    return {
      inputValue: '',
      inputing: false
    }
  },
  computed: {
    integerNum () {
      return Number(this.format.split('-')[0])
    },
    decimalNum () {
      return Number(this.format.split('-')[1])
    },
    maxlength () {
      return this.integerNum + (this.decimalNum > 0 ? this.decimalNum + 1 : this.decimalNum)
    }
  },
  watch: {
    value: {
      immediate: true,
      handler (n) {
        if (!n) {
          this.inputValue = n
          return
        }
        if (this.inputing) {
          this.inputValue = n
        } else {
          this.inputValue = formatMoney(inputNumber(n.toString()), this.format)
        }
      }
    }
  },
  methods: {
    handleInput (val) {
      this.inputing = true
      let money = inputNumber(val)
      const format = this.format
      const intNum = Number(format.split('-')[0])
      const decimalNum = Number(format.split('-')[1])
      const moneyArr = money.split('.')
      moneyArr[0] = moneyArr[0].length > intNum ? moneyArr[0].substr(0, intNum) : moneyArr[0]
      if (moneyArr[1]) {
        moneyArr[1] = moneyArr[1].length > decimalNum ? moneyArr[1].substr(0, decimalNum) : moneyArr[1]
      }
      money = moneyArr.join('.')
      this.inputValue = money
      let value = ''
      if (money === '-' || money === '.') {
        value = ''
      } else if (money !== '') {
        value = Number(inputNumber(money))
      }
      this.$emit('input', value)
    },
    handleChange (val) {
      this.inputing = true
      this.$emit('change', Number(val.replaceAll(',', '')))
    },
    handleBlur (e) {
      this.inputing = false
      this.inputValue = formatMoney(inputNumber(e.target.value), this.format)
      this.$emit('blur', e)
    },
    handleFocus (e) {
      this.inputing = true
      this.inputValue = inputNumber(this.inputValue)
      this.$emit('focus', e)
    }
  }
}
</script>
<style>
#bord>.el-input>input{
  border: 0;
  outline: none;/* 清除边框 */
  text-align: right;
  font-size: 18px;
  background-color:transparent;/* 输入透明背景 */
}
</style>

formatMoney.js格式化金额

/**
 * 格式化金额
 * @param money { String / Number } 金额
 * @param format { String } a-b:限制输入的字符长度,a:整数长度,b:小数长度
 * @returns {string|null}
 */
export const formatMoney = (money, format) => {
  if (typeof money === 'number') {
    money = money.toString()
  }
  if (money === '-' || !money) return money
  if (!format) format = '11-2'
  const intNum = Number(format.split('-')[0])
  const decimalNum = Number(format.split('-')[1])
  const moneyArr = money.split('.')
  moneyArr[0] = moneyArr[0].length > intNum ? moneyArr[0].substr(0, intNum) : moneyArr[0]
  if (moneyArr[1]) {
    moneyArr[1] = moneyArr[1].length > decimalNum ? moneyArr[1].substr(0, decimalNum) : moneyArr[1]
  }
  money = moneyArr.join('.')
  const isNegativeNum = money.startsWith('-')
  const pointPosition = money.indexOf('.')
  const decimal = pointPosition !== -1 ? money.substr(pointPosition) : ''
  const integer = Math.abs(parseInt(money).toString()).toString()
  const integerArrReverse = integer.split('').reverse().join('')
  const moneyStringify = `${isNegativeNum ? '-' : ''}${integerArrReverse.replace(/(\d{3})(?=\d)/g, '$1,').split('').reverse().join('')}${decimal}`
  return moneyStringify
}

inputNumber.js格式化为普通数字格式

// 此方法用来实现将一个字符串通过replace方法,格式化为普通数字格式(包括正负整数、正负浮点数都支持)
export const inputNumber = val => {
  if (val === '-' || !val) return val
  if (val === '.') return ''
  // 下列代码中正则表达式的非捕获组(?<=)在IE浏览器中不支持,所以弃用
  // const reg1 = /[^\d|^\-|\^.]/g // 匹配所有非数字,非-,非.的字符
  // const reg2 = /(?<=[\.|\-])[^\d]/g // 匹配所有.和-字符后的非数字字符
  // const reg3 = /(?<=\.\d*)\./g // 匹配小数后的.
  // const reg4 = /(?<=\d)\-/g // 匹配-后面的非数字
  // return val.replace(reg1, '').replace(reg2, '').replace(reg3, '').replace(reg4, '')

  const reg1 = /[^\d|\-|\.]/g
  const reg2 = /(\d|\.)\-+/g
  const str = val.replace(reg1, '').replace(reg2, '$1')
  const pointArr = str.split('.')
  let value = ''
  if (pointArr.length > 1) {
    pointArr.forEach((item, index) => {
      value = value + item
      if (!index) {
        value = value + '.'
      }
    })
  } else {
    value = str
  }
  return value
}

使用案例

  <PriceInput
         v-model="yourModel"
         :format="yourFormat"
         @input="yourInputHandler"
         @change="yourChangeHandler"
         @blur="yourBlurHandler"
         @focus="yourFocusHandler"
       />
 export default {
     data() {
       return {
         yourModel: '', // 初始化你的模型值
         yourFormat: '11-2' // 初始化你的格式
       };
     },
     methods: {
       yourInputHandler(value) {
         console.log('Input:', value);
       },
       yourChangeHandler(newValue) {
         console.log('Changed:', newValue);
       },
       yourBlurHandler(event) {
         console.log('Blurred:', event);
       },
       yourFocusHandler(event) {
         console.log('Focused:', event);
       }
     }
   }

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Springboot煤炉网站代切系统-计算机毕业设计源码06656

目 录 摘要 1 绪论 1.1 课题目的与意义 1.2国内外研究现状 1.3论文结构与章节安排 1.4 Springboot框架介绍 2 Springboot煤炉网站代切系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性…

9.计算机视觉—目标检测

目录 1.物体检测边缘框目标检测数据集总结边缘框代码实现2.锚框:目标检测的一种方法IoU—交并比赋予锚框标号使用非极大值抑制(NMS)输出总结代码实现1.物体检测 边缘框 一个边缘框可以通过四个数字定义 (左上x,左上y),(右下x,右下y)(左上x,左上y,宽,高)(中间x,中间y…

Llama-2 vs. Llama-3:利用微型基准测试(井字游戏)评估大模型

编者按&#xff1a; 如何更好地评估和比较不同版本的大语言模型&#xff1f;传统的学术基准测试固然重要&#xff0c;但往往难以全面反映模型在实际应用场景中的表现。在此背景下&#xff0c;本文作者别出心裁&#xff0c;通过让 Llama-2 和 Llama-3 模型进行井字游戏对决&…

轻松搞定!4个微信图片恢复方法大揭秘

在日常使用微信的过程中&#xff0c;我们经常会通过微信发送和接收大量图片&#xff0c;这些图片记录了许多重要的瞬间和信息。然而&#xff0c;误操作、手机故障或软件更新等原因可能导致我们不小心删除了这些宝贵的图片。 当这些重要的图片消失时&#xff0c;往往会让我们感…

提升学生职务执行力的智慧校园学工管理策略

智慧校园的学工管理系统匠心独运地融入了“学生职务”这一创新模块&#xff0c;它紧密贴合学生的实际需求&#xff0c;致力于在校期间的实践经验积累和个人能力的全面提升。这个模块化身为一个便捷的综合平台&#xff0c;让学生们能够轻松发掘并参与到丰富多彩的校内职务中去&a…

2. jenkins发布java项目

jenkins发布java项目 一、环境描述二、部署tomcat业务服务器三、部署git服务器&#xff0c;上传测试代码1、部署git服务器2、上传测试代码 四、jenkins对接组件1、安装必要的插件2、对接git客户端3、对接maven工具4、配置maven需要的jdk5、配置gitlab服务器的连接6、在jenkins上…

VBA 操作注册表

1. SaveSetting 1-1. 语法 SaveSetting(AppName As String, Section As String, Key As String, Setting As String) 1-2. 函数说明 在Windows注册表中创建或保存一个应用程序项。将值写入注册表中的HKEY_CURRENT_USER\Software\VBand VBA Program Settings键的子键 1-3. 参…

#BI建模与数仓建模有什么区别?指标体系由谁来搭建?

问题1&#xff1a; 指标体系是我们数仓来搭建还是分析师来做&#xff0c;如何去推动&#xff1f; 问题2&#xff1a;BI建模与数仓建模有什么区别&#xff1f; 指标体系要想做好&#xff0c;其实是分两块内容的&#xff0c;一块是顶层设计阶段&#xff0c;业务指标体系的搭建&am…

github 设置中文,亲测有效

点进去 安装 选上面第二个&#xff0c;不行再选第一个 GitHub - maboloshi/github-chinese: GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese)

如何注册一个自己的公众号?详细指南

博主介绍&#xff1a;全网粉丝10w、CSDN合伙人、华为云特邀云享专家&#xff0c;阿里云专家博主、星级博主&#xff0c;51cto明日之星&#xff0c;热爱技术和分享、专注于Java技术领域 &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅…

程序员鱼皮的保姆级写简历指南第三弹,简历常见问题和建议汇总

大家好&#xff0c;我是程序员鱼皮。做知识分享这些年来&#xff0c;我看过太多简历、也帮忙修改过很多的简历&#xff0c;发现很多同学是完全不会写简历的、会犯很多常见的问题&#xff0c;不能把自己的优势充分展示出来&#xff0c;导致错失了很多面试机会&#xff0c;实在是…

香橙派AIpro测评:快速部署SLAM算法,性能与体验的完美融合

一、引言 最近收到了一块”香橙派AIpro“的开发板&#xff0c;这款开发板是香橙派联合华为精心打造的&#xff0c;他们的宣传sologen是&#xff1a;“为AI而生”。这引起了我的好奇心&#xff0c;想知道其是否可以胜任无人机的实时建图和航迹规划工作。通过实操博主成功实现了…

SprongBoot3整合Knife4j实现在线接口文档

大家好&#xff0c;我是晓凡。 写在前面 在上一篇文章&#xff0c;我们详细介绍了SpringBoot3 怎么整合SpringDoc实现在线接口文档。但是&#xff0c;有不少小伙伴 都觉得接口界面太丑了。有没有什么更美观一点的UI界面呢&#xff1f; 当然是有的了&#xff0c;毕竟这是一个…

MySQL 进阶(一)【存储引擎】

1、存储引擎 1.1、MySQL 体系结构 自上而下可以分为 连接层 接受客户端的连接&#xff0c;完成连接的处理、认证授权、安全方案和最大连接数等服务层 绝大部分的核心功能都是在服务层完成的&#xff0c;比如SQL 接口&#xff08;DDL、DML、视图、触发器、存储过程&#xff09…

【IDEA】什么maven,如何进行文件导入,并打包

maven介绍 maven是一个Java世界中&#xff0c;构建工具。 核心功能&#xff1a; 1&#xff0c;管理依赖&#xff1a; 管理文件运行的顺序逻辑依赖关系。对配置文件&#xff0c;进行构建和编译。其也是在调用jdk&#xff0c;来进行编译打包工作。 2&#xff0c;打包 通过使用…

【Python基础篇】你知道python的数据类型都有哪些吗?

文章目录 0. 前言1. 基本数据类型1.1 数值类型&#xff08;int、float&#xff09;1.1.1 整型&#xff08;int&#xff09;1.1.2 浮点型&#xff08;float&#xff09; 1.2 布尔类型&#xff08;bool&#xff09;1.3 字符串&#xff08;str&#xff09;1.4 字节串&#xff08;b…

后端之路——文件本地上传

一、基础原理 文件上传是一个很基础的知识点&#xff0c;尤其是本地上传&#xff0c;在现实开发基本都是云上传&#xff0c;但是作为一个基础要简单了解一下 首先前端我就不多讲解了&#xff0c;网页开发里用<form>表单可以上传文件&#xff0c;只需要加上这三属性&…

Yolov8模型调参大全:超详细解读每一个参数

目录 1. 代码获取方式 2. YOLOv8网络配置 3. Yolov8使用 3.1. CLI 3.2. Python 4.default.yaml文件解读 1. 代码获取方式 Yolov8项目地址&#xff1a;https://github.com/ultralytics/ultralytics 这里就不详细介绍v8了 2. YOLOv8网络配置 # Ultralytics YOLO &…

超详细的 C++中的封装继承和多态的知识总结<1.封装与继承>

引言 小伙伴们都知道C面向对象难&#xff0c;可是大家都知道&#xff0c;这个才是C和C的真正区别的地方&#xff0c;也是C深受所有大厂喜爱的原因&#xff0c;它的原理更接近底层&#xff0c;它的逻辑更好&#xff0c;但是学习难度高&#xff0c;大家一定要坚持下来呀&#xff…

上海路演服务app开发的意义与主要功能

随着经济水平与互联网技术的飞速发展&#xff0c; 金融活动也逐渐深入人们的日常生活&#xff0c;各类公司也试图通过互联网获得金融机会&#xff0c;探寻新的发展。为了让企业具有更快捷&#xff0c;更便利的宣传途径与方法&#xff0c;上海路演服务app应运而生。 一&#xf…