js操作数字字符串-格式化为数字

文章讨论了JavaScript中parseFloat函数在处理大数字和精度问题时的不足,并提供了一个自定义的handleNumber函数来格式化数字字符串,包括去除前导零,处理小数点后的零。此外,还提到了避免精度问题的其他策略,如使用数字输入框和在后端处理数学运算。

最开始的时候,使用的是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,会被打的。

后续有时间,再用正则表达实现。

尽量从源头来控制输入了,若是数字的话,推荐使用数字输入框;

若数值过大,推荐将单位扩大,例如:将单位“元”更改为“万元”。

除必要情况,数值的加减乘除尽量都交给后端处理。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值