数字千分位

94 阅读3分钟

这个函数 zhengzebiaodashi 使用正则表达式将一个数字字符串格式化为带有千分位分隔符的字符串。以下是对该函数的详细解释:

函数定义

function zhengzebiaodashi(str: any) {
  const dd11 = /\B(?=(\d{3})+(?!\d))/g;
  return str.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}

参数

  • str:函数接受一个参数 str,可以是任何类型。通常情况下,这个参数应该是一个数字或可以转换为字符串的值。

正则表达式解释

  • \B:匹配非单词边界。单词边界是指位置的前后字符一个是单词字符(字母、数字、下划线),一个是非单词字符。
  • (?=(\d{3})+(?!\d)):这是一个正向前瞻断言,表示在当前位置后面必须跟着一个或多个三位数字的组合,且这些数字后面不能跟着另一个数字。

分解正则表达式

  1. \B
    表示匹配一个非单词边界的位置。单词边界是字母、数字或下划线与其他字符之间的位置。\B 确保匹配的位置在数字内部,避免在数字开头或结尾插入分隔符。
  2. (?=...) (正向肯定预查)
    表示当前位置必须满足括号内的条件,但不消耗字符(仅检查,不移动匹配位置)。
  3. (\d{3})+
    匹配一个或多个连续的三个数字组。例如,123456 中的 123 和 456
  4. (?!\d) (负向预查)
    确保三个数字组的末尾之后没有更多数字。例如,123456 的末尾是 6,后面没有数字,满足条件。

整体逻辑

  • 匹配一个非单词边界的位置(\B)。
  • 确保该位置之后的所有剩余数字能恰好被分为一个或多个三数组,且末尾没有多余数字((?=(\d{3})+(?!\d)))。

示例解析

以 123456789 为例:

  1. 位置3(3 和 4 之间)

    • 后面的数字是 456789,可被分为 456 和 789
    • 满足条件,插入逗号,得到 123,456789
  2. 位置6(6 和 7 之间)

    • 后面的数字是 789,恰好为一组。
    • 满足条件,插入逗号,最终得到 123,456,789

替换操作

使用 replace 方法将匹配的位置替换为逗号:

javascript

复制

"123456789".replace(/\B(?=(\d{3})+(?!\d))/g, ',') // 输出 "123,456,789"

边界情况

  • 短数字123 → 无逗号(不足四位)。
  • 长度非3的倍数12345 → 12,345(从右向左每三位分割)。

总结

该正则表达式通过精确匹配数字内部的位置,并确保后续数字能按三位分组,实现千位分隔符的插入,适用于大多数格式化需求。

替换操作

  • str.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','):将输入的 str 转换为字符串,然后使用正则表达式匹配所有符合条件的位置,并在这些位置插入逗号 ,

示例

假设我们有一个数字 1234567,调用 zhengzebiaodashi 函数后:

const formattedNumber = zhengzebiaodashi(1234567);
console.log(formattedNumber); // 输出: "1,234,567"

总结

这个函数的作用是将一个数字字符串格式化为带有千分位分隔符的字符串。例如,将 1234567 转换为 1,234,567