js怎么用递归的方式实现每隔3个数字加一个逗号?

如234234变成234,234.求递归实现,代码越少越好。

阅读 6.2k
9 个回答

有个超级简单的方法234234..toLocaleString()

估计你想实现数字的分位显示, "12345"这个想要显示为"12,345", 而不是"123,45", 有的人领会错了。
有的人给的解决方案,对于 "123456"这个数字会输出为",123,456",明显多了一个逗号,我的方法不会有这个问题。

1L的回答(使用 NumberObject.toLocaleString(),把数字转换为字符串,使用本地数字格式顺序。)可以解决问题,但是不推荐,因为它取决于你本地的偏好设置,不同人运行结果可能不一样。

非递归方式实现

也支持带小数点的!

"12345".split('.').map(function(val, index){ return index == 1 ? val: val.split('').reverse().join('').replace(/(\d{3})\B/g,'$1,').split('').reverse().join('')}).join('.');  //输出 12,345

"123456789".split('.').map(function(val, index){ return index == 1 ? val: val.split('').reverse().join('').replace(/(\d{3})\B/g,'$1,').split('').reverse().join('')}).join('.'); //输出 123,456,789

"1234567.8900".split('.').map(function(val, index){ return index == 1 ? val: val.split('').reverse().join('').replace(/(\d{3})\B/g,'$1,').split('').reverse().join('')}).join('.'); //输出 1,234,567.8900

递归方式实现

本问题要求用递归方式实现,所以解答也提供了递归方式实现。

//只处理整数
function addComma(str, currentIndex, result) {
    if (currentIndex === undefined) {
        currentIndex = str.length - 1;
    }
    if (result === undefined) {
        result = '';
    }
    if (currentIndex < 0) {
        return result;
    }
    result = str.charAt(currentIndex) + result;
    if ((str.length - currentIndex) % 3 == 0 && currentIndex != 0) {
        result = "," + result;
    }
    return addComma(str, currentIndex - 1, result);
}

var n = '123456';
var output = addComma(n);  
console.log(output);    //输出123,456

//带小数的处理示例
var n = '123456.78';
var output = addComma(n.split('.')[0]) + '.' + n.split('.')[1];
console.log(output);   // 输出 123,456.78
(234234+"").replace(/\B(?=(\d{3})+(?!\d))/g, ",")

前几天有人提过这个问题 https://segmentfault.com/q/10...
不过上面的方法不适用于带小数点的,鉴于js不支持反向预查,对于带小数点用另外一套正则吧

(234234.23132+"").replace(/\B(?=(\d{3})+(?=\.))/g, ",")

还有递归是什么鬼,这个不需要用递归吧

楼上的比较好

function get(num) {
    num = num.split('').reverse().join('')
    return num.match(/\d{1,3}/g).join(',').split('').reverse().join('')
}
function addComma(str) {
    if(str.length <= 3) {
        return str;
    }
    var res = str.split("");
    var resStr = res.splice(0, 3);
    return resStr.join("") + "," + addComma(res.join(""));
}
'2342342323'.match(/\d{1,3}/g).join(',') // -> 234,234,232,3

最短的代码来了, 看看还有没有更短的。

从左到右

function myFunc(str) {
    return str.split('').reverse().join('').replace(/\B(?=(?:\d{3})+\b)/g, ',').split('').reverse().join('')
}

从右到左

function myFunc(str) {
    return str.replace(/\B(?=(?:\d{3})+\b)/g, ',')
}
    comdify : function (n){
      var re=/\d{1,3}(?=(\d{3})+$)/g;
      var n1 = String(n).replace(/^(\d+)((\.\d+)?)$/,function(s,s1,s2){return s1.replace(re,"$&,")+s2;});
      return n1;
    }
'12312121213.123123'.replace(/(\B)(?=(?:\d{3})+[\.|$])/g, ",")

==>

'12,312,121,213.123123'
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题