/**
* 格式化金額
*
* @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'
。 - 字首和字尾: 可以新增字首和字尾,例如貨幣符號。
這個函式更加健壯和靈活,能夠滿足各種格式化金額的需求。 希望這個改進後的版本對您更有幫助!