vue 金额组件,输入提示单位:‘千’、‘万’、‘十万’...并用‘,’三个格式化

近期项目中遇到一个需求,金额输入框,输入过程中自动提示‘千’、‘万’、‘十万’、‘百万’......等单位提示,鼠标失去焦点后,并用‘,’三位隔开计数。

例如:

输入:12345.99

失去焦点:12,345.99

放一张图展示下效果吧

直接贴代码吧

封装的组件inputCurrency.vue

<template>
  <el-tooltip :manual="manual" popper-class="elInputCurrency" v-model="tooltipModel"
              class="elInputCurrency" effect="light" :content="numberDigit" placement="top-start">
    <el-input
        v-if="!readonly || readOnlyBorder"
        placeholder="请输入"
        :disabled="disabled"
        :readonly="readonly"
        v-show="show"
        @blur="blur"
        @focus="focus"
        @input="inputCurrency"
        :value="innerVal"
    >
    </el-input>
    <span v-else>{{
        innerVal
      }} 元</span>
  </el-tooltip>
</template>
<script>
export default {
  name: 'InputCurrency',
  props: {
    value: {
      type: [Number, String],
    },
    disabled: {
      type: Boolean,
      default: false,
    },
    readonly: {
      type: Boolean,
      default: false,
    },
    show: {
      type: Boolean,
      default: true
    },
    readOnlyBorder: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      manual: true,
      tooltipModel: false,
      numberDigit: '',
      innerVal: ''
    }
  },
  computed: {},
  watch: {
    value(n) {
      if (this.readonly) {
        this.inputCurrency(this.value);
      }
    }
  },
  mounted() {
    this.innerVal = this.formatterNumber(this.value);
    if (this.readonly) {
      this.inputCurrency(this.innerVal);
    }
  },
  methods: {
    inputCurrency(value) {
      const self = this;
      value = value.toString();
      value = value.replace(/[^0-9.]/g, '');
      value = value.replace(/^(\-)*(\d+)\.(\d{2}).*$/, '$1$2.$3');
      const data = parseInt(value).toString();
      const moneyText = ['千', '万', '十万', '百万', '千万', '亿', '十亿', '百亿', '千亿', '万亿'];
      const maxValue = 14;
      if (data.length > 3 && data.length < maxValue) {
        self.tooltipModel = this.readonly ? false : true;
        self.manual = false;
        self.numberDigit = moneyText[data.length - 4];
      } else if (data.length > maxValue - 1) {
        value = self.value;
        self.numberDigit = moneyText[moneyText.length - 1];
      } else {
        self.manual = true;
        self.tooltipModel = false;
        self.numberDigit = '';
      }
      let val = (value && value.split("")) || [];
      this.innerVal = val.join("").match(/^\d*(\.?\d{0,2})/g)[0] || '';
      // this.innerVal = this.formatterNumber(this.innerVal);
      if (!this.readonly) {
        self.$emit('change', this.innerVal);
      }
    },
    inputChange(value) {
      let inputValue = this.value;
      inputValue = Number(value).toFixed(2).toString();
      this.innerVal = this.formatterNumber(inputValue);
      this.$emit('change', inputValue);
    },
    blur() {
      this.inputChange(this.value.toString());
      this.$emit('blur');
    },
    focus() {
      this.innerVal = this.formatterNumber(this.value);
      if (typeof (this.innerVal) === 'number') {
        this.innerVal = this.innerVal.toString();
      }
      this.$emit('change', this.value);
      this.$emit('focus');
    },
    formatterNumber(cellValue) {
      const val = parseFloat(cellValue)
          .toFixed(2)
          .toString()
          .split('')
          .reverse()
          .join('')
          .replace(/(\d{3})/g, '$1,')
          .replace(/\,$/, '')
          .split('')
          .reverse()
          .join('');
      return val;
    }
  },
}
</script>
<style scoped>
.el-input.el-input-group {
  display: inline-table !important;
}

.el-input.el-input-group /deep/ .el-input-group__append {
  background-color: transparent;
  color: #303133;
}

.el-input /deep/ .el-input__inner {
  border: 1px solid #dcdfe6 !important;
}

.el-input:before {
  content: '元';
  position: absolute;
  right: 8px;
  top: 50%;
  transform: translateY(-50%);
  color: #303133;
}

.el-input /deep/ input {
  padding-right: 0px;
}

.el-input /deep/ .el-input__suffix {
  margin: 1px 17px auto 0;
}

.el-input /deep/ .el-input__icon {
  line-height: 29px;
}

span.elInputCurrency {
  line-height: 30px;
  color: #112B50;
  font-size: 14px;
  font-family: 微软雅黑;
}
</style>
<style>
.elInputCurrency.el-tooltip__popper.is-light {
  background-color: #fff;
  color: #505960;
  border: 1px solid #d5d9dc;
  box-shadow: 0 0 8px 0 #000000;
  width: 40px;
  height: 32px;
  text-align: center;
  line-height: 32px;
  padding: 0px;
}

.elInputCurrency.el-tooltip__popper.is-light .popper__arrow {
  left: 39% !important;
  margin-left: -6px;
  border-top-color: #D5D9DC !important;
}

.elInputCurrency.el-tooltip__popper.is-light .popper__arrow::after {
  border-top-color: #fff;
}
</style>

组件使用

<template>
  <div style="width: 300px">
    <span>金额:</span>
    <input-currency style="display: inline-block;width: 200px;" class="detail-value-width" :value="value"
                    :disabled="disabledFlag"
                    @change="onchange" :readonly="readFlag" :show="showFlag"></input-currency>
  </div>
</template>

<script>
import inputCurrency from "@/components/inputCurrency";

export default {
  name: "demoForCurrency",
  components: {
    inputCurrency
  },
  data() {
    return {
      value: '12345.99',
      disabledFlag: false,
      readFlag: false,
      showFlag: true
    }
  },
  methods: {
    onchange(value) {
      this.value = value;
    }
  }
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue--》从零开始打造交互体验一流的电商平台(一)

今天开始使用 vue3 ts 搭建一个电商项目平台&#xff0c;因为文章会将项目的每处代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的github上&#xff0c;大家可以自行去进行下载运行&#xff0c;希…

【Node.js工程师养成计划】之express中间件与接口规范

一、Express中间件的概念与基本应用 const express require(express)// 加一个注释&#xff0c;用以说明&#xff0c;本项目代码可以任意定制更改 const app express()const PORT process.env.PORT || 3000// // 挂载路由 // app.use(/api, router)// // 挂载统一处理服务端…

【倪亲斫经典水墨云纹仲尼式】倪诗韵亲斫古琴

【倪亲斫经典水墨云纹仲尼式】倪诗韵亲斫古琴 松透润&#xff0c;适合大曲文曲潇湘欸乃平沙&#xff0c;余韵悠长&#xff0c;手感极其舒适&#xff0c;久弹不疲。

[Linux][网络][TCP][三][超时重传][快速重传][SACK][D-SACK][滑动窗口]详细讲解

目录 1.超时重传1.什么是超时重传&#xff1f;2.超时时间是如何确定的&#xff1f; 2.快速重传3.SACK4.D-SACK1.ACK丢失2.网络延迟 5.滑动窗口0.问题抛出1.发送方的滑动窗口2.如何表示发送方的四个部分&#xff1f;3.接收方的滑动窗口4.滑动窗口的完善理解 1.超时重传 1.什么是…

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起函数、线程切换函数、线程恢复函数、线程结束函数、线程结束判断函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换&#xff0c;使用的是ucontext_t结构体&#xff0c;和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体&#xff0c;并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

Splay 树简介

【Splay 树简介】 ● Treap 树解决平衡的办法是给每个结点加上一个随机的优先级&#xff0c;实现概率上的平衡。Splay 树直接用旋转调整树的形态&#xff0c;通过旋转改善树的平衡性。计算量小&#xff0c;效果好。 ● Splay 树的旋转主要分为“单旋”和“双旋”。 所谓“单旋”…

基于52单片机的AS608指纹密码锁电路原理图+源程序+PCB实物制作

目录 1、前言 2、实物图 3、PCB图 4、原理图 5、程序 资料下载地址&#xff1a;基于52单片机的AS608指纹密码锁电路原理图源程序PCB实物制作 1、前言 这是一个基于AS608STC89C52单片机的指纹识别和键盘密码锁。 里面包括程序&#xff0c;原理图&#xff0c;pcb图和实…

OpenNJet:云原生技术中的创新者与实践者

目录 引言OpenNJet介绍OpenNJet优势1. 性能无损动态配置2. 灵活的CoPilot框架3. 支持HTTP/34. 支持国密5. 企业级应用6. 高效安全 OpenNJet 编译与安装环境准备编译环境配置配置yum源yum 安装软件包创建符号连接修改 ld.so.conf 配置 编译代码 部署 WEB SERVER配置OpenNJet部署…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-13-按键实验

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

FTP协议与工作原理

一、FTP协议 FTP&#xff08;FileTransferProtocol&#xff09;文件传输协议&#xff1a;用于Internet上的控制文件的双向传输&#xff0c;是一个应用程序&#xff08;Application&#xff09;。基于不同的操作系统有不同的FTP应用程序&#xff0c;而所有这些应用程序都遵守同…

计算机网络【应用层】邮件和DNS

文章目录 电子邮件DNSDNS提供的服务&#xff1a;域名分级域名解析流程DNS资源记录DNS服务器类型 电子邮件 使用SMTP协议发送邮件之前&#xff0c;需要将二进制多媒体数据编码为ASCII码SMTP一般不使用中间邮件服务器发送邮件&#xff0c;如果收件服务器没开机&#xff0c;那么会…

解决jar包中没有主清单目录的问题

文章目录 解决jar包中没有主清单目录的问题问题描述环境描述方法一 | 阿里巴巴构造器的通用解决方案方式二 | 指定MANIFEST.MF路径 解决jar包中没有主清单目录的问题 问题描述 很简单可能很多人都遇到过&#xff0c;maven项目打成jar包后执行报错&#xff1a;jar包中没有主清单…

在模方中已经选好水岸线了,但是点处理瓦块的时候还是提示水岸线没选

答&#xff1a;能部分位置不闭合&#xff0c;双击右键闭合一下&#xff0c;可以强行闭合缺口。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&#xff0c;支持…

高情商回复(不是)

背景介绍 在抖音上有这样的视频&#xff0c;视频就是一张图&#xff0c;图上问了一个问题&#xff1a;饭局上&#xff0c;你去帮领导盛饭&#xff0c;领导接过后说&#xff1a;‘盛这么多&#xff0c;喂猪呢&#xff1f;’咋回&#xff1f; 底下有一个搞笑评论&#xff1a;猪可…

迅雷永久破解

链接&#xff1a;https://pan.baidu.com/s/1ZGb1ljTPPG3NFsI8ghhWbA?pwdok7s 下载后解压 以管理员身份运行绿化.bat&#xff0c;会自动生成快捷方式&#xff0c;如果没有可以在program中运行Thunder.exe

UDP如何端口映射?

UDP端口映射是一种网络技术&#xff0c;通过它可以实现在异地组网的情况下&#xff0c;不暴露在公网上&#xff0c;通过私有通道传输数据&#xff0c;并对数据进行安全加密&#xff0c;以保障数据的安全性。这项技术在如今日益复杂和危险的网络环境中显得尤为重要。 UDP&#x…

Rust 适合哪些场景?

目录 二、Rust 适合哪些场景&#xff1f; 三、Rust 社区的发展趋势如何&#xff1f; 四、Rust 快速搭建一个WebServer服务器 一、Rust是什么&#xff1f; Rust是一门赋予每个人构建可靠且高效软件能力的语言。 Rust 程序设计语言 一门帮助每个人构建可靠且高效软件的语言。…

tomcat-以服务的方式重启tomcat

背景 双击tomcat的bin目录下面的startup.bat&#xff0c;会留下一个cmd的窗口&#xff0c;很不优雅 使用service服务的方式启动&#xff0c;并且设置为自动启动 找到tomcat的bin目录输入cmd&#xff0c;按Enter&#xff0c;进入命令行界面。执行“service.bat install” 。&…

详解嵌入式MCU运行时分配的stack和heap

目录 概述 1 认识stack和heap 1.1 栈区&#xff08;stack&#xff09; 1.2 堆区&#xff08;heap&#xff09; 2 stack和heap的区别 2.1 管理方式的不同 2.2 空间大小不同 2.3 产生碎片不同 2.4 增长方式不同 2.5 分配方式不同 2.6 分配效率不同 3 确定stack和heap…

架构师:搭建Spring Security、OAuth2和JWT 的安全认证框架

1、简述 Spring Security 是 Spring 生态系统中的一个强大的安全框架,用于实现身份验证和授权。结合 OAuth2 和 JWT 技术,可以构建一个安全可靠的认证体系,本文将介绍如何在 Spring Boot 中配置并使用这三种技术实现安全认证,并分析它们的优点。 2、Spring Security Spri…