千位分隔符(js 實現)

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

todo

--- 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
相關文章
相關標籤/搜索