金额千位符自定义指令

news2024/9/30 13:24:28

自定义指令文件

moneyFormat.js

 /**
 * v-money 金额千分位转换
 */

export default {
  inserted: inputFormatter({
    // 格式化函数
    formatter(num, util) {
      if(num == null || num == '' || num == 'undefined' || typeof(num) == 'undefined'){
        return ''
      }
      if(util == '万元' || util == '万'){
        return formatMoney(num,'wan');
      }else if(util == '元'){
        return formatMoney(num);
      }
        // num = num.toString()
        // let num1 = num.split(".")[0], num2 = num.split(".")[1];
        // let c = num1.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,');
        // return num.toString().indexOf(".") !== -1 ? c + "." + num2 : c;
    },
    // 解析函数
    parser(val) {
        val = val.toString().replace(/,/g, "")
        console.log(val,'val')
        return parseFloat(val) //.replace(/0+$/,"");
    },
    isNumber: true
  })
}


/**
 * 监听输入框 数值千位符
 * @param {*} param0 
 * @returns 
 */
function inputFormatter({ formatter = (e) => e, parser = (e) => e, limit = (e) => e, watchInput = true, isNumber = false }){
  return (el, binding, vnode) => {
    console.log(vnode.elm.innerText,'vnode.elm.innerText')
    if(vnode.elm.innerText != '元' && vnode.elm.innerText != '万元' && vnode.elm.innerText != '万'){
      return
    }
      let watchVal = true
      const input = el.getElementsByClassName("el-input__inner")[0] //$(el).find(".el-input__inner")[0]
      // 获取记录光标位置
      let selectionSite
      let getSelectionSite = (event) => {
          let oldVal = event.target.value || ''
          let selectionStart = event.target.selectionStart
          selectionSite = oldVal.length - selectionStart
      }
      // 点击、键盘事件更新光标位置
      el.addEventListener("click", getSelectionSite)
      el.addEventListener("keyup", getSelectionSite)
      //为input绑定值赋值
      const assignment = (val) => {
          vnode.componentInstance.$emit('input', parser(val))
      }
      // 更改显示的值
      const upShow = (val) => {
        console.log(val,'valvalval')
          vnode.context.$nextTick(() => {
              input.value = val
          })
      }
      // 监听绑定值变化
      vnode.componentInstance.$watch('value', val => {
          if (watchVal) { upShow(formatter(val, vnode.elm.innerText)) }
      }, { deep: true, immediate: true })
      // 数字格式化
      let toNumber = (val) => {
          val = val.toString().replace(/[^\d^\.^\-]+/g, "") // 第二步:把不是数字,不是小数点、-的过滤掉
              .replace(/^0+(\d)/, "$1") // 第三步:第一位0开头,0后面为数字,则过滤掉,取后面的数字
              .replace(/^\./, "0.") // 第四步:如果输入的第一位为小数点,则替换成 0. 实现自动补全
              .replace(".", "$#$").replace(/\./g, "").replace("$#$", ".") // 只保留第一个".", 清除多余的"."
          // .match(/^\d*(\.?\d{0,9})/g)[0] || ""; // 第五步:最终匹配得到结果 以数字开头,只有一个小数点,而且小数点后面只能有1到9位小数
          return val
      }
      // 处理最后一位非法字符
      const handlerIllegalStr = (str) => {
          while (!(/^[0-9]+.?[0-9]*/.test(str.charAt(str.length - 1))) && str) {
              str = str.substr(0, str.length - 1)
          }
          return str || ''
      }
      // 监听input事件,可添加操作
      el.addEventListener("input", (event) => {
          let selectionStart = input.selectionStart
          let val = event.target.value
          if (binding.modifiers.number || isNumber) {
              val = toNumber(val)
          }
          let inp = limit(val)
          console.log(inp,'inp')
          event.target.value = inp
          // if (binding.modifiers.watchInput || watchInput) {
          //     assignment(inp)
          //     upShow(formatter(parser(val)))
          // }
          // setTimeout(() => {
          //     if (selectionSite && input.value.length != selectionStart) {
          //         input.selectionStart = input.selectionEnd = input.value.length - selectionSite
          //     }
          // }, 0)
      })
      if (input) {
        // 失去焦点
          input.addEventListener("blur", (event) => {
              watchVal = true
              let val = event.target.value;
              console.log(val,'失去焦点111')
              if(val == null || val == '' || val == 'undefined' || typeof(val) == 'undefined'){
                return ''
              }
              if (binding.modifiers.number || isNumber) {
                  val = handlerIllegalStr(val)
              }
              // assignment(val)
              upShow(formatter(val, vnode.elm.innerText)) 
              console.log(val,'失去焦点22')
          })
          // 获取焦点
          input.addEventListener("focus", (event) => {
              watchVal = false
              let val = event.target.value;
              if(val == null || val == '' || val == 'undefined' || typeof(val) == 'undefined'){
                return ''
              }
              // val = delcommafy(val);
              // assignment(val)
              upShow(parser(val))
              console.log(parser(val),'获取焦点')
          })
      }
  }
} 

//去除千分位中的‘,’
function delcommafy(num){
  if (num) {
    num = num.toString()
    num = num.replace(/,/gi, '')
    num = num.replace(/[ ]/g, '') //去除空格
    return num
  }
  return num 
}


/**
 * 金额千位符转换
 * @param {*}} val //金额
 * @param {*}} util //单位
 * @returns
 */
function formatMoney(val, util) {
  if(!val) return val;
  // 保留小时位数
  var count = util=='wan' ? 6 : 2;
  let str = val.toString().split('.');
  let re = /\d{1,3}(?=(\d{3})+$)/g;
  let n1 = str[0].replace(re, "$&,");
  var zeroCount = str.length > 1 && str[1] ? str[1] : ''
  // 小数点后面金额位置
  var strLength = str.length > 1 && str[1] ? str[1].length : 0
  for (let i = 0; i < (count-strLength); i++) {
    zeroCount += '0'
  }
  return str.length > 1 && str[1] ? `${n1}.${zeroCount}` : `${n1}.${zeroCount}`;
}

暴露指令index文件

directiveIndex.vue

import money from './moneyFormat'

const install = function(Vue) {
  Vue.directive('money', money)
}

export default install

引入自定义指令

main.js

import directive from './directiveIndex'

Vue.use(directive)

使用方式

<el-input v-model="money" placeholder="请输入金额" v-money>
       <template slot="append" ></template>
</el-input>

预览效果

在这里插入图片描述

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

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

相关文章

SHELL 基础 显示字符颜色, 修改历史命令,Linux里的命令 执行顺序

echo 打印命令 &#xff1a; 显示字符串 &#xff1a; [rootserver ~]# echo this is SHELL language this is SHELL language [rootserver ~]# echo this is SHELL language this is SHELL language [rootserver ~]# echo "this is SHELL language" this is SH…

vue 使用nvm控制node 版本,随意切换 node 版本

1.nvm 下载安装 https://github.com/coreybutler/nvm-windows/releases 找自己版本 1.安装版本 nvm list available // 查看所有node 版本 nvm install 版本号 // 安装指定版本号2.nvm 列表展示 nvm list //展示所有版本号3.nvm 切换环境 nvm use 版本号 // 切换版本4.…

星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来

目录 前言 一、监听按键并作出判断 二、持续移动 三、左右移动 总结&#xff1a; 前言 今天开始正式操控我们的小蜜蜂了&#xff0c;之前学java的时候是有一个函数监听鼠标和键盘的操作&#xff0c;我们通过传过来不同的值进行判断&#xff0c;现在来看看python是否一样的实现…

框架分析(1)-IT人必须会

框架分析&#xff08;1&#xff09;-IT人必须会 专栏介绍当今主流框架前端框架后端框架移动应用框架数据库框架测试框架 Angular关键特点和功能&#xff1a;组件化架构双向数据绑定依赖注入路由功能强大的模板语法测试友好 优缺点分析优点缺点 总结 专栏介绍 link 主要对目前市…

计算机竞赛 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

Datawhale 北邮分部成立了!

Datawhale分部 联合发起&#xff1a;陈玉立、陈逸涵、夏镇、李泽钜、邢植尧 蓟门以南&#xff0c;明光之北。杏坛向西&#xff0c;城垣东望。厚德博学&#xff0c;敬业乐群。 BYR&#xff0c;Datawhale北京邮电大学分部&#xff08;北邮AI俱乐部&#xff09;来啦&#xff01; …

微信好友恢复大师两招教你找回微信好友

在使用微信的时候&#xff0c;一些小伙伴可能没有给好友备注的习惯&#xff0c;所以很容易在清理“僵尸好友”时会不小心误删。如果您没有保存对方的联系方式&#xff0c;并且你们之间也没有共同好友&#xff0c;那么该如何重新加回好友呢&#xff1f;今天&#xff0c;小编就要…

Springboot 自定义 Mybatis拦截器,实现 动态查询条件SQL自动组装拼接(玩具)

前言 ps&#xff1a;最近在参与3100保卫战&#xff0c;战况很激烈&#xff0c;刚刚打完仗&#xff0c;来更新一下之前写了一半的博客。 该篇针对日常写查询的时候&#xff0c;那些动态条件sql 做个简单的封装&#xff0c;自动生成&#xff08;抛砖引玉&#xff0c;搞个小玩具&a…

【已解决】Please install Node.js and npm before continuing installation.

给juopyter lab安装插件时报这个错 原因是&#xff0c;conda本身有nodejs&#xff0c;但是版本很低&#xff0c;只有0.几 所以需要卸载掉原来的nodejs&#xff0c;重新安装10版本以上的nodejs # 卸载命令 pip uninstall nodejs # 安装命令 conda install nodejs14.7.0 -c cond…

从入门到精通:微信小程序跳转页面的实用指南

前言 微信小程序中页面跳转方法的灵活运用不仅可以提升用户体验&#xff0c;还能为应用增添更多创意和吸引力。本文将为大家详细介绍微信小程序跳转页面的方法&#xff0c;让你的应用与众不同&#xff0c;为用户带来全新的体验。 方式一&#xff1a;wx.navigateTo 保留当前页面…

第1步---MySQL安装和配置

第1步---MySQL安装和配置 1.下载地址 MySQL :: Download MySQL Community Server (Archived Versions) 直接下载zip形式的就可以。 2.在bin的同级目录下常见my.ini文件。 输入下面的内容 my.ini中的文本&#xff1a; [mysqld] #设置3306端口 port3306 character-set-server…

DELL R740 R750服务器安装Windows 11

正常安装出现如下 2、同时按下ShiftF10组合键调出管理员命令提示符窗口&#xff0c;依次执行下面命令&#xff0c;输入命令&#xff0c;按Enter键执行&#xff0c;提示操作成功完成&#xff0c;才可以。这些命令可以添加注册表项&#xff0c;绕过TPM、安全启动、CPU、内存和硬盘…

Linux常用命令——diffstat命令

在线Linux命令查询工具 diffstat 显示diff命令输出信息的柱状图 补充说明 diffstat命令用来显示diff命令输出信息的柱状图&#xff0c;用以显示diff命令比较两个文件的不同统计信息。用户也可以直接使用|将diff命令所输出的结果直接送给diffstat命令进行统计结果的显示。使…

如何编写一个通用的函数?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 金句分享:…

微信个人号开发,实现机器人辅助社群操作

微信 iPad 协议是指用于在 iPad 设备上使用微信应用的技术协议。一般来说&#xff0c;通过该协议可以将微信账号同步到 iPad 设备上&#xff0c;并且可以在 iPad 上发送和接收微信消息&#xff0c;查看好友列表、聊天记录等功能。微信 iPad 协议是通过私有API实现的。 需要一定…

图片转文字生成器分享,再也不用担心转换麻烦

在现今社交媒体时代&#xff0c;图片已经成为人们传递信息的重要方式之一。但是&#xff0c;由于有些图片可能不易于理解或者文字更能够准确表达内容&#xff0c;将图片转换为文字已经成为了一种常见的需求。在本文中&#xff0c;我们将分享一些将图片转换为文字的方法以及需要…

SIP桌面式对讲主机 井下通信广播sip寻呼话筒

SV-8003VP是我司的一款SIP桌面式对讲主机&#xff0c;具有10/100M以太网接口&#xff0c;配置了麦克风输入和扬声器输出&#xff0c;还配置多达22个按键和2.8英寸液晶显示屏&#xff0c;可以配合SIP服务器使用。SV-8003VP网路寻呼话筒可以通过麦克风或者本地线路输入对SIP终端进…

Java-异常分析和处理

Java异常处理 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。比如之前写代码时经常遇到的&#xff1a; 算术异常 数组越界异常 空指针异常 异常的体系结构 Throwable&#xff1a;是异常体系的顶层类&#xff0c;其派生出两个重要的子类, Error 和 Except…

AgentBench:AI智能体对AI行业发展的意义

自从今年年初ChatGPT引爆了生成式AI的概念之后,就有大量的企业和投资人宣布要进入AI行业,一场轰轰烈烈的“百模大战”由此展开。然而,在短短半年之后,当初高调下场的大多数企业再也没有了相关声音。 如果我们对这场“百模大战”进行复盘,就会发现很多企业的失败其实从一…

C++ 11 实现简单线程池

线程池是一种多线程处理形式&#xff0c;处理过程中将任务添加到队列&#xff0c;然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小&#xff0c;以默认的优先级运行&#xff0c;并处于多线程单元中。如果某个线程在托管代码中空闲&…