function thousandth(n){
if(n.toLocaleString()){
return n.toLocaleString()
}else{
n = n + '';
return n.replace(/(\d)(?=(\d{3})+(\.\d+)?$)/g,'$1,')
}
}
1、toLocaleString // 这是一个比较全面的函数 具体用法可以参考想偷懒的话,toLocaleString 了解一下?
2、这里重点分享一下这个正则的写法
(1)我们怎么去正确的匹配到正常的断点处,最开始我的想法是最右向左,3位一断,
类似于 '12324335345454'.replace(/(\d{3})/g,'$1,'),
但是这种得到的是【"123,243,353,454,54"】,那么我就想先把字段穿倒过来,然后再用前边的这个正则处理。
但是这个思路实现起来比较繁琐,主要原因在于字符串的颠倒;
那么这个思路就先pass了;
(2)理想中的方法就是用一个正则可以直接完成想要的结果,
我们再来分析千分符的特点,
正确的千分符都是加在了后边的数字三个一组,
正则匹配的方向是从左到右,一个字符一个字符的去匹配,
假如这个字符是"1224",那么正确的就是"1,224",“1”这个点就比较关键了
"12345"--->"12,345",“2”这个点比较关键
"1234567"--->"1,234,567",“1” “4” 这两个点比较关键
所以我们要去匹配这种字符
正则 --- /(\d)/
这种字符后边的数字定然是三位一组
正则 --- /(\d)(\d{3})/
'1234567'.replace(/(\d)(\d{3})/,"$1,") -->"1,567"
后边的数字没了 因为我们这匹配并捕获了了后边一组三数字
但是用''替换掉了
'1234567'.replace(/(\d)(\d{3})+/,"$1,") -->"1,"
所以我们要用到非捕获匹配
"123456".replace(/(\d)(?=(\d{3})+)/,"$1,") -->"1,23456"
这显然不是我们要的 为什么呢?因为234 满足 \d{3}所以他加了",",
而我们想要的是每一组都是三个 而不是只有一个
"123456".replace(/(\d)(?=(\d{3})+$)/,"$1,") --> "123,456"
"1234567".replace(/(\d)(?=(\d{3})+$)/,"$1,") --> "1,234567"
为什么下边的这个只匹配了一个呢 因为我们没有加上全部匹配
"1234567".replace(/(\d)(?=(\d{3})+$)/g,"$1,") --> "1,234,567"
至此,我们把整数的千分位加上了,要是有小数怎么办呢
我们再在正则里边去添加新的匹配去匹配小数点及其后边的数字
"1234567.2332".replace(/(\d)(?=(\d{3})+(\.\d+)$)/g,"$1,") --> "1,234,567.2332"
#结束