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

news2024/9/21 20:49:09

概要

提示:这里可以描述概要

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

输入框的联动

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

整体思路

提示:这里可以描述思路

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

首先,监听本次发票金额,确定实时输入的值是数值,而不是汉字英文字符标点什么的,而且在输入框输入的是  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-item
          label="累计发票金额(含本次)元:"
          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-button
        type="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);
  // debugger
  if(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:'',//流程id
        currentNowMoney: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.coloradmin.cn/o/1398514.html

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

相关文章

ACM题解Day1|1.Accurate Movement ,2.Help the Support Lady, 3.Absolute Game

1.Accurate Movement 思路 : 本题为模拟题主要是模拟方块的移动,其中 以两木块的最右端做为记录点. 先挪动a, 每次a块只能挪到和b块相同的位置, b块每次最多挪动(b-a).为什么因为有限制挡板然后俩木块要不能同时移动只能移动一一个 #include<bits/stdc.h> using namespac…

网页设计(九)JavaScript基础应用

一、网页中文字的字号选择性改变 单击前初始状态页面 单击“中”链接后页面 文字素材&#xff1a;   JavaScript是一种能让你的网页更加生动活泼的程式语言&#xff0c;也是目前网页中设计中最容易学又最方便的语言。你可以利用JavaScript轻易的做出亲切的欢迎讯息、漂亮的…

Linux系统安装NFS服务器

NFS是一种网络文件系统&#xff0c;英文全称Network File System&#xff0c;通过NFS可以让不同的主机系统之间共享文件或目录。通过NFS&#xff0c;用户可以直接在本地NFS客户端读写NFS服务端上的文件&#xff0c;是非常好的共享存储工具。本篇文章将介绍如何在CentOS7上安装N…

使用Python在本地生成助记词

新建并打开一个空文件夹 逐行 执行命令 python3 -m pip install --upgrade pippip3 install eth_accountpip3 install web3touch acco.py然后看到文件夹下面会有个acco.py文件 将把下面的代码粘贴到acco.py中保存。 import os from eth_account import Accountif __name__ …

全网最详细!!Python 爬虫快速入门

1. 背景 最近在工作中有需要使用到爬虫的地方&#xff0c;需要根据 Gitlab Python 实现一套定时爬取数据的工具&#xff0c;所以借此机会&#xff0c;针对 Python 爬虫方面的知识进行了学习&#xff0c;也算 Python 爬虫入门了。 需要了解的知识点&#xff1a; Python 基础语…

Windows给docker设置阿里源

windows环境搭建专栏&#x1f517;点击跳转 Windows系统的docker设置阿里源 文章目录 Windows系统的docker设置阿里源1.获得镜像加速器2.配置docker 由于我们生活在中国大陆&#xff0c;所以外网的访问总是那么慢又困难&#xff0c;用docker拉取几兆的小镜象还能忍受&#xff…

idea中使用git提交代码报 Nothing To commit No changes detected

问题描述 在idea中右键&#xff0c;开始将变更的代码进行提交的时候&#xff0c;【Commit Directory】点击提交的时候 报 Nothing To commit No changes detected解决方案 在这里点击Test 看看是不是能下面显示git版本&#xff0c;不行的话 会显示一个 fix的字样&#xff0c;行…

【2023我的编程之旅】七次不同的计算机二级考试经历分享

目录 我报考过的科目 第一次报考MS Office 第二次报考Web语言&#xff0c;C语言&#xff0c;C语言 第三次报考C语言&#xff0c;C语言&#xff0c;Java语言 分享一些备考二级的方法 一些需要注意的细节 结语 2023年的CSDN征文活动已经进入了尾声&#xff0c;在这最后我…

YOLOv8改进 | 进阶实战篇 | 利用YOLOv8进行视频划定区域目标统计计数

一、本文介绍 Hello,各位读者,最近会给大家发一些进阶实战的讲解,如何利用YOLOv8现有的一些功能进行一些实战, 让我们不仅会改进YOLOv8,也能够利用YOLOv8去做一些简单的小工作,后面我也会将这些功能利用PyQt或者是pyside2做一些小的界面给大家使用。 在开始之前给大家推…

二、VS2019编译的VTK9.0.0 + Qt 5.14.2 环境测试

1. 使用CMake VS2019 编译vtk 9.0.0 时,需要启用支持Qt开关、如下图 如果不会编译的可以参见我的这篇文章: 一、VTK 9.0.0 编译安装步骤 VS2019 CMake3.26.0-CSDN博客 打开Qt5.14.2 ,创建Qt Widget 项目: 构建设置选择 MSVC2017 64bit pro 项目文件加入两行配置: …

链表存数相加算法(leetcode第2题)

题目描述&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外&#xff0c;这…

zabbix监控php-fpm 服务的状态

目录 内容纯手敲&#xff0c;有错误请私信博主 一、zabbix-agent端配置 1.下载php-fpm 2.打开php-fpm的状态页面 3.启动php-fpm 4.安装nginx 5.设置nginx &#xff0c;设置代理php&#xff0c;和php-fpm的状态页面匹配 6重启nginx 7.查询php-fpm的状态页面 8. 根据用户…

Redis--HyperLogLog的指令语法与使用场景举例(UV统计)

文章目录 前言HyperLogLog介绍HyperLogLog指令使用使用场景&#xff1a;UV统计 前言 Redis除了常见的五种数据类型之外&#xff0c;其实还有一些少见的数据结构&#xff0c;如Geo&#xff0c;HyperLogLog等。虽然它们少见&#xff0c;但是作用却不容小觑。本文将介绍HyperLogL…

LeetCode 热题 100 | 双指针(下)

目录 42. 接雨水 1 方法一&#xff1a;我的方法 2 方法二&#xff1a;动态规划 3 方法三&#xff1a;双指针 菜鸟做题第一周&#xff0c;语言是 C 42. 接雨水 1 方法一&#xff1a;我的方法 Warning&#xff1a;这是我的智障做法&#xff0c;请勿模仿 我只能说它教会…

CVE2020-1938漏洞复现

这个漏洞是tomcat的 然后我们先了解漏洞产生的原理 首先我们先来看tmocat纠结是干什么的 tomcat是个中间件 最主要的两个结构、 servlet的定义和部分源码&#xff0c; 漏洞就是从这来的 tomcat处理http请求 源码分析 tomcat 8.5.46 哎 这教学视频讲半天看不懂 不看原…

汽车制动器行业调查:市场将继续呈现稳中向好发展态势

汽车制动器是汽车的制动装置&#xff0c;汽车所用的制动器几乎都是摩擦式的&#xff0c;可分为鼓式和盘式两大类。鼓式制动器摩擦副中的旋转元件为制动鼓&#xff0c;其工作表面为圆柱面;盘式制动器的旋转元件则为旋转的制动盘&#xff0c;以端面为工作表面。 目前市场上主流的…

防火墙部署安全区域

目录 为什么需要安全区域在防火墙上如何来区分不同的网络将接口划分到安全区域安全区域、受信任程度与安全级别安全域间、安全策略与报文流动的方向 安全区域配置案例 为什么需要安全区域 防火墙主要部署在网络边界起到隔离的作用 在防火墙上如何来区分不同的网络 防火墙通过安…

基础算法-整数二分

基础算法-整数二分 基本思想——折半 二分法的基本思想比较简单&#xff0c;是用来在数组当中查找特定元素的算法。 二分可以分为整数二分和浮点二分&#xff0c;本文主要介绍整数二分。 具体步骤 首先&#xff0c;从数组的中间元素开始搜索&#xff0c;如果该元素恰好是目标…

【蓝桥杯EDA设计与开发】资料汇总以及立创EDA及PCB相关技术资料汇总(持续更新)

[18/01/2024]&#xff1a;目前为了准备蓝桥杯做一些资料贴&#xff0c;于是写下这一篇博客。 各种资料均来源于网络以及部分书籍、手册等文档&#xff0c;参考不保证其准确性。 如果在准备蓝桥杯&#xff0c;可与我私信共同学习&#xff01;&#xff01;&#xff01;&#xf…

无尽的石头

题目 import java.util.Scanner;public class Main {public static int func(int res) {int sum 0;while(res!0) {int s res%10;sums;res/10;}return sum;}public static void main(String[] args) {Scanner sc new Scanner(System.in);int t sc.nextInt();sc.nextLine();…