转千分位出现-,情况怎么处理?

function format1000(s){
    var sfmt=s.toString() || '';
    if (sfmt.length>=4){
        var p0=sfmt.indexOf('.');
        if (p0<0) p0=sfmt.length;
        var m=p0-1;
        var s0=''
        while(1){
            if (m>1){
                s0=sfmt.substr(m-2,3)+(s0==''? '' : ','+s0);
                m=m-3;
            } else {
                if (m>=0) s0=sfmt.substr(0,m+1)+(s0=='' ? '' : ','+s0);
                break
            }
        }
        sfmt=s0+sfmt.substr(p0);
    }
    console.log(sfmt)
    return sfmt;
}
format1000('-397156408278.551') //-,397,156,408,278.551
// format1000('-397') //-,397
//format1000('-1352934161526990000')//-1,352,934,161,526,990,000

大佬们这个转千分位的代码 会出现 - 的情况,怎么处理?

阅读 2.4k
4 个回答

else 里加个判断即可

} else {
  if (m == 0 && sfmt[0] == '-') s0 = '-' + s0;
  else if (m>=0) ...
  break
}

另外给个正则做法

function format1000(s) {
  if (typeof s == 'number') return s.toLocaleString('en-US');
  return String(s).replace(/\d+/, m => m.replace(/\B(?=(?:\d{3})+$)/g, ','));
}

从左到右遍历,分割到数组再 join 的做法

function format1000(s) {
  if (typeof s == 'number') return s.toLocaleString('en-US');
  s = String(s);
  let i = 0, j = 0, end = s.indexOf('.');
  if (s[0] == '-') ++i;
  if (end < 0) end = s.length;
  const sub = [];
  for (i += (end - i - 1) % 3 + 1; i < end; j = i, i += 3)
    sub.push(s.slice(j, i));
  sub.push(s.slice(j));
  return sub.join();
}

测试用例

[
  -135293416152699,
  '1',
  '11',
  '111',
  '1111',
  '-1',
  '-11',
  '-111',
  '-1111',
  '1.0',
  '-1.0',
  '111.11111111',
  '-111.11111111',
  '-397',
  '-1352934161526990000',
  '-397156408278.551',
].forEach(v => console.log(format1000(v)));
let resulePrice = '-397156408278.551';
resulePrice =  resulePrice.replace(/\B(?=(\d{3})+(?!\d))/g, ',').replace(/\./g, ','); 
console.error(resulePrice) // -397,156,408,278,551

位数不是特别大的话
(397156408278).toLocaleString('en-US');

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题