【JavaScript】数字处理工具(格式化数字、金额和百分比)


 本文将介绍几个实用的JavaScript函数,用于格式化数字、货币和百分比。这些函数可以帮助你在处理数据时,轻松实现数字的标准化展示,增加可读性。

数字格式化

功能描述

formatNumber函数用于将数字或数字字符串格式化为指定精度的字符串形式。它支持设置是否使用千位分隔符、是否省略小数点后的零以及指定小数点后的精度。

参数说明

  • num: 需要格式化的数字或数字字符串。
  • precision: 小数点后的精度,默认为2。
  • omitTrailingZeros: 是否省略小数点后的零,默认为false
  • useThousandSeparator: 是否使用千位分隔符,默认为true

代码实现

/**
 * 格式化数字,支持千位分隔符、指定精度、去除末尾无效零
 * @param {number|string} num - 要格式化的数字
 * @param {number} precision - 小数点后保留的位数,默认为2
 * @param {boolean} omitTrailingZeros - 是否去除末尾的无效零,默认为false
 * @param {boolean} useThousandSeparator - 是否使用千位分隔符,默认为true
 * @returns {string} 格式化后的数字字符串
 */
const formatNumber = (num: number | string, precision = 2, omitTrailingZeros = false, useThousandSeparator = true): string => {
  num = convertToNumber(num);
  if (isNaN(num)) return "-";
  let numStr = num.toFixed(precision);
  if (useThousandSeparator) {
    numStr = formatWithThousandsSeparator(numStr);
  }
  if (omitTrailingZeros) {
    numStr = numStr.replace(/(\.\d*?[1-9])0+$|\.0*$/, "$1");
  }
  return numStr;
};

货币格式化函数

功能描述

formatCurrency函数用于将数字或数字字符串格式化为货币形式。它支持指定货币单位,并能根据数字的大小自动添加“亿”或“万”的单位。

参数说明

  • num: 需要格式化的数字或数字字符串。
  • unit: 货币单位,默认为“元”。

代码实现

/**
 * 格式化货币,自动转换为“万”或“亿”单位
 * @param {number|string} num - 要格式化的数字
 * @param {string} unit - 货币单位,默认为“元”
 * @returns {string} 格式化后的货币字符串
 */
const formatCurrency = (num: number | string, unit = "元"): string => {
  num = convertToNumber(num);
  if (isNaN(num)) return "-";
  let amount = "";
  if (Math.abs(num) >= 1000000000.0) {
    num /= 100000000.0;
    amount = "亿";
  } else if (Math.abs(num) >= 100000.0) {
    num /= 10000.0;
    amount = "万";
  }
  return formatWithThousandsSeparator(num.toFixed(2)) + " " + amount + unit;
};

百分比格式化

功能描述

formatPercent函数用于将数字或数字字符串格式化为百分比形式。

参数说明

  • num: 需要格式化的数字或数字字符串。
  • precision : 小数点后保留的位数,默认为2。

代码实现

/**
 * 格式化百分比,将数字转换为百分比形式
 * @param {number|string} num - 要格式化的数字
 * @param {number} precision - 小数点后保留的位数,默认为2
 * @returns {string} 格式化后的百分比字符串
 */
const formatPercent = (num: number | string, precision = 2): string => {
  num = convertToNumber(num);
  if (isNaN(num)) return "-";
  return (num * 100).toFixed(precision) + "%";
};

辅助函数

数字转换函数

用于将任意类型转换为数字类型。

/**
 * 将输入转换为数字,如果不是数字或字符串则返回NaN
 * @param {any} num - 输入值
 * @returns {number} 转换后的数字
 */
function convertToNumber(num: any): number {
  if (typeof num === "number") {
    return num;
  } else if (typeof num === "string") {
    return parseFloat(num);
  }
  return NaN;
}

千位分隔函数

用于给数字添加千位分隔符。

/**
 * 添加千位分隔符到数字字符串
 * @param {number|string} num - 数字或数字字符串
 * @returns {string} 添加分隔符后的字符串
 */
function formatWithThousandsSeparator(num: number | string): string {
  const n = typeof num === "number" ? num.toString() : num;
  if (isNaN(Number(n))) return "-";
  const [integer, decimal] = n.split(".");
  const reg = /\d{1,3}(?=(\d{3})+$)/g;
  const n1 = integer.replace(reg, "$&,");
  return decimal ? `${n1}.${decimal}` : n1;
}

使用示例

console.log(formatNumber(1234567.8910)); // "1,234,567.89"

console.log(formatNumber(1234567.8910, 4, true)); // "1,234,567.891"

console.log(formatCurrency(1234567890.1234)); // "12.35亿元"

console.log(formatPercent(0.1234)); // "12.34%"

完整代码

numberUtils.ts

/**
 * 格式化数字,支持千位分隔符、指定精度、去除末尾无效零
 * @param {number|string} num - 要格式化的数字
 * @param {number} precision - 小数点后保留的位数,默认为2
 * @param {boolean} omitTrailingZeros - 是否去除末尾的无效零,默认为false
 * @param {boolean} useThousandSeparator - 是否使用千位分隔符,默认为true
 * @returns {string} 格式化后的数字字符串
 */
const formatNumber = (num: number | string, precision = 2, omitTrailingZeros = false, useThousandSeparator = true): string => {
  num = convertToNumber(num);
  if (isNaN(num)) return "-";
  let numStr = num.toFixed(precision);
  if (useThousandSeparator) {
    numStr = formatWithThousandsSeparator(numStr);
  }
  if (omitTrailingZeros) {
    numStr = numStr.replace(/(\.\d*?[1-9])0+$|\.0*$/, "$1");
  }
  return numStr;
};

/**
 * 格式化货币,自动转换为“万”或“亿”单位
 * @param {number|string} num - 要格式化的数字
 * @param {string} unit - 货币单位,默认为“元”
 * @returns {string} 格式化后的货币字符串
 */
const formatCurrency = (num: number | string, unit = "元"): string => {
  num = convertToNumber(num);
  if (isNaN(num)) return "-";
  let amount = "";
  if (Math.abs(num) >= 1000000000.0) {
    num /= 100000000.0;
    amount = "亿";
  } else if (Math.abs(num) >= 100000.0) {
    num /= 10000.0;
    amount = "万";
  }
  return formatWithThousandsSeparator(num.toFixed(2)) + " " + amount + unit;
};

/**
 * 格式化百分比,将数字转换为百分比形式
 * @param {number|string} num - 要格式化的数字
 * @param {number} precision - 小数点后保留的位数,默认为2
 * @returns {string} 格式化后的百分比字符串
 */
const formatPercent = (num: number | string, precision = 2): string => {
  num = convertToNumber(num);
  if (isNaN(num)) return "-";
  return (num * 100).toFixed(precision) + "%";
};

/**
 * 将输入转换为数字,如果不是数字或字符串则返回NaN
 * @param {any} num - 输入值
 * @returns {number} 转换后的数字
 */
function convertToNumber(num: any): number {
  if (typeof num === "number") {
    return num;
  } else if (typeof num === "string") {
    return parseFloat(num);
  }
  return NaN;
}

/**
 * 添加千位分隔符到数字字符串
 * @param {number|string} num - 数字或数字字符串
 * @returns {string} 添加分隔符后的字符串
 */
function formatWithThousandsSeparator(num: number | string): string {
  const n = typeof num === "number" ? num.toString() : num;
  if (isNaN(Number(n))) return "-";
  const [integer, decimal] = n.split(".");
  const reg = /\d{1,3}(?=(\d{3})+$)/g;
  const n1 = integer.replace(reg, "$&,");
  return decimal ? `${n1}.${decimal}` : n1;
}

export { formatNumber, formatCurrency, formatPercent };

总结

 这些函数在处理数字格式化时非常方便,特别是在需要展示给用户时。通过简单的调用,它们可以自动处理数字的格式化,确保数据展示的清晰和准确。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值