JS數(shù)值千分位格式化

簡述

日常開發(fā)中帅韧,經(jīng)常有數(shù)值格式化的需求,其中啃勉,最常見的場景之一忽舟,就是千分位化。

本文從講解兩種實(shí)現(xiàn)方案淮阐,僅供參考叮阅!

常規(guī)方法

function getAddStr (str, num) {
  var i, tmp = "";
  for (i = 0; i< num; i++) {
    tmp += str;
  }
  return tmp;
}
function commafy (num, index, separator, rententionNum) {
  if (num === '--') {return '--';}
  if (!index) {index = 3;}
  if (!separator) {separator = ',';}
  if (!rententionNum) {rententionNum = 2;}
  num = num.toFixed(rententionNum);
  var _this = this;
  var reg = new RegExp('(-?[0-9]+)([0-9]{' + index + '})');
  if (/^.*\..*$/.test(num)) {
    var pointIndex = num.lastIndexOf('.');
    var intPart = num.substring(0, pointIndex);
    var pointPart = num.substring(pointIndex + 1, num.length);
    var pointLen = pointPart.length;
    if (pointLen >= 1) {pointPart = pointPart + getAddStr("0", rententionNum - pointLen);}
    intPart = intPart + '';
    while(reg.test(intPart)) {
      intPart = intPart.replace(reg, '$1' + separator + '$2');
    }
    num = intPart + '.' + pointPart;
  } else {
    while (reg.test(num)) {
      num = num.replace(reg, '$1' + separator + '$2');
    }
    num = num + '.' + _this.getAddStr("0", rententionNum);
  }
  return num;
}
console.log(commafy(123456, 3, ',', 0)); // 123,456.00

commafy方法接收四個(gè)參數(shù) num、index泣特、 separator浩姥、 rententionNum,num為待格式化的數(shù)值状您,index格式化字符出現(xiàn)的位置(千分位格式化勒叠,默認(rèn)為3兜挨,表示每隔三位顯示一個(gè)格式化字符),separator格式化字符(默認(rèn)為“,”)眯分,rententionNum小數(shù)點(diǎn)個(gè)數(shù)(默認(rèn)為2)拌汇。除了num,其他值都是可選的颗搂。

自定義模式實(shí)現(xiàn)

function numberFormat (number, fmt) {
  var fmtSplit = fmt.split('.'),
      number = Number(number),
      numberString = '',
      min,
      max;
  if (isNaN(number)) return number;
  // 判斷負(fù)數(shù)
  if (number < 0) {
    var isNegative = true;
  }
  // 如果有%號担猛,做百分比轉(zhuǎn)換
  if (/\%/.test(fmt)) {
      number *= 100;
      }
  // 小數(shù)部分
  if (fmtSplit.length > 1) {
    min = /0+/.exec(fmtSplit[1]);
    max = /#+/.exec(fmtSplit[1]);
    min = min == null ? 0 : min[0].length;
    max = max == null ? 0 : max[0].length;
    
    number = number.toFixed(max + min);
    for(var i = 0; i< max; i++) {
      if (number.slice(-1) !== '0') break;
      number = number.slice(0, -1);
    }
  } else {
    number = number.toFixed(0);
  }
  // 整數(shù)部分
  var numberSplit = number.replace('-', '').split('.');
  min = /[0]+/.exec(fmtSplit[0].replace(',',''));
  min = min == null ? 0 : min[0].length;
  while(numberSplit[0].length < min ) {
    numberSplit[0] = '0' + numberSplit[0];
  }
  // 加千分位
  if (fmtSplit[0].lastIndexOf(',') !== -1) {
    var groupby = fmtSplit[0].slice(fmtSplit[0].lastIndexOf(','));
    groupby = /[0#]+/.exec(groupby);
    if (groupby != null) {
      var reg = new RegExp('(-?[0-9]+)([0-9]{' + groupby[0].length + '})');
      while (reg.test(numberSplit[0])){
        numberSplit[0] = numberSplit[0].replace(reg, '$1,$2');
      }
    }
  }
  numberString = (isNegative ? '-' : '') + (numberSplit.length > 1 ? numberSplit.join('.') : numberSplit[0]);
  return fmt.replace(/[0#\-\,\.]+/, numberString);
}
console.log(numberFormat(123456, '#,##0.00')); // 123,456.00

如上代碼,numberFormat接收兩個(gè)參數(shù)丢氢,num跟fmt傅联,num為待格式化的數(shù)值,fmt為格式化模式字符串疚察,包含#跟0兩個(gè)字符蒸走。

'#,##0.00' 表示 小數(shù)點(diǎn)后是“00”,個(gè)位是‘0’貌嫡,十位是‘#’比驻,百位是‘#’,千位是‘#’岛抄。

其中别惦,“#”表示待格式化的數(shù)值,在該位上夫椭,沒有值掸掸,則不顯示該位。又或者待格式化數(shù)值該位為0且為最高位上的數(shù)值蹭秋,也不顯示該值扰付。舉例:如果用'#,##0'格式化1000,結(jié)果為1,000仁讨;同樣的羽莺,格式化010,則結(jié)果是10(010百位的0不顯示)洞豁。

‘0’表示待格式化的數(shù)字盐固,在該位上,如果值則用0表示丈挟。'#,##0.00'格式化100時(shí)刁卜,結(jié)果是100.00。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末礁哄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子溪北,更是在濱河造成了極大的恐慌桐绒,老刑警劉巖夺脾,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茉继,居然都是意外死亡咧叭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門烁竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菲茬,“玉大人,你說我怎么就攤上這事派撕⊥竦” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵终吼,是天一觀的道長镀赌。 經(jīng)常有香客問我,道長际跪,這世上最難降的妖魔是什么商佛? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮姆打,結(jié)果婚禮上良姆,老公的妹妹穿的比我還像新娘。我一直安慰自己幔戏,他們只是感情好玛追,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著评抚,像睡著了一般豹缀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慨代,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天邢笙,我揣著相機(jī)與錄音,去河邊找鬼侍匙。 笑死氮惯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的想暗。 我是一名探鬼主播妇汗,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼说莫!你這毒婦竟也來了杨箭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤储狭,失蹤者是張志新(化名)和其女友劉穎互婿,沒想到半個(gè)月后捣郊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慈参,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年呛牲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驮配。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娘扩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壮锻,到底是詐尸還是另有隱情琐旁,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布躯保,位于F島的核電站旋膳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏途事。R本人自食惡果不足惜验懊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尸变。 院中可真熱鬧义图,春花似錦、人聲如沸召烂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奏夫。三九已至怕篷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酗昼,已是汗流浹背廊谓。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麻削,地道東北人蒸痹。 一個(gè)月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像呛哟,于是被迫代替她去往敵國和親叠荠。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容