寫一個格式化金額的方法

王铁柱6發表於2024-11-23
/**
 * 格式化金額
 *
 * @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'
  • 字首和字尾: 可以新增字首和字尾,例如貨幣符號。

這個函式更加健壯和靈活,能夠滿足各種格式化金額的需求。 希望這個改進後的版本對您更有幫助!

相關文章