JS中将数字转化为K、M、B显示。格式化数字

要将数字转换为千(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() 会影响精度。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值