要将数字转换为千(K)或万(W)的显示形式,可以封装以下函数来实现:
/**
* @description 格式化数字
* @param num {Number} 需要格式化的数字
* @param lang {String} 中-万 英-K/W
* @return {String}
*
* @example
* formatNumber(10000,CN) => 1万
* formatNumber(1000,EN) => 1K
* formatNumber(1234.56 ,EN) => 1.23K
* formatNumber(10000,EN) => 1W
*/
export function formatNumber(num, lang = "EN") {
// 异常处理:检查 lang和num 参数
if (lang !== "CN" && lang !== "EN") {
throw new Error("Unsupported language code. Supported languages are 'CN' and 'EN'.");
}
if (typeof num !== 'number') {
throw new Error("The 'num' parameter must be a number.");
}
// 负数处理
const isNegative = num < 0;
let formattedNum = Math.abs(num);
// 语言处理逻辑分离
if (lang === "CN") {
formattedNum = formatChineseNumber(formattedNum);
} else if (lang === "EN") {
formattedNum = formatEnglishNumber(formattedNum);
}
// 如果是负数,在数字前加上负号
return isNegative ? `-${formattedNum}` : formattedNum;
}
function formatChineseNumber(num) {
if (num >= 10000) {
return Math.floor((num / 10000) * 100) / 100 + "万";
} else {
return Math.floor(num).toString();
}
}
function formatEnglishNumber(num) {
if (num >= 1000000000) {
return Math.floor((num / 1000000000) * 100) / 100 + 'B';
} else if (num >= 1000000) {
return Math.floor((num / 1000000) * 100) / 100 + 'M';
} else if (num >= 1000) {
return Math.floor((num / 1000) * 100) / 100 + 'K';
} else {
return Math.floor(num).toString();
}
}
注意:此函数中保留了两位小数(不会自动补0)。如果有其他需求,可以自行修改。
此外,在保留两位小数的实现方法上,有很多人会使用 toFixed() 。这里说一下我为什么不用toFixed()。因为 toFixed() 内部会进行四舍五入,且不是标准的四舍五入,实际上使用的是舍入到最近的偶数(银行家舍入)策略。
所以 toFixed() 会影响精度。