最近被同事問到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