千位分隔符(js 实现)

最近被同事问到js如何实现给长数字添加千位分隔符,即 1344444 ---> 13,444,444 这是一个很常见的前端面试题。看起来简单,刚开始我都懒得写。
仔细一想,挺考逻辑的,实现方法有很多种,可以用三位循环、字符串数组分隔,也可以使用正则。刚开自己用js实现了堆栈,代码太多,不够优雅,同时也暴露了自己原生js的生疏,事后也看到了同事们各样的实现方法,无非都是循环和字符串分隔,于是决心使用更优雅的正则装逼一下。

仔细思考:
输入:数字(考虑数字是否合法、正负号、小数点)、字符串
输出:考虑到使用场景,最好是字符串

测试用例:-1234567.9012
期待输出:-1,234,567.9012

千位分隔符貌似在《精通正则表达式》中讲环视的时候作为经典范例,然而写出来发现js不支持逆序环视,也就是 (?<=expression) (?<!expression) 这两种是不支持的。

再三考虑和尝试之后得出以下代码,只需一行!完美实现!

// 正则
function thousandBitSeparator(num) {
    return num && num
        .toString()
        .replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) {
            return $1 + ",";
        });
}
console.log(thousandBitSeparator(-1234567.9012));
// -1,234,567.9012
todo

--- update 2015年07月03日 ---

经朋友提醒,当测试用例是1000的时候,此正则不能正确标注千位分隔符,现修改如下:


function thousandBitSeparator(num) {
  return num && (num
    .toString().indexOf('.') != -1 ? num.toString().replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) {
      return $1 + ",";
    }) : num.toString().replace(/(\d)(?=(\d{3}))/g, function($0, $1) {
      return $1 + ",";
    }));
}
console.log(thousandBitSeparator(1000));
//1,000

转载于:https://www.cnblogs.com/freeyiyi1993/p/4603525.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值