写一个格式化金额的方法
/**
* 格式化金额
*
* @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'
。 - 前缀和后缀: 可以添加前缀和后缀,例如货币符号。
这个函数更加健壮和灵活,能够满足各种格式化金额的需求。 希望这个改进后的版本对您更有帮助!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了