本文汇总了JavaScript中将阿拉伯数字转换为千分位格式(如15,000,000)的多种实现方式。内容涵盖利用reverse和replace的正则方案、基于数组索引的手动拼接逻辑、递归截取法以及针对小数的复杂正则匹配。通过对比不同代码片段,帮助开发者根据具体需求选择最高效或最易维护的数字格式化方案。
JavaScript数字千分位格式化方案
以下是几种在JavaScript中将数字转换为千分位格式的代码示例:
使用字符串反转结合正则替换的方法:`"15000000".split("").reverse().join("").replace(/(\d{3})/g, "$1,").split("").reverse().join("");`
另一种正则写法,利用前瞻断言确保逗号位置:`"115000000".split("").reverse().join("").replace(/(\d{3})(?=[^$])/g, "$1,").split("").reverse().join("");`
基于数组索引的手动拼接实现
接下来是通过手动遍历字符数组来实现的函数代码:
定义函数 `cutStr(str)`:
{
初始化一个新数组,长度原字符串长度加上每三位插入一个逗号的预估数量:`var newStr= new Array(str.length+ parseInt(str.length/3));`
将原字符串最后一个字符赋给新数组的最后一位:`newStr[newStr.length-1]=str[str.length-1];`
设置当前处理原字符串的索引指针:`var currentIndex=str.length-1;`
从新数组末尾向前遍历:`for(var i = newStr.length-1;i >= 0;i--)`
{
判断当前新数组索引与总长度的差值是否为4的倍数(即每隔三位插入逗号):`if((newStr.length-i)%4==0)`
{
如果是,则在该位置插入逗号:`newStr[i]=",";`
}
否则:
{
从原字符串按指针取字符填入新数组,并递减指针:`newStr[i]=str[currentIndex--];`
}
}
最后将新数组拼接为字符串返回:`return newStr.join("")`
}
测试用例定义:`var num="15000000";`
输出结果:`console.log(cutStr(num));`
另一种函数实现方式 `cutStr(str)`:
初始化结果字符串:`var rmb='';`
初始化正向索引计数器:`var i2=0;`
从原字符串末尾向前遍历:`for(var i=str.length-1; i>=0; i--){`
判断当前反向索引是否为3的倍数且不为0(即非最高位):`if(i%3==0&&i!=0){`
如果是,先添加当前字符再添加逗号:`rmb+=str[i2]+',';`
否则:
直接添加当前字符:`rmb+=str[i2];`
}
正向索引递增:`i2++;`
}
返回结果字符串:`return rmb;`
}
调用测试:`console.log(cutStr(num));`
第三种函数定义 `cutStr(num)`:
将数字转为字符串:`var aaa = num.toString();`
拆分为字符数组:`var arr1 = aaa.split("");`
初始化结果数组:`var arr2 = [];`
遍历原字符数组:`for (var i = 0; i < arr1.length;) {`
内部循环处理每三个字符:`for (j = 0; j < 3; j++) {`
将字符插入结果数组头部:`arr2.unshift(arr1[i]);`
原数组索引递增:`i++;`
判断是否处理完一组且还有剩余字符:`if (j == 2 && i < arr1.length) {`
在结果数组头部插入逗号:`arr2.unshift(",");`
}
}
}
调试输出拼接后的字符串:`alert(arr2.join(""));`
}
函数调用示例:`cutStr(12345678);`
正则表达式与递归的高级应用利用正则表达式直接替换的非循环方案:`'1500000000000'.replace(/\B(?=(\d{3})+$)/g,',')`
第四种递归实现函数 `formatNumber(value)`:
确保值为字符串类型:`value = value.toString();`
判断长度是否小于等于3:`if (value.length <= 3) {`
直接返回原值:`return value;`
否则:
递归截取前三位并拼接逗号:`return formatNumber(value.substr(0, value.length - 3)) + ',' + value.substr(value.length - 3);`
}
}
调用测试:`console.log(formatNumber(12345678))`
支持小数点的复杂正则替换:`var str = '123123211312.333123'.replace(/(?=(?!^)(?:\d{3})+(?:\.|$))(\d{3}(\.\d+$)?)/g,',$1');`
输出结果:`console.log(str)`