最开始的时候,使用的是parseFloat将字符串格式化,也很有用。
var str = '0012345600';
console.log(parseFloat(str)); // 输出:12345600
var str1 = '00123.45600';
console.log(parseFloat(str1)); // 输出:123.456
但是,parseFloat有一个缺陷,就是当字符串过长的时候,会丢失精度,这很让人苦恼。
var str = '12345678901234567890';
console.log(parseFloat(str)); // 输出:12345678901234567000
var str1 = '1234567890123.456789';
console.log(parseFloat(str1)); // 输出:1234567890123.4568
那么就不能用它,只能自定义格式化方法,本人很笨,目前只实现了,操作字符串实现格式化,方法如下。
function handleNumber(numberStr) {
numberStr = String(numberStr);
// 去掉前面所有的0
while( numberStr.charAt(0) == '0' )
{
numberStr = numberStr.substring(1,numberStr.length);
}
var x = String(numberStr).indexOf(".")+1;// 得到小数点的位置,x=0说明没有小数点
var y = String(numberStr).length - x; // 小数点后的数字个数
if(x !== 0){
if(y == 0){// 小数点在最后一位,删除最后一位
numberStr=numberStr.substring(0,numberStr.length-1)
} else {
// 小数点在第一位,前面补0
if(x == 1){
numberStr = "0" + numberStr;
}
// 去掉后面多余的0,例如”1.100“
for(var i=numberStr.length-1;i>0;i--){
if(numberStr.charAt(i) == "0"){
numberStr=numberStr.substring(0,numberStr.length-1);
}else if(numberStr.charAt(i) == "."){
numberStr=numberStr.substring(0,numberStr.length-1);
break;
} else {
break;
}
}
}
}
return numberStr;
}
上面的方法会将一切数字格式化:
- 00123,00123.00 ,123. => 123
- 0012300 => 12300
- 00.12300,.123 = > 0.123
我之前在做去除数字前面的0的时候,绕晕了。因为对于00123、001.123和00.123来说,前面两个需要去掉2个0,而最后一个只需要去掉1个0,这个需要做一个判断。
绕晕到什么程度呢?看到0都想去,当时看到0012300格式化之后,变成12300之后,我还质疑为啥没有把后面2个0去掉。
后面我突然发现我可以都先去掉,那么当第一位是小数点的,再把0加上。
小数去掉后面的0的时候要注意:倒序遍历
- 当前字符为0的时候,截取之后正常循环
- 当前字符为小数点的时候,截取之后要跳出循环,不然你就会把200.00截成2,会被打的。
后续有时间,再用正则表达实现。
尽量从源头来控制输入了,若是数字的话,推荐使用数字输入框;
若数值过大,推荐将单位扩大,例如:将单位“元”更改为“万元”。
除必要情况,数值的加减乘除尽量都交给后端处理。
文章讨论了JavaScript中parseFloat函数在处理大数字和精度问题时的不足,并提供了一个自定义的handleNumber函数来格式化数字字符串,包括去除前导零,处理小数点后的零。此外,还提到了避免精度问题的其他策略,如使用数字输入框和在后端处理数学运算。
1344

被折叠的 条评论
为什么被折叠?



