继上一篇利用正则方法
题目分析
- 在界面中让用户输入一位数
- 判断用户输入的是否是一个数,如果不是请用户重新输入,直到输入成功为止
- 让用户在界面中输入他想要把这个小数保留的位数
- 判断用户输入的保留小数是否合法,如果不是请用户重新输入,直到输入成功为止
前面几步一样,还有一些别的办法,这里由于想演示正则用法,所以不做过多尝试 - 利用正则验证小数点后的部分,判断是否需要保留的位数是否大于这个数本身的小数长度,这里又分为两种情况
- 如果需要保留的位数大于等于这个数本身的小数长度,则需要补位
- 如果需要保留的位数大于这个数本身的小数长度,则需要四舍五入,在具体的用方法解决正则
需求实现
需求一
在界面中让用户输入一个数
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)的输出结果可以自己再控制台输出看看输出结果