使用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 ~~[] == 0padStart和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) 拼接整数部分和小数部分

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前面的exp1const 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))/gconst 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 || 2maximumFractionDigits = maximumFractionDigits || float.length || 2maximumFractionDigits = 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'))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/87840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码阅读分析神器-Scitools Understand

这里写目录标题 前言概要功能介绍1.代码统计2.图形化分析3.代码检查 使用方法下载及使用 前言 作为一名程序员&#xff0c;阅读代码是一个必须要拥有的能力&#xff0c;但无奈很多代码逻辑嵌套非常多&#xff0c;看起来非常吃力&#xff0c;看了那段逻辑就忘记了刚才的逻辑&am…

SpringBoot 集成 AKKA

文章目录 应用场景与 SpringBoot 集成示例 应用场景 AKKA 是一个用于构建高并发、分布式和容错应用程序的开源框架。它基于Actor模型&#xff0c;提供了强大的并发抽象和工具&#xff0c;适用于各种业务场景。以下是一些使用AKKA框架的常见业务场景的示例&#xff1a; 实时数据…

WordPress还原重置插件WP Reset 教程!

这是一篇完整的 WordPress 还原教程&#xff0c;我们将使用一款插件&#xff0c;快速重置整个 WordPress 网站。 有时在安装不同主题、网站插件后&#xff0c;可能会导致程序码彼此的冲突&#xff0c;而让网站出现跑版、错误等 ..&#xff0c;这时直接重新来过可能反而比较快一…

大模型从入门到应用——LangChain:代理(Agents)-[代理执行器(Agent Executor):处理解析错误、访问中间步骤和限制最大迭代次数]

分类目录&#xff1a;《大模型从入门到应用》总目录 LangChain系列文章&#xff1a; 基础知识快速入门 安装与环境配置链&#xff08;Chains&#xff09;、代理&#xff08;Agent:&#xff09;和记忆&#xff08;Memory&#xff09;快速开发聊天模型 模型&#xff08;Models&…

AM@映射@函数@反函数@复合函数

文章目录 abstract直接定义函数的定义反函数定义复合函数定义 基于映射定义映射像原像定义域值域小结例满射单射&#x1f47a;双射映射的其他称呼 逆映射复合映射映射间可复合条件复合顺序 函数基于映射的函数相关定义函数函数的记法及其含义函数值 f ( x ) f(x) f(x)函数关系 …

使用Http Interface客户端解析text/html类型参数

前言 Spring6和Spring Boot3的正式发布也有一段时间了&#xff0c;最低支持的java版本也是直接跳到了17。而且最近java21也出来了&#xff0c;作为一个javaer&#xff0c;你不会还在坚守java8吧&#xff1f; Http Interface是Spring6新推出的一个声明式http客户端&#xff0c;…

命令执行(rce)

1.命令与代码执行原理 命令执行原理 参数给变量未经过滤&#xff0c;直接使用了不安全的函数处理了变量 127.0.0.1&&ipconfig 有漏洞 常用的函数 assert,system,exec,shell_exec, eval,(反单引号&#xff09; 代码执行原理 参数给变量未经过滤&#xff…

56块钱搭建一个ubuntu 2204 linux 服务器

硬件pdd上淘的一个linux小盒子 应该是以前的机顶盒之类的 实物图如下 今天刚收到小盒子 找了个显示器 键盘 查到小盒子上通电 本来指示灯应该亮的 老板刷机之后 led灯都不亮了 不知道有没有开机 我还以为坏了 刚开始 然后直接连到显示器上 有输出 那说明没问题…

【C语言】进阶——结构体+枚举+联合

①前言&#xff1a; 在之前【C语言】初阶——结构体 &#xff0c;简单介绍了结构体。而C语言中结构体的内容还有更深层次的内容。 一.结构体 结构体(struct)是由一系列具有相同类型或不同类型的数据项构成的数据集合&#xff0c;这些数据项称为结构体的成员。 1.结构体的声明 …

Ubuntu 安装PostgreSQL

网上有各种版本的&#xff0c;也可以去官网看官方的文档。我是下载的PostgreSQL-11.4版本的。找到以后直接复制网上的压缩包链接就可以。 $ mkdir /opt/postgresql && cd /opt/postgresql $ wget https://ftp.postgresql.org/pub/source/v11.4/postgresql-11.4.tar.gz…

智算引领·创新未来 | 2023紫光展锐泛物联网终端生态论坛成功举办

9月21日&#xff0c;紫光展锐在深圳成功举办2023泛物联网终端生态论坛。论坛以“智算引领创新未来”为主题&#xff0c;吸引了来自信通院、中国联通、中国移动、中国电信、金融机构、终端厂商、模组厂商等行业各领域三百多位精英翘楚汇聚一堂&#xff0c;探讨在连接、算力驱动下…

数据结构学习笔记——查找算法中的树形查找(平衡二叉树)

目录 一、平衡二叉树的定义二、平衡因子三、平衡二叉树的插入和构造&#xff08;一&#xff09;LL型旋转&#xff08;二&#xff09;LR型旋转&#xff08;三&#xff09;RR型旋转&#xff08;四&#xff09;RL型旋转 四、平衡二叉树的删除&#xff08;一&#xff09;叶子结点&a…

初学vue.js

准备Vue.js环境 ① 下载环境&#xff1a; javaScript语言的程序包&#xff1a;外部js文件 对于Vue来说&#xff0c;导入Vue的外部js文件就能够使用Vue框架了。 Vue框架的js文件获取: 官网提供的下载地址&#xff1a;https://cdn.jsdelivr.net/npm/vue/dist/vue.js ②导入环境…

短视频矩阵系统,短视频矩阵源码技术

1、抖音开放平台申请账号&#xff0c;快手平台申请账号&#xff1b;阿里云混剪接口。 2、系统总台支持OEM代理&#xff0c;可以按点数管理。 3、代理功能。包括是否允许再次开二级代理、是否允许OEM等。 4、可支持一条龙搭建服务&#xff0c;抖音平台开放平台代申请等 开发…

C++:优先级队列模拟实现和仿函数的概念使用

文章目录 使用方法Compare仿函数一些场景模板参数和函数参数 本篇总结优先级队列 使用方法 首先在官网查看它的一些用法 template <class T, class Container vector<T>,class Compare less<typename Container::value_type> > class priority_queue;从…

Mac 通过 brew安装的 ffmpeg 切换版本

现有版本为 6.x &#xff0c;想切换至 5.x 版本 先安装 5.x 版本 brew install ffmpeg5安装完成后会出现具体版本号&#xff0c;也可以自己指定例如 brew install ffmpeg5.1.3 配置环境变量 .zshrc vi ~/.zshrc添加如下命令 export PATH/usr/local/Cellar/ffmpeg5/5.1.3/bin:…

【RabbitMQ实战】05 RabbitMQ后台管理

一、多租户与权限 1.1 vhost的概念 每一个 RabbitMQ服务器都能创建虚拟的消息服务器&#xff0c;我们称之为虚拟主机(virtual host),简称为 vhost。每一个 vhost本质上是一个独立的小型RabbitMQ服务器&#xff0c;拥有自己独立的队列、交换器及绑定关系等&#xff0c;并且它拥…

Pycharm2023版修改镜像源

步骤1 步骤2 国内常见镜像源 阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/豆瓣(douban) http://pypi.douban.com/simple/清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/中国科学技术大学 http://pypi.mirrors.…

C# 删除文件夹

要在 C# 中删除文件夹&#xff0c;您可以使用 http://System.IO 命名空间中的 Directory.Delete 方法。以下是一个示例代码&#xff0c;演示如何删除一个文件夹&#xff1a; using System; using System.IO;class Program {static void Main(){string folderPath "C:\Pa…

腾讯mini项目-【指标监控服务重构】2023-08-29

今日已办 Collector 指标聚合 由于没有找到 Prometheus 官方提供的可以聚合指定时间区间内的聚合函数&#xff0c;所以自己对接Prometheus的api来聚合指定容器的cpu_avg、cpu_99th、mem_avg 实现成功后对接小组成员测试完提供的时间序列和相关容器&#xff0c;将数据记录在表格…