• 使用JavaScript将数字格式化成千分位的n种方法


    1,使用数组方法:

    1) 数字转字符串,字符串按照小数点.分割

    2) 整数部分拆分成字符串数组,并倒叙

    3) 遍历, 按照每三位添加逗号,号

    4) 拼接整数部分+小数部分

    1. function format_width_array(number) { // 将数字转换为千分位字符串
    2. const arr = String(number).split('.');
    3. // 整数部分(数组格式) => split将字符串转换为数组
    4. const int = arr[0].split('');
    5. // 小数点右边的数字部分
    6. const float = arr[1] || '';
    7. let r = ''
    8. // 倒叙并遍历
    9. int.reverse().forEach(function (v, i) {
    10. // 非第一位并且是位值是3的倍数, 添加','
    11. if (i !== 0 && i % 3 === 0) {
    12. r += v + ','
    13. }
    14. else {
    15. // 正常添加字符
    16. r += v
    17. }
    18. })
    19. return `${r}${!!float ? '.' + float : ''}`
    20. }
    21. console.log(format_width_array('938765432.02098'))

    2.使用字符串的substring截取

    1) 数字转字符串,并按照小数点’.’分割

    2) 整数部分对3取模,获取余数, 获得substring(0, 余数)的字符串片段r

    3) 按照/3截整数商为lenth遍历,每次循环, 字符串片段拼接新的片段: 以下标(余数+i*3)开始, 结束下标在开始下标的基础上加上3

    4) 当/3没有余数时, 要去掉字符串首位多出来的逗号','

    5) 拼接整数部分+小数部分

    1. // 字符串substring截取:
    2. function format_with_substring(number) {
    3. // 数字转字符串并按.分割
    4. const arr = String(number).split('.')
    5. const int = arr[0] || '';
    6. const float = arr[1] || ''
    7. // 多余的位数
    8. const f = int.length % 3
    9. // 获取多余的位数,f可能是0,则r可能是空字符串
    10. let r = int.substring(0, f)
    11. // 除以3取商, 取整
    12. const len = Math.floor(int.length / 3)
    13. for (let i = 0; i < len; i++) {
    14. r += `,${int.substring(f + i * 3, f + (i + 1) * 3)}`
    15. }
    16. // 多余的位数
    17. if (f === 0) {
    18. // 去掉下标0','
    19. r = r.substring(1)
    20. }
    21. // 整数部分和小数部分拼接
    22. return `${r}${!!float ? '.' + float : ''}`
    23. }
    24. console.log(format_with_substring('938765432.02098'))

    3.除法+求模

    1) 值对1000求模,获得最高三位

    2) 值除以1000,值是否大于1判断是否结束

    3) 重复1)和2),直到退出

    4) 拼接整数部分 + 小数部分

    1. /**
    2. * ~是js里的按位取反操作符 , ~~ 就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是
    3. ~~true === 1,~~false === 0。 ~~"" == 0 ~~[] == 0
    4. padStart和padEnd是类似的用法,padEnd是向后补位,padStart是在前边补位。
    5. */
    6. function format_width_mod(number) {
    7. let n = Number(number)
    8. let r = ''
    9. let temp = null;
    10. do {
    11. // 求模的值, 用于获取最高三位,这里可能有小数
    12. mod = n % 1000;
    13. // 值是否大于1,是继续的条件
    14. n = n / 1000
    15. // 高三位
    16. temp = ~~mod; // ~~转化为数值变量
    17. // 1. 填充: n>1循环未结束, 就要填充为 比如: 1 => 001,
    18. // 不然1 001, 就会变成11,
    19. // 2.拼接','
    20. r = (n >= 1 ? `${String(temp).padStart(3, '0')}` : temp)
    21. + (!!r ? `,${r}` : '')
    22. console.log(r, 'r=====')
    23. } while (n >= 1)
    24. const strNumber = String(number)
    25. const index = strNumber.indexOf('.')
    26. // 拼接小数部分
    27. if (index >= 0) {
    28. r += strNumber.substring(index)
    29. }
    30. return r
    31. }
    32. console.log(format_width_mod('1001.02098'))

    4.正则

    1) 利用正则前瞻: exp1(?=exp2) 查找exp2前面的exp1

    2) 将整数部分格式化为千分位

    3) 拼接整数部分和小数部分

    1. function format_width_regex(number) {
    2. const reg = /\d{1,3}(?=(\d{3})+$)/g
    3. // $&指的是匹配的内容, 符合正则表达式的内容加','
    4. const strNumber = number + '';
    5. const int = Math.floor(strNumber)
    6. const floatPart = strNumber.substring(strNumber.indexOf('.')) || ''
    7. return String(int).replace(reg, '$&,') + floatPart;
    8. }
    9. console.log(format_width_regex('1001.02098'))
    10. console.log(format_width_regex('938765432.02098'))
    11. function format_width_regex2(number) {
    12. // exp1(?=exp2) 查找查找exp2前面的exp1
    13. const reg = /\d{1,3}(?=(\d{3})+)/g
    14. const reg2 = /^(\d+)\.(\d+)$/;
    15. const strNumber = number + '';
    16. const int = strNumber.replace(reg2, '$1') || ''
    17. const float = reg2.test(strNumber) ? strNumber.replace(reg2, '$2') : ''
    18. return int.replace(reg, function (match, ...args) {
    19. console.log(match, ...args, '打印====')
    20. return match + ','
    21. }) + (float.padStart(float.length > 0 ? float.length + 1 : 0, '.'))
    22. }
    23. console.log(format_width_regex2(900))
    24. console.log(format_width_regex2('1000'))
    25. console.log(format_width_regex2('1001.02098'))
    26. console.log(format_width_regex2('938765432.02098'))
    27. function format_width_regex3(number) {
    28. // 匹配的是后面是3*n个数字的非单词边界(\B)
    29. const reg = /\B(?=(?:\d{3})+(?!\d))/g
    30. const reg2 = /^(\d+)\.(\d+)$/;
    31. const strNumber = number + '';
    32. const int = strNumber.replace(reg2, '$1') || ''
    33. const float = reg2.test(strNumber) ? strNumber.replace(reg2, '$2') : ''
    34. return int.replace(reg, function (match, ...args) {
    35. return match + ','
    36. }) + (float.padStart(float.length > 0 ? float.length + 1 : 0, '.'))
    37. }
    38. console.log(format_width_regex3(900))
    39. console.log(format_width_regex3('1000'))
    40. console.log(format_width_regex3('1001.02098'))
    41. console.log(format_width_regex3('938765432.02098'))
    42. /**
    43. 要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念:
    44. // 前瞻:
    45. exp1(?=exp2) 查找exp2前面的exp1
    46. // 后顾:
    47. (?<=exp2)exp1 查找exp2后面的exp1
    48. // 负前瞻:
    49. exp1(?!exp2) 查找后面不是exp2的exp1
    50. // 负后顾:
    51. (?<!exp2)exp1 查找前面不是exp2的exp1 */
    52. function format_with_Intl(number, minimumFractionDigits, maximumFractionDigits) {
    53. const strNumber = number + '';
    54. const float = /\./.test(strNumber) ? strNumber.split('.')[1]: '';
    55. minimumFractionDigits = minimumFractionDigits || float.length || 2
    56. maximumFractionDigits = maximumFractionDigits || float.length || 2
    57. maximumFractionDigits = Math.max(minimumFractionDigits, maximumFractionDigits)
    58. return new Intl.NumberFormat('en-us', {
    59. maximumFractionDigits,
    60. minimumFractionDigits
    61. }).format(number)
    62. }
    63. console.log(format_with_Intl(900))
    64. console.log(format_with_Intl('1000'))
    65. console.log(format_with_Intl('1001.02098'))
    66. console.log(format_with_Intl('938765432.02098'))

  • 相关阅读:
    【数据结构--八大排序】之希尔排序
    error: reference to ‘byte‘ is ambiguous使用QtCharts报的错误
    异地监控如何实现远程访问?贝锐蒲公英无需公网IP即可实现
    Ubuntu 和 Windows 文件互传
    算法|每日一题|同积元组|哈希统计
    【前端工程化】babel到底是个什么,了解babel的功能
    使用html2canva截图生成图片
    如何设定员工满意度调研的维度?
    对DataFrame按指定的行、列索引输出数据:lookup()函数
    【mysql 提高查询效率】Mysql 数据库查询好慢问题解决
  • 原文地址:https://blog.csdn.net/qq_42750608/article/details/133279621