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

概要

提示:这里可以描述概要

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

输入框的联动

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

整体思路

提示:这里可以描述思路

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

首先,监听本次发票金额,确定实时输入的值是数值,而不是汉字英文字符标点什么的,而且在输入框输入的是  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.rhkb.cn/news/243206.html

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

相关文章

php目录操作示例

目录 1.常用函数 2.列举当前目录列表 3.判断是否是文件夹 1.常用函数 函数名功能scandir 列出指定路径中的文件和目录 opendir 打开文件夹&#xff0c;返回操作资源 readdir读取文件夹资源closedir 关闭文件夹操作资源 is_dir 判断是否是文件夹 filetype 显示是文件夹还是文…

HarmonyOS应用开发者高级认证

一、判断题 云函数打包完成后&#xff0c;需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用&#xff08;错&#xff09; 在column和Row容器组件中&#xff0c;aligntems用于设置子组件在主轴方向上的对齐格式&#xff0c;justifycontent用于设置子组件在交叉轴…

4496 蓝桥杯 求函数零点 简单

4496 蓝桥杯 求函数零点 简单 //C风格解法1&#xff0c;通过率100% #include <bits/stdc.h> // int a, b; 一定会自动初始化为 0int main(){int a 2, b 3; // 定义a&#xff0c;b&#xff0c;不会自动初始化&#xff0c;最好自己定义时初始化// windows环境下a值固定&…

springboot配置项动态刷新

文章目录 一&#xff0c;序言二&#xff0c;准备工作1. pom.xml引入组件2. 配置文件示例 三&#xff0c;自定义配置项动态刷新编码实现1. 定义自定义配置项对象2. 添加注解实现启动时自动注入3. 实现yml文件监听以及文件变化处理 四&#xff0c;yaml文件转换为java对象1. 无法使…

Python中使用多种方法输出哈沙德数

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 哈沙德数&#xff08;Harshad Number&#xff09;&#xff0c;又称Niven数&#xff0c;是指一个自然数&#xff0c;它可以被它的各位数字之和整除。换句话说&#xff0c;如果一个数字是哈沙德数&#xff0c;那么…

CSS 下载进度条

<template><view class=btn>下载中</view></template><script></script><style>/* 设置整个页面的样式 */body {width: 100vw; /* 页面宽度为视口宽度 */background: #000000; /* 背景颜色为白色 */display: flex; /* 使用 flex…

【JVM】JVM概述

JVM概述 基本介绍 JVM&#xff1a;全称 Java Virtual Machine&#xff0c;即 Java 虚拟机&#xff0c;一种规范&#xff0c;本身是一个虚拟计算机&#xff0c;直接和操作系统进行交互&#xff0c;与硬件不直接交互&#xff0c;而操作系统可以帮我们完成和硬件进行交互的工作特…

最优传输学习及问题总结

文章目录 参考内容lam0.1lam3lam10lam50lam100lam300画图线性规划matlabpython代码 欢迎关注我们组的微信公众号&#xff0c;更多好文章在等你呦&#xff01; 微信公众号名&#xff1a;碳硅数据 公众号二维码&#xff1a; 参考内容 https://blog.csdn.net/qq_41129489/artic…

使用ffmpeg调整视频中音频采样率及声道

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg -i example2.mp4 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable…

网页无法访问但是有网什么原因

目录 1.运行网络诊断&#xff0c;确认原因 原因A.远程计算机或设备将不接受连接(该设备或资源(Web 代理)未设置为接受端口“7890”上的连接 原因B.DNS服务器未响应 场景A.其他的浏览器可以打开网页&#xff0c;自带的Edge却不行 方法A&#xff1a;关闭代理 Google自带翻译…

C++中命名空间、缺省参数、函数重载

目录 1.命名空间 2.缺省参数 3.函数重载 1.命名空间 在C中定义命名空间我们需要用到namespace关键字&#xff0c;后面跟上命名空间的名字&#xff0c;结构框架有点类似结构体&#xff08;如图所示&#xff09; 上面的代码我一一进行讲解&#xff1a; 1.我们先来说第三行和main函…

如何搭建MariaDB并实现无公网ip环境远程连接本地数据库

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射…

【C++】priority_queue模拟实现过程中值得注意的点

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 本篇文章旨在记录博主在模…

HCIA vlan练习

目录 实验拓扑 实验要求 实验步骤 1、交换机创建vlan 2、交换机上的各个接口划分到对应vlan中 3、trunk干道 4、路由器单臂路由 5、路由器DHCP设置 实验测试 华为交换机更换端口连接模式报错处理 实验拓扑 实验要求 根据图划分vlan&#xff0c;并通过DHCP给主机下发…

Docker(三)使用 Docker 镜像:从仓库获取镜像;管理本地主机上的镜像;介绍镜像实现的基本原理

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 使用 Docker 镜像 在之前的介绍中&#xff0c;我们知道镜像是 Docker 的三大组件之一。 Docker 运行容器前需要本地存在对应的镜像&#x…

c语言冒泡排序

系列文章目录 c语言冒泡排序 c语言冒泡排序 系列文章目录一、冒泡排序原理二、冒泡排序案例 一、冒泡排序原理 有几个数就需要排序几次-1 从数组第一个元素开始和相邻的元素比对&#xff0c;大的元素放在后面&#xff0c;小的放在前面 如&#xff0c;428057139 4与2对比&#x…

「优选算法刷题」:在排序数组中查找元素的第一个和最后个位置

一、题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&a…

Spring--@Async解析

一、Async 简介 从Spring3开始提供了Async注解&#xff0c;被该注解标注的方法&#xff0c;Spring底层会新建一个线程池或者使用已有的线程池中的线程去异步的执行被标注的方法。 二、Async 工作原理 Async与Transactional 工作原理基本是一样的&#xff0c;也是通过Spring …

【数据结构初阶】——顺序表

本文由睡觉待开机原创&#xff0c;转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&#xff01; 这里写目录标题 1.数据结构2.顺序表线性表顺序表的结构 3.动态顺序表的实现 1.数据结构 数据结构的概念&…

【JavaEE进阶】 Spring Boot⽇志

文章目录 &#x1f38b;关于日志&#x1f6a9;为什么要学习⽇志&#x1f6a9;⽇志的⽤途&#x1f6a9;日志的简单使用 &#x1f384;打印⽇志&#x1f6a9;程序中得到⽇志对象&#x1f6a9;使⽤⽇志对象打印⽇志 &#x1f38d;⽇志格式的说明&#x1f6a9;⽇志级别的作用&#…