写一个格式化金额的方法

/**
 * 格式化金额
 *
 * @param {number | string} number 要格式化的数字
 * @param {number} [decimals=2] 保留的小数位数,默认为 2
 * @param {string} [decPoint='.'] 小数点符号,默认为 '.'
 * @param {string} [thousandsSep=','] 千分位分隔符,默认为 ','
 * @param {string} [prefix=''] 前缀,默认为空字符串
 * @param {string} [suffix=''] 后缀,默认为空字符串
 * @returns {string} 格式化后的金额字符串
 */
function formatMoney(number, decimals = 2, decPoint = '.', thousandsSep = ',', prefix = '', suffix = '') {
  number = (number + '').replace(/[^0-9+-Ee.]/g, '');
  let n = !isFinite(+number) ? 0 : +number;
  let prec = !isFinite(+decimals) ? 2 : Math.abs(decimals);
  let s = '';
  let toFixedFix = function (n, prec) {
    let k = Math.pow(10, prec);
    return '' + Math.ceil(n * k) / k;
  };
  s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
  let re = /(-?\d+)(\d{3})/;
  while (re.test(s[0])) {
    s[0] = s[0].replace(re, '$1' + thousandsSep + '$2');
  }
  if ((s[1] || '').length < prec) {
    s[1] = s[1] || '';
    s[1] += new Array(prec - s[1].length + 1).join('0');
  }
  return prefix + s.join(decPoint) + suffix;
}


// 使用示例:
console.log(formatMoney(1234.56)); // 输出:1,234.56
console.log(formatMoney(1234.5678, 3)); // 输出:1,234.568
console.log(formatMoney(1234.56, 0)); // 输出:1,234
console.log(formatMoney(1234, 2, ',', '.')); // 输出:1.234,00
console.log(formatMoney(1234.56, 2, '.', ',')); // 输出:1,234.56
console.log(formatMoney(-1234.56)); // 输出:-1,234.56
console.log(formatMoney(0.56)); // 输出:0.56
console.log(formatMoney('1234.56abc')); // 输出:1,234.56
console.log(formatMoney('abc')); // 输出:0.00
console.log(formatMoney(123456789.123456789)); // 输出: 123,456,789.12
console.log(formatMoney(1234.56, 2, '.', ',', '¥')); // 输出:¥1,234.56
console.log(formatMoney(1234.56, 2, '.', ',', '', ' 元')); // 输出:1,234.56 元


这个函数考虑了多种情况,包括:

  • 负数处理: 正确处理负数,例如 -1234.56
  • 小数位数控制: 可以通过 decimals 参数控制小数位数。
  • 自定义分隔符: 可以自定义小数点和千分位分隔符。
  • 非法输入: 可以处理非数字类型的输入,例如 '1234.56abc''abc'
  • 前缀和后缀: 可以添加前缀和后缀,例如货币符号。

这个函数更加健壮和灵活,能够满足各种格式化金额的需求。 希望这个改进后的版本对您更有帮助!

posted @   王铁柱6  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示