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

这篇具有很好参考价值的文章主要介绍了使用JavaScript将数字格式化成千分位的n种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1,使用数组方法:

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

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

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

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

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

2.使用字符串的substring截取

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

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

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

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

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

// 字符串substring截取:
function format_with_substring(number) {
    // 数字转字符串并按.分割
    const arr = String(number).split('.')
    const int = arr[0] || '';
    const float = arr[1] || ''

    // 多余的位数
    const f = int.length % 3

    // 获取多余的位数,f可能是0,则r可能是空字符串
    let r = int.substring(0, f)
    // 除以3取商, 取整
    const len = Math.floor(int.length / 3)
    for (let i = 0; i < len; i++) {
        r += `,${int.substring(f + i * 3, f + (i + 1) * 3)}`
    }
    // 多余的位数
    if (f === 0) {
        // 去掉下标0的','
        r = r.substring(1)
    }

    // 整数部分和小数部分拼接
    return `${r}${!!float ? '.' + float : ''}`
}
console.log(format_with_substring('938765432.02098'))

3.除法+求模

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

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

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

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

/**
 * ~是js里的按位取反操作符 , ~~ 就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是
~~true === 1,~~false === 0。 ~~"" == 0 ~~[] == 0

padStart和padEnd是类似的用法,padEnd是向后补位,padStart是在前边补位。
 */
function format_width_mod(number) {
    let n = Number(number)
    let r = ''
    let temp = null;
    do {
        // 求模的值, 用于获取最高三位,这里可能有小数
        mod = n % 1000;
        // 值是否大于1,是继续的条件
        n = n / 1000
        // 高三位
        temp = ~~mod; // ~~转化为数值变量
        // 1. 填充: n>1循环未结束, 就要填充为 比如: 1 => 001,
        // 不然1 001, 就会变成11,
        // 2.拼接','
        r = (n >= 1 ? `${String(temp).padStart(3, '0')}` : temp)
            + (!!r ? `,${r}` : '')
        console.log(r, 'r=====')
    } while (n >= 1)
    const strNumber = String(number)
    const index = strNumber.indexOf('.')
    // 拼接小数部分
    if (index >= 0) {
        r += strNumber.substring(index)
    }
    return r
}
console.log(format_width_mod('1001.02098'))

4.正则

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

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

3) 拼接整数部分和小数部分文章来源地址https://www.toymoban.com/news/detail-758891.html

function format_width_regex(number) {
    const reg = /\d{1,3}(?=(\d{3})+$)/g
    // $&指的是匹配的内容, 符合正则表达式的内容加','
    const strNumber = number + '';
    const int = Math.floor(strNumber)
    const floatPart = strNumber.substring(strNumber.indexOf('.')) || ''
    return String(int).replace(reg, '$&,') + floatPart;
}
console.log(format_width_regex('1001.02098'))
console.log(format_width_regex('938765432.02098'))

function format_width_regex2(number) {
    // exp1(?=exp2) 查找查找exp2前面的exp1
    const reg = /\d{1,3}(?=(\d{3})+)/g 
    const reg2 = /^(\d+)\.(\d+)$/;
    const strNumber = number + '';
    const int = strNumber.replace(reg2, '$1') || ''
    const float = reg2.test(strNumber) ? strNumber.replace(reg2, '$2') : ''
    return int.replace(reg, function (match, ...args) {
        console.log(match, ...args, '打印====')
        return match + ','
    }) + (float.padStart(float.length > 0 ? float.length + 1 : 0, '.'))
}
console.log(format_width_regex2(900))
console.log(format_width_regex2('1000'))
console.log(format_width_regex2('1001.02098'))
console.log(format_width_regex2('938765432.02098'))

function format_width_regex3(number) {
    // 匹配的是后面是3*n个数字的非单词边界(\B)
    const reg = /\B(?=(?:\d{3})+(?!\d))/g
    const reg2 = /^(\d+)\.(\d+)$/;
    const strNumber = number + '';
    const int = strNumber.replace(reg2, '$1') || ''
    const float = reg2.test(strNumber) ? strNumber.replace(reg2, '$2') : ''
    return int.replace(reg, function (match, ...args) {
        return match + ','
    }) + (float.padStart(float.length > 0 ? float.length + 1 : 0, '.'))
}
console.log(format_width_regex3(900))
console.log(format_width_regex3('1000'))
console.log(format_width_regex3('1001.02098'))
console.log(format_width_regex3('938765432.02098'))



/**
要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念:

// 前瞻:
exp1(?=exp2) 查找exp2前面的exp1
// 后顾:
(?<=exp2)exp1 查找exp2后面的exp1
// 负前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
// 负后顾:
(?<!exp2)exp1 查找前面不是exp2的exp1 */
function format_with_Intl(number, minimumFractionDigits, maximumFractionDigits) {
    const strNumber = number + '';
    const float = /\./.test(strNumber) ? strNumber.split('.')[1]: '';
    minimumFractionDigits = minimumFractionDigits || float.length || 2
    maximumFractionDigits = maximumFractionDigits || float.length || 2
    maximumFractionDigits = Math.max(minimumFractionDigits, maximumFractionDigits)
    return new Intl.NumberFormat('en-us', {
        maximumFractionDigits,
        minimumFractionDigits
    }).format(number)
}
console.log(format_with_Intl(900))
console.log(format_with_Intl('1000'))
console.log(format_with_Intl('1001.02098'))
console.log(format_with_Intl('938765432.02098'))

到了这里,关于使用JavaScript将数字格式化成千分位的n种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java格式化数字 NumberFormat及DecimalFormat

    NumberFormat帮助您格式化和解析任何区域设置的数字。您的代码可以完全独立于小数点,千位分隔符的区域设置约定,甚至是使用的特定十进制数字,或者数字格式是否为十进制。 DecimalFormat是NumberFormat十进制数字格式的具体子类 。它具有多种功能,旨在解析和格式化任何语言

    2024年02月02日
    浏览(43)
  • 跟着hsp学springmvc--数字格式化介绍

    比如通过表单提交数据给springmvc时,输入的”28“字符串就会自动地转成Integer类型的数据保存在Model中 对于特殊数据类型和字符串的转换要使用注解 比如日期(@DateTimeFormat),货币(@NumberFormat)等等。 注解中的pattern可以指定输入的数据格式,如果不满足格式则会报错。 验

    2024年02月06日
    浏览(39)
  • java中的数字的格式化(超详细)

    数字的格式化在解决实际问题时使用非常普遍,如显示某超市的商品价格,需要保留两位小数。Java 主要对浮点型数据进行数字格式化操作,其中浮点型数据包括 double 和 float 型数据,在 java 中常用以下方法: 目录        // 方法一 :DecimalFormat转换最简便 #.00 表示两位小数

    2024年02月16日
    浏览(45)
  • 【Java LocalDateTime】LocalDateTime获取时间信息、格式化、转换为数字时间戳

    文章目录 正文         一、描述         二、基本使用 1、获取LocalDateTime时间 2、时间比较 3、获取基本时间信息: 4、格式化 / 反格式化 5、转换为数字时间戳 6、数字时间戳转为LocalDateTime         LocalDateTime是Java 8引入的日期和时间API (java.time包)中的一个类, 不包含

    2024年02月03日
    浏览(50)
  • 使用vscode格式化文档无效(vue代码格式化文档无效)

    问题: 最近在写代码的时候,vscode使用格式化文档不管用。 原因: 单页面使用大量element组件和html代码导致,vscode识别不了。 解决方案: 1、 打开设置,点击右侧的图标打开settings.json文件,在文件中注入代码。 settings.json文件位置,vscode左下角:  设置页面右上角:  在

    2024年02月16日
    浏览(76)
  • DBeaver中使用外部格式化程序对进行sql格式化

    本文介绍了如何在DBeaver中使用pgFormatter、sqlprase、sqlformatter等外部格式化程序对sql进行格式化。 目录 一、pgFormatter 1.准备工作 2.DBeaver中进行配置 二、sqlprase 1.准备工作 2.在DBeaver中配置 三、sql-formatter 1.准备工作 2.在DBeaver中配置 pgFormatter本质是perl脚本,所以需要perl运行环境支

    2024年01月25日
    浏览(62)
  • vue3 codemirror关于 sql 和 json格式化的使用以及深入了解codemirror 使用json格式化提示错误的关键代码。包含了json格式化没有效果和json格式化提示错误

    后端返回一个json字符串,里面有value1、value2指定字段渲染sql语句,其他渲染json语句。 jsonlint 和 jsonlint-mod 的区别 简单理解:jsonlint校验json格式化是否有效,jsonlint-mod用来格式化后同时校验json格式化是否有效。 (1)JSONLint是一种可以验证JSON格式是否有效的工具。 它可以检查

    2024年04月28日
    浏览(77)
  • 在VS中使用格式化工具

    官网地址: https://clang.llvm.org/ 最后更新时间:2023.8.25 这里以windows为例,使用的环境为VS。 下载地址: https://github.com/llvm 安装(自己选择安装路径) 在VS中设置LLVM的 clang-format.exe 路径 到这里我们需要理解clang-format.exe是一个格式化程序,它里面有一些格式化规则,我们现在需要

    2024年02月11日
    浏览(47)
  • Linux磁盘查看,使用(分区、格式化、挂载)

    目录 0、观察磁盘分区状态:lsblk、blkid、parted 0.1  lsblk列出系统上的所有磁盘列表 0.2  blkid列出设备的UUID等参数 0.3  parted列出磁盘的分区表类型与分区信息 1、磁盘分区:gdisk、fdisk 1.1  fdisk 2、磁盘格式化(创建文件系统):mkfs 3、文件系统挂载 3.1.1  手动挂载:mount 3.1.2

    2023年04月24日
    浏览(51)
  • 关于使用JS获取当前时间并格式化输出

    (1)逐个提取并拼接字符串 (2)一步到位提取年月日时分秒(重点) 首先,提取数据到数据 然后,拼接数据格式化输出 (附上,过程剖析)

    2024年02月03日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包