后面的输入框与前面的联动,输入框只能输入正数(不用正则)

概要

提示:这里可以描述概要

  • 前面的输入框是发票金额,
  • 后面的输入框是累计发票金额(含本次)--含本次就代表后倾请求的接口的数据(不是保存后返显的-因为保存后返显的是含本次)是不含本次的
  • 所以在输入发票金额的时候,累计发票金额(含本次)也会跟着变化

输入框的联动

  • 前面本次发票金额的输入框只能输入数值类型的数值,最多生效两位小数,多了会报错
  • 后面累计发票金额(含本次)的输入框可以修改值,也是只能输入数值类型的数值,最多生效两位小数,多了会报错
  • 输入数值要实时变动,而不是失去焦点后再计算
  • 千分位也是实时出现 "," 而不是失去焦点的时候才有千分位

整体思路

提示:这里可以描述思路

后面输入框累计发票金额(含本次)的值虽然可以修改,但是前面的输入框本次发票金额在输入值的时候也要计算,得用后台请求的值加上本次发票金额,而且输入框的值输入错的话不能让其提交,所以得有表单验证,输入框的值是实时变化的,所以可以用监听。

首先,监听本次发票金额,确定实时输入的值是数值,而不是汉字英文字符标点什么的,而且在输入框输入的是  0.(零点几的时候会有 0.)这个时候 累计发票金额(含本次)会自动加上前面本次发票金额的值 不能报错

技术选型

提示:这里可以对技术选项解释

在监听验证数据的时候,验证数据书不是数值,包括在发票金额输入 0. 的时候 累计发票金额(含本次)实时 加上 本次发票金额 不能是 NAN 

如果 用 正则验证 不行, 如果用正则 当是 0. 的时候会报错 无论用那种都不识别 但是是 0.3 能识别

因此不能用正则 而且 如果用正则的话 首先要判断输入的值是 数值  还得判定 带小数的和不带小数的  

那么用什么呢?   Number(val) 可以判定 如果不是数值 就会返回 NAN 如果是 0. 则会返回0

这样就完美的解决了问题

html页面

<el-form:model="shenPiDialogForm"ref="shenPiDialogForm":rules="shenPiDialogRule"class="demo-ruleForm":label-width="shenPiLabelWidth"><el-row :span="24"><el-col :span="12"><el-form-item label="本次发票金额(元):" prop="currentNowMoney"><el-input v-model.trim="shenPiDialogForm.currentNowMoney"></el-input></el-form-item></el-col><el-col :span="12"><el-form-itemlabel="累计发票金额(含本次)元:"prop="cumulativeInvoices"><el-input v-model="shenPiDialogForm.cumulativeInvoices"></el-input></el-form-item></el-col></el-row><el-row :span="24"><el-col :span="12"><el-form-item label="缓付金额(人民币小写)元:" prop="">{{ shenPiDialogForm.deferredAmount }}</el-form-item></el-col><el-col :span="12"> </el-col></el-row><el-form-item><el-buttontype="primary"v-loading.fullscreen.lock="loading"@click="submitForm('shenPiDialogForm')">提交</el-button><el-button @click="resetForm('shenPiDialogForm')">取消</el-button></el-form-item></el-form>

 js页面

1:用到的引入

1:本次申请金额 转大写

/**@Author: FangbinGuo*@Date:2023-04-15 12:05:11*@Description:*/
// 本次申请金额 转大写
export function ZhuanDaXie(number) {let newVal="";if(String(number).indexOf(",")){//如果是千分位的话 会有 , 去掉 ,newVal=String(number).replace(/\,/g,"");}else{newVal=number;}let numberVal=Number(newVal);// 将 传入的值 转换为 数值let result = "";if(isNaN(numberVal)||numberVal<0){// 如果 传入的 值  不是数值 或者 传入的金额 小于零result=""} else {if (number !== "" && number != null && number !== "0"&& number !== 0) {// 如果 输入的值 非零 非 空if(String(number).indexOf(".")){// 如果 含 小数if(String(newVal).slice(String(newVal).indexOf(".")).length>3){// 如果 小数部分超过两位result=""}else{// 如果 小数部分不超过两位result=zhuanHanZi(newVal)}}else{// 如果不含小数result=zhuanHanZi(newVal)}}else if(number==="0"||number===0){result="零整"}else{result=""}}return result
} 
// 将 传入的数值 转为 汉字
export function zhuanHanZi(val){let hanZi="";let unit = "仟佰拾亿仟佰拾万仟佰拾元角分";let str = "";val += "00";const point = val.indexOf(".");if (point >= 0) {val = val.substring(0, point) + val.substr(point + 1, 2);}unit = unit.substr(unit.length - val.length);for (let i = 0; i < val.length; i++) {str +="零壹贰叁肆伍陆柒捌玖".charAt(val.charAt(i)) + unit.charAt(i);}return hanZi =str.replace(/零(仟|佰|拾|角)/g, "零").replace(/(零)+/g, "零").replace(/零(万|亿|元)/g, "$1").replace(/(亿)万|(拾)/g, "$1$2").replace(/^元零?|零分/g, "")// .replace(/元$/g, "元");.replace(/元$/g, "元") + "整";
}

2: 数值转千分位 与 千分位转数值

/**@Author: FangbinGuo*@Date:2023-04-20 09:45:26*@Description: 数值转千分位   与  千分位转数值*/
import { MessageBox, Message } from "element-ui";export function numberToQianFenWei(value) {let ShuZhireg=/^((0{1}\.\d{1,2})|([1-9]\d*\.{1}\d{1,9})|([1-9]+\d*)|0)$/;let newValue=""if(String(value).indexOf(",")){newValue=String(value).replace(/\,/g,"");// newValue=String(value).replaceAll(",","");}else{newValue=value;}if (newValue===0||newValue==="0") return 0;if (newValue===""||newValue===null||newValue===undefined) return "";// 获取整数部分const intPart = Math.trunc(newValue);// debuggerif(ShuZhireg.test(intPart)){// 整数部分处理,增加,const intPartFormat = intPart.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,')// 预定义小数部分let floatPart = ''// 将数值截取为小数部分和整数部分const valueArray = value.toString().split('.')if (valueArray.length === 2) { // 有小数部分floatPart = valueArray[1].toString() // 取得小数部分return intPartFormat + '.' + floatPart}return intPartFormat + floatPart}else{// Message({//   message: "输入有误,请仔细查看!!!",//   type: "error",// });return value;}}// 千分位传到后台 后台不识别 所以 传给后台的金额不能是千分位的数字 要转成正常数值
export function qianFenWeiZhuanToNumber(val){if(val !== "" && val != null &&val != 0){let valStr=val+"";if(valStr.indexOf(",")) {return valStr.replace(/\,/g,"");}else{return valStr}}else{return val}}

 3:表单的自定义验证方法

// 校验数值 必填 可以为0 但是不能为空   ---必填(最多两位小数)
export function JinEBuNengWeiKong(rule, value, callback) {let SguZhireg=/^((0{1}\.\d{1,2})|([1-9]\d*\.{1}\d{1,2})|([1-9]+\d*)|0)$/;if(value===null||value===""){callback(new Error('请输入数值,不能为空!'));}else if(value===0){callback();}else{let newVal="";if(String(value).indexOf(",")){//如果是千分位的数值,去掉里面的 , 后再验证newVal=String(value).replace(/\,/g,"");}else{newVal=value;}if(!SguZhireg.test(newVal)){callback(new Error('请输入最多只有两位小数且为正数的数值!'));}else if(newVal.toString().indexOf(".")==-1){//如果没有小数点if(newVal.toString().length>=13){callback(new Error('输入的数不得超过千亿!'))}else{callback()}}else if(newVal.toString().indexOf(".")>12){//如果有小数点callback(new Error('输入的数不得超过千亿!'))}else{callback()}}
}

 3:方法与监听

import {numberToQianFenWei,qianFenWeiZhuanToNumber,
} from "@/utils/qianFenWei.js";//引入方法
import { ZhuanDaXie } from "@/utils/chineseNumber";//引入方法
import {LJFPJE,//累计发票金额
} from "@/api/noWorkPayment/index.js";//接口
import {JinEBuNengWeiKong,
} from "@/utils/toolsObj.js";//引入表单验证方法data() {return {loading:false,contractId:"",//累计发票金额 用到的 参数lineId:"",//累计发票金额 用到的 参数shenPiLabelWidth: "210px",// 审批弹窗shenPiDialogForm: {flowEventId:'',//流程idcurrentNowMoney:0,//本次发票金额cumulativeInvoices:"",//累计发票金额deferredAmount:"",//缓付金额},BCSJZF:"",//本次实际支付NumBCFPJE:0,//本次发票金额 数值形式NumLJFPJEHBC:0,//累计发票金额含本次 数值形式NumLJFPJEBHBC:0,//累计发票金额不含本次 数值形式shenPiDialogRule: {// 本次发票金额currentNowMoney: [{ required: true, validator: JinEBuNengWeiKong, trigger: "blur" },],// 累计发票金额cumulativeInvoices: [{ required: true, validator: JinEBuNengWeiKong, trigger: "blur" },],},};},watch:{// 本次发票金额"shenPiDialogForm.currentNowMoney": function (newVAl, oldVal) {this.NumBCFPJE=qianFenWeiZhuanToNumber(newVAl);this.shenPiDialogForm.currentNowMoney=numberToQianFenWei(newVAl);// 首先分为有值和没有值if(newVAl===""||newVAl===null){//如果输入框没值this.shenPiDialogForm.currentNowMoney = "";this.NumBCFPJE=0;}else {//如果输入框有值 判断是不是数值类型if(Number(this.NumBCFPJE)||Number(this.NumBCFPJE)===0){// 如果this.NumBCFPJE=0.时 Number(0.) 的值是0 0是false 就进入不了里面if(String(this.NumBCFPJE).indexOf(".")>0){//如果数值中 含小数// 将不是千分位的数值 转成字符串let strNewVal=String(this.NumBCFPJE);// 小数点前的数值let numDot=strNewVal.slice(0,(String(this.NumBCFPJE).indexOf(".")-0)+1);// 小数点后的数值let dotNum=strNewVal.slice((String(this.NumBCFPJE).indexOf(".")-0)+1,);// 小数点后面两位let baoLiuLiangWei=dotNum.slice(0,(String(this.NumBCFPJE).indexOf(".")-0)+3);let NumValRes="";if(String(dotNum).length>2 ){// 小数后超过两位 截取到小数点后两位的值 后拼接NumValRes=String(numDot).concat(baoLiuLiangWei);return this.$message.error("最多两位小数!");}else{// 如果小数点正好两位 那么直接拼接NumValRes=String(numDot).concat(dotNum);}// 使用 小数点前的(数值/千分位)和小数点后(保留两位)的数值this.NumBCFPJE=qianFenWeiZhuanToNumber(NumValRes);this.shenPiDialogForm.currentNowMoney=numberToQianFenWei(NumValRes);}else{//如果数值中 不含小数this.NumBCFPJE=qianFenWeiZhuanToNumber(newVAl);this.shenPiDialogForm.currentNowMoney=numberToQianFenWei(newVAl);}}else{//不是数值 一定是错的,报错this.$message.error("请输入数值!")this.shenPiDialogForm.currentNowMoney = "";this.NumBCFPJE=0;}}this.NumLJFPJEHBC=(this.NumBCFPJE-0)+(this.NumLJFPJEBHBC-0);this.shenPiDialogForm.cumulativeInvoices=((this.NumBCFPJE-0)+(this.NumLJFPJEBHBC-0)).toFixed(2);},// 累计发票金额  "shenPiDialogForm.cumulativeInvoices": function (newVAl, oldVal) {if (newVAl == 0 || newVAl == null || newVAl == "0") {this.shenPiDialogForm.cumulativeInvoices = newVAl;this.NumLJFPJEHBC=0;this.NumLJFPJEBHBC=0;} else {this.NumLJFPJEHBC=qianFenWeiZhuanToNumber(newVAl);this.NumLJFPJEBHBC=((this.NumLJFPJEHBC-0)-(this.NumBCFPJE-0)).toFixed(2);this.shenPiDialogForm.cumulativeInvoices = numberToQianFenWei(newVAl);}},},methods: {// 累计发票金额 验工与非验工 的参数不一样getLJFPJE(){this.loading=true;this.NumLJFPJEBHBC="";this.shenPiDialogForm.cumulativeInvoices="";LJFPJE({contractId:this.contractId,segmentId:this.clickData.segmentId,lineId:this.lineId,}).then(res=>{this.loading=false;if(res.code==0){this.NumLJFPJEBHBC=(res.data.cumulativeInvoices-0);this.shenPiDialogForm.cumulativeInvoices=numberToQianFenWei(res.data.cumulativeInvoices);}})},}

小结

提示:这里可以添加总结

这里最重要的是对 0. 的验证 如果是用正则验证,大家可以试一下,在输入 0. 时是报错的,但是0.2又不会报错 ,用了 Number(val) 来判断是不是 数值 用 Number(val)===0( 因为 Number(0.)===0  )  来判定 0. 输入的也是 数值

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

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

相关文章

Linux基础命令[1]-ls

文章目录 1. ls 命令说明2. ls 常用命令参数2.1 -l&#xff08;展示详细信息&#xff09;2.2 -a/-A&#xff08;展示隐藏文件&#xff09;2.3 -t/-c/-r&#xff08;展示信息排序&#xff09;2.4 -h&#xff08;展示文件大小&#xff09;2.5 -R&#xff08;递归展示&#xff09;…

iphone5s基带部分电源部分主主电源供电及

时序: 1.,基带电源的供电&#xff0c;基带电源也叫pmu。 首先时序图说电池提供供电&#xff0c;电池是J6接口&#xff0c;视频习惯把接口称之为座子。查U2_RF芯片&#xff0c;发现供电信号为PP_BATT_VCC_CONN&#xff0c;但是没查到跟电池座子有关系&#xff0c;电池座子写的是…

linux C语言socket函数recv

recv 函数是在 Linux C 语言网络编程中用于从已连接的套接字接收数据的函数。它通常与 TCP 连接一起使用&#xff0c;但也可以用于 UDP&#xff08;尽管对于 UDP&#xff0c;更常使用 recvfrom&#xff0c;因为它还可以接收发送方的地址信息&#xff09;。 函数原型 recv 函数…

SpringMVC基础知识学习笔记

Universe Infinity Inc. 目录 一、学习SpringMVC主要是学什么1、SpringMVC的基本原理2、SpringMVC学习串联 二、快速体验SpringMVC的开发1、新建项目&#xff0c;转成web项目2、引入依赖3、编写Spring的配置类4、配置web启动类&#xff0c;替代web.xml5、编写Handler&#xff…

第十二篇【传奇开心果系列】Ant Design Mobile of React开发移动应用:内置组件实现酷炫CSS 动画

Ant Design Mobile of React 开发移动应用示例博文系列 第一篇【传奇开心果系列】Ant Design Mobile of React 开发移动应用:从helloworld开始 第二篇【传奇开心果系列】Ant Design Mobile of React 开发移动应用:天气应用 第三篇【传奇开心果系列】Ant Design Mobile of Reac…

beego的模块篇 - I18n国际化

1. i18n 安装导入 安装该模块&#xff1a; go get github.com/beego/i18n 导入引用包&#xff1a; import ("github.com/beego/i18n" ) conf 目录下就有 locale_en-US.ini 和 locale_zh-CN.ini 两个本地化文件。 本地化文件的文件名和后缀是随意的&#xff0c;不…

MySQL 索引(上)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL-进阶篇 &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现…

libpcap简明教程

文章目录 前言tcpdump的使用libpcap API的简单使用libpcap API的进阶使用 前言 因为之前简单写过wireshark入门指北&#xff0c;所以我知道基本的抓包流程。最近尝试调用libpcap的C API接口&#xff0c;顺道整理下。 本文实验如下&#xff1a; 使用tcpdump命令抓取目标地址为…

【漏洞复现】Hikvision SPON IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)

文章目录 前言声明一、系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 Hikvision Intercom Broadcasting System是中国海康威视&#xff08;Hikvision&#xff09;公司的一个对讲广播系统。 声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播…

[已解决]前端使用el-upload,后端使用文件上传阿里云报错:异常信息:java.lang.NullPointerException: null

前端使用el-upload&#xff0c;后端使用文件上传阿里云报错&#xff1a; 报错原因&#xff1a;前端image参数未传进去 解决方法&#xff1a;在el-upload添加属性 name"image" 文件传进去了&#xff01;

回溯法:0-1背包问题

问题描述 给定种物品和一背包。 物品的重量是&#xff0c; 其价值为&#xff0c;背包的容量为 c。 问应该如何选择装入背包中的物品&#xff0c;使得装入背包中物品的总价值最大&#xff1f;注意物品不重复! 实例&#xff1a;物品价值V{12, 11, 9, 8}, 物品重量W{8, 6, 4, 3},…

手写Vue3源码

Vue3核心源码 B站视频地址&#xff1a;https://www.bilibili.com/video/BV1nW4y147Pd?p2&vd_source36bacfbaa95ea7a433650dab3f7fa0ae Monorepo介绍 Monorepo 是管理项目代码的一种方式&#xff0c;只在一个仓库中管理多个模块/包 一个仓库可以维护多个模块&#xff0c;…

Fog-Aware Adaptive YOLO for Object Detection in Adverse Weather

Abstract 提出了一种雾自适应YOLO算法。使用一种雾评估算法将图片分为有雾和无雾图片&#xff0c;随后将标准的YOLO应用于正常图片&#xff0c;自适应YOLO应用于有雾图片。 Method 目前的除雾方法去除雾霾时不考虑其雾度和发生频率。例如&#xff0c;图像自适应YOLO算法[6]试…

【已解决】Qt Creator设计模式被禁用不能点的原因及解决方案

Qt Creator 下载地址&#xff08;含历史版本&#xff09;&#xff1a;https://download.qt.io/official_releases/qtcreator/ 症状 Qt Creator 目前最新版为12.0.1&#xff0c;安装后打开.qml文件发现设计工具图标为禁用状态。 原因及解决方案 根据官网材料&#xff08;Qt C…

机器视觉检测设备在连接器外观缺陷检测中的应用

作为传输电流或信号连接两个有源器件的器件&#xff0c;连接器被广泛应用于各个行业&#xff0c;从手机、平板、电脑&#xff0c;到冰箱、空调、洗衣机&#xff0c;再到汽车、国防、航空&#xff0c;处处是它的所在。每个电子产品少了连接器将无法运作&#xff0c;因此&#xf…

Python——面向对象案列

1. class User(object):#重写__int__初始化方法&#xff0c;该方法用来初始化属&#xff0c;在构建方法的时候&#xff0c;这个方法会自动触发&#xff0c;用来初始化属性def __init__(self): #name “” 这是一个局部变量#self类似指针 this#self.name类的属性print("构…

计算机网络-甘晴void学习笔记

计算机网络 计科210X 甘晴void 202108010XXX 文章目录 计算机网络期中复习1计算机网络和因特网1.1 因特网1.2 网络边缘1.3 网络核心1.4 分组交换的时延/丢包和吞吐量1.5 协议层次与服务模型 2 应用层原理2.1 应用层协议原理2.2 Web和Http2.3 因特网中的电子邮件2.4 DNS&#x…

K8S--部署Nacos

原文网址&#xff1a;K8S--部署Nacos-CSDN博客 简介 本文介绍K8S部署Nacos的方法。Nacos版本是&#xff1a;2.2.3。 部署方案 本文为了简单&#xff0c;使用此部署方式&#xff1a;使用本地pvconfigmap&#xff0c;以embedded模式部署单机nacos。以nodePort方式暴露端口。 …

vectorCast——Probe point 功能实现故障注入,局部变量打印,断点调试。

选择一个测试用例,选择coverage窗口进行查看。点击edit probe point,如图所示绿色的小圆圈。选代码中选择需要打断点的地方进行点击。黑色的小圆点都可以选。点击黑色小圆点,小圆点变绿,表示打断点成功。此时就可以根据自己的需求在打断点的位置编写一些C语言的命令语句。点…

线程同步--生产者消费者模型--单例模式线程池

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器基于生产者消费者模型实现单例线程池 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件…