JS-如何将用户输入的一个数四舍五入保留相应位数的小数同时保证这个数是数字类型②正则

继上一篇利用正则方法

题目分析

  1. 在界面中让用户输入一位数
  2. 判断用户输入的是否是一个数,如果不是请用户重新输入,直到输入成功为止
  3. 让用户在界面中输入他想要把这个小数保留的位数
  4. 判断用户输入的保留小数是否合法,如果不是请用户重新输入,直到输入成功为止
    前面几步一样,还有一些别的办法,这里由于想演示正则用法,所以不做过多尝试
  5. 利用正则验证小数点后的部分,判断是否需要保留的位数是否大于这个数本身的小数长度,这里又分为两种情况
  • 如果需要保留的位数大于等于这个数本身的小数长度,则需要补位
  • 如果需要保留的位数大于这个数本身的小数长度,则需要四舍五入,在具体的用方法解决正则

需求实现

需求一

在界面中让用户输入一个数

	var num = +prompt('请输入你要查询的数字')

这里让用户随机输入一位数,+可以将他强转为数据类型

需求二

判断用户输入的是否是一个数,如果不是请用户重新输入,直到输入成功为止

	 while (isNaN(num)) {
             alert('输入错误,请重新输入')
             num = +prompt('请输入你要查询的数字');
         }

这里用while的原因是不知道用户输错多少次,isNaN(num)是为了判断他是否是一个数字类型;

需求三

让用户在界面中输入他想要把这个小数保留的位数

	var smallNum = +prompt('请输入你要保留的小数位数')

这里让用户输入他想要把这个小数保留的位数,+可以将他强转为数据类型

需求四

判断用户输入的保留小数是否合法,如果不是请用户重新输入,直到输入成功为止
这里可能出现三种情况会错误

  • 输入的不是一个数字
  • 输入的不是正数
  • 输入的不是整数
 	while (isNaN(smallNum) || smallNum< 0 || (smallNum % 1 != 0)) {
             alert('小数位位数必须在0-100之间,您输入的数据不再范围中...')
             smallNum = +prompt('请重新输入你要保留的小数位数')
         }

这里用或者是因为在逻辑或中,返回第一个为真的表达式,第一个不满足的情况下可以继续看第二个;这里不满足任何一个都不行

需求五

利用正则验证小数点后的部分,判断是否需要保留的位数是否大于这个数本身的小数长度,这里又分为两种情况

  • 如果需要保留的位数大于等于这个数本身的小数长度,则需要补位,这里为了方便直接用toFixed()直接补位;
  • 如果需要保留的位数大于这个数本身的小数长度,则需要四舍五入,在具体的用方法解决正则。
    这里为了方便理解直接将每一部的解析写进代码中
		 //  复制数字变成字符串判断
         var copyNum = '' + num;
         //  获取小数应该保留位数的最后一位
         //  正则分组分别获取整数部分,需要保留的小数位数的部分,小数需要保留位数后一位
         // \-?\d+  整数部分 \-? 有些数字可能是负数,?代表可有可无最多出现一次  \d数字类型 加上+是因为整数部分不知道有几位,		但是至少有一位,+代表可有可无
         var reg = new RegExp("(\\-?\\d+)\\.(\\d{" + smallNum + "})(\\d?)")
             //  exec()方法在字符串中找到符合reg要求的关键字,如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null
         var res = reg.exec(copyNum)
             //  看一下res每一项是什么
             //  console.log(res)
             //  这里假设num=2020.3658,smallNum=3
             // res= ["2020.3658", "2020", "365", "8", index: 0, input: "2020.3658", groups: undefined]
             // 如果没找到返回null,则代表后面小数位数不够,直接补小数位
         if (res == null) {
             //  如果不够补小数位
             console.log(num.toFixed(smallNum))
         } else {
             //  这里判断要保留小数位+1位的小数值是否大于5,如果大于五进一
             if (res[3] >= 5) {
                 //  这里用加号是因为上面取出来的是字符串
                 res[2] = +res[2] + 1
             }
             //  拼接上面的正则结果
             //  res[1]  为num的整数部分
             //   res[2] 为num要保留小数部分的数(这里已经经过判断)
             var num1 = res[1] + '.' + res[2];
             //  转为数字类型
             console.log(+num1)
         }

var reg = new RegExp("(\-?\d+)\.(\d{" + smallNum + “})(\d?)”)这里使用 new RegExp是为了拼接将smallNum传进来,在写进函数封装时可以重复利用,这里只是为了分析,这一步省略
在这里如果不懂reg.exec(copyNum)的输出结果可以自己再控制台输出看看输出结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值