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

news2024/11/24 22:35:05

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

例如:

输入: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>

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

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

相关文章

小满OKKICRM与金蝶云星空对接集成客户列表查询(更新列表)打通客户新增

小满OKKICRM与金蝶云星空对接集成客户列表查询(更新列表)打通客户新增 接通系统&#xff1a;小满OKKICRM 深圳市小满科技有限公司&#xff08;简称&#xff1a;小满科技&#xff09;成立于2013年3月&#xff0c;公司位于深圳市南山区高新园区&#xff0c;是一家国家级高新技术企…

BetterMouse for Mac激活版:鼠标增强软件

BetterMouse for Mac是一款鼠标增强软件&#xff0c;旨在取代笨重的、侵入性的和耗费资源的鼠标驱动程序&#xff0c;如罗技选项。它功能丰富&#xff0c;重量轻&#xff0c;效率优化&#xff0c;而且完全隐私安全&#xff0c;试图满足你在MacOS上使用第三方鼠标的所有需求。 B…

cmake进阶:文件操作之写文件

一. 简介 cmake 提供了 file() 命令可对文件进行一系列操作&#xff0c;譬如读写文件、删除文件、文件重命名、拷贝文件、创建目录等等。 接下来 学习这个功能强大的 file() 命令。 本文学习 CMakeLists.txt语法中写文件操作。 二. cmake进阶&#xff1a;文件操作之写文件…

Gin 框架的使用

1、Gin 快速开发 1.1、环境准备 1.1.1、导入 gin 依赖 这里就叫 gin 依赖了&#xff0c;在 Goland 命令行中输入下面的命令&#xff1a; go get -u github.com/gin-gonic/gin 1.1.2、设置代理 如果下载失败&#xff0c;最好设置一下代理&#xff0c;在 cmd 命令行中输入下…

深度学习之基于Matlab Googlenet网络男女性别识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着计算机视觉技术的快速发展&#xff0c;性别识别在多个领域中都展现出了广泛的应用前景&#xff…

基于springboot实现志同道合交友网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现志同道合交友网站系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本志同道合交友网站就是在这样的大环境下诞生&#xff0c;其可以…

SpringMVC简介和体验

一、SpringMVC简介和体验 1.1 介绍 Spring Web MVC :: Spring Framework Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称&#xff08; spring-webmvc &#xff09;&#…

修改idea缓存的默认存储位置

打开idea.properties 找到 # idea.config.path${user.home}/.IntelliJIdea/config # idea.system.path${user.home}/.IntelliJIdea/system 将${user.home}替换成你要存储到的路径 再次打开idea时会弹出消息&#xff0c;点击ok即可。

Mujoco210和Mujoco-py在 Ubuntu22.04 下的安装

mujoco和mujoco-py的关系&#xff1a;mujoco是一个物理引擎&#xff0c;主要应用于强化学习和最优化控制领域。mujoco-py是mujoco编程的 Python 接口&#xff0c;由OpenAI Gym开发&#xff0c;可以使用mujoco_py方便地调用mujoco的API。 mujoco官网&#xff1a; https://mujoco…

探无止境,云游未来 | “游戏出海云”发布

4月28日下午&#xff0c;2024中国移动算力网络大会之“游戏出海”分论坛在江苏省苏州金鸡湖国际会议中心圆满落幕。 此次论坛由中国移动海南公司主办&#xff0c;中国移动通信集团政企事业部、中国移动云能力中心、中国移动国际公司共同协办。海南省工业与信息化厅副厅长黄业晶…

webpack4和webpack5区别1---loader

webpack4处理图片和字体的loader file-loader file-loader的作用是处理webpack中的静态资源文件。File Loader可以将各种类型的文件&#xff0c;如图像、字体、视频等转换为模块并加载到Web应用程序中。它通过import或require语句引入文件资源&#xff0c;并将其放置在输出目…

C++类细节,面试题02

文章目录 2. 虚函数vs纯虚函数3. 重写vs重载vs隐藏3.1. 为什么C可以重载&#xff1f; 4. 类变量vs实例变量5. 类方法及其特点6. 空类vs空结构体6.1. 八个默认函数&#xff1a;6.2. 为什么空类占用1字节 7. const作用7.1 指针常量vs常量指针vs常量指针常量 8. 接口vs抽象类9. 浅…

likeshop多商户单商户商城_likeshop跑腿源码_likeshop物品租赁系统开源版怎么配置小程序对接?

本人是商业用户所以能持续得到最新商业版&#xff0c;今天我说下likeshop里面怎么打包小程序&#xff0c;大家得到程序时候会发现它有admin目录 app目录 server目录 这三个目录分别是做什么呢&#xff1f; 1.admin目录 下面都是架构文件使用得是Node.js打包得&#xff0c;至于…

使用 AsyncOpenAI 库异步调用 OpenAI API 同时回答多个问题

目录 模型部署 不使用 async 使用 async 使用 async 完整代码 模型部署 首先&#xff0c;直接将 vLLM 部署为模仿 OpenAI API 协议的服务器&#xff0c;我这里选用的模型为 Meta-Llama-3-70B-Instruct python -m vllm.entrypoints.openai.api_server --model /root/auto…

视频质量评估

视频质量评估 一、全参考客观视频质量评价方法三、MSSIM四、STRRED五、VMAF六、MOS 一、全参考客观视频质量评价方法 全参考客观视频质量评价方法是指把原始参考视频与失真视频在每一个对应帧中的每一个对应像素之问进行比较。准确的讲&#xff0c;这种方法得到的并不是真正的…

✩✩✩探索绍兴ISO9001认证:打造品质新高度✩✩✩

&#x1f50e;探索&#x1f497;绍兴ISO9001认证&#xff1a;&#x1f3af;打造品质新高度✨ &#x1f481;‍♂️今天来聊聊&#x1f449;绍兴的ISO9001认证&#xff0c;✍️这可是品质管理领域的♨️一个大热门话题&#xff01;&#x1f525; 你知道吗&#xff0c;&#x1f3…

ChatGPT4 Turbo 如何升级体验?官网如何使用最新版GPT-4 Turbo?

本文会教大家如何教大家升级自己的GPT4到GPT4 Turbo&#xff0c;同时检验自己的GPT4 Turbo是否是最新版本的GPT-4-Turbo-2024-04-09 说明 新版GPT-4 Turbo再次重夺大模型排行榜王座&#xff0c;超越了Claude 3 Opus。 最新版本的GPT-4 Turbo被命名为GPT-4-Turbo-2024-04-09。…

C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Spring JdbcTemplate实现自定义动态sql拼接功能

需求描述&#xff1a; sql 需要能满足支持动态拼接&#xff0c;包含 查询字段、查询表、关联表、查询条件、关联表的查询条件、排序、分组、去重等 实现步骤&#xff1a; 1&#xff0c;创建表及导入测试数据 CREATE TABLE YES_DEV.T11 (ID BINARY_BIGINT NOT NULL,NAME VARCH…

LSTM计算指示图

掌握网络结构组件构成 输入门、遗忘门、输出门候选记忆细胞记忆细胞隐藏状态ref&#xff1a;6.8. 长短期记忆&#xff08;LSTM&#xff09; — 《动手学深度学习》 文档 (gluon.ai)