最近被同事问到js
如何实现给长数字添加千位分隔符,即 1344444 ---> 13,444,444 这是一个很常见的前端面试题。看起来简单,刚开始我都懒得写。
仔细一想,挺考逻辑的,实现方法有不少种,能够用三位循环、字符串数组分隔,也能够使用正则。刚开本身用js实现了堆栈,代码太多,不够优雅,同时也暴露了本身原生js的生疏,过后也看到了同事们各样的实现方法,无非都是循环和字符串分隔,因而决心使用更优雅的正则装逼一下。javascript
仔细思考:
输入:数字(考虑数字是否合法、正负号、小数点)、字符串
输出:考虑到使用场景,最好是字符串html
测试用例:-1234567.9012
期待输出:-1,234,567.9012前端
千位分隔符貌似在《精通正则表达式》中讲环视的时候做为经典范例,然而写出来发现js不支持逆序环视,也就是 (?<=expression) (?<!expression) 这两种是不支持的。java
再三考虑和尝试以后得出如下代码,只需一行!完美实现!面试
// 正则 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
--- update 2015年07月03日 ---正则表达式
经朋友提醒,当测试用例是1000的时候,此正则不能正确标注千位分隔符,现修改以下:express
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