千分位分割方法

262 阅读1分钟

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"
#结束