首页 > 其他分享 >你有几种方式实现数字千分位分割?

你有几种方式实现数字千分位分割?

时间:2022-10-05 21:11:09浏览次数:74  
标签:分割 console log 千分 几种 num result 343 const

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

前言

这既是一道常见的面试题,也是实际工作中常见的一个需求。这虽然不是一道算法题,但是它是一道发散性思维的题目,想要实现这个功能有很多种方法,这就要看你能够想出几种方法了,本篇文章只列出常见的几种,就相当于抛砖引玉了。

1.实现目标

首先让我们明白这道题目要干什么,接下来我们才好分析思路。

题目描述:

假如我们有这样一串数字:43243232.3232143,我们需要把它格式化为43,243,232.3232143

输出:

12343243

输出

12,343,243

题目总之非常的简单,接下来就让我们一起来实现吧!

2.数组逆序法

数组逆序方法是一种比较容易想到的方法,实现起来也比较简单。

代码如下:

function format1(num) {
  // 处理数字,主要是分割出小数和整数
  const str = num.toString().split('.'); // 处理小数
  const intNum = str[0]; // 整数部分
  const fraction = str[1] || ''; // 小数部分


  const arr = intNum.split('').reverse(); // 转化为数组,并且逆序
  let result = ''; // 最终需要返回的数据
  arr.forEach((item, index) => {
    // 不是第一位,且是3的倍数添加“,”
    if (index !== 0 && index % 3 === 0) {
      result = item + ',' + result;
    } else {
      result = item + result;
    }
  })
  return result + (fraction ? '.' + fraction : ''); // 加上小数部分
}


console.log(format1(2343143.123)); // 2,343,143.123
console.log(format1(2343143)); // 2,343,143
console.log(format1(234)); // 234
复制代码

上段代码中我们有几点需要注意:

  • 小数点后面的数字我们不需要分割
  • 我们需要将整串数字逆序,因为我们分割的结构是从后往前数,每三位添加一个逗号

3.字符串分割法

相较于数组逆序法,字符串分割法性能要相较于而言高一点,因为数组操作特别是一些打乱顺序得到操作其实是比较消耗性能的。

JS中,字符串本身就是可以循环的,而且本道题目输出的也是字符串,所以我们可以直接操作字符串。

代码如下:

function format2(num) {
  // 处理数字,主要是分割出小数和整数
  const str = num.toString().split('.'); // 处理小数
  const intNum = str[0]; // 整数部分
  const fraction = str[1] || ''; // 小数部分


  const length = intNum.length; // 获取字符串长度
  // 逆序循环
  let result = '';
  for (let index = length - 1; index > + 0; index--) {
    const j = length - index; // 循环到第几位了
    if (j % 3 === 0) {
      if (index === 0) {
        result = intNum[i] + result;
      } else {
        result = ',' + intNum[i] + result;
      }
    } else {
      result = intNum[i] + result;
    }
  }
  return result + (fraction ? '.' + fraction : ''); // 加上小数部分
}
console.log(format1(2343143.123)); // 2,343,143.123
console.log(format1(2343143)); // 2,343,143
console.log(format1(234)); // 234
复制代码

上段代码中需要注意的点如下:

  • 循环字符串时我们需要逆序循环
  • 当循环到3的倍数的时候,我们还需要判断当前是不是首位数

4.toLocaleString()

我们可以借助Number.prototype.toLocaleString()方法来实现该题目,toLocaleString()是一个原生的API,使用它来实现题目非常的简单。

我们可以简单看一下这个API做什么的,官网解释如下:

toLocaleString() 方法返回这个数字在特定语言环境下的表示字符串。

官网这段话估计小伙伴们看了也不太明白,所以还是建议去官网好好学习一下这个APItoLocaleString()

代码如下:

function format3(num) {
  return num.toLocaleString();
}
console.log(format3(2343143.123)); // 2,343,143.123
console.log(format3(2343143)); // 2,343,143
console.log(format3(234)); // 234
复制代码

5.使用正则

正则也是大家很容易想到的一种方式,不过如果这道题出现在面试中的话,我建议大家还是不要使用正则,因为正则的效率没有大家想象的那么好,当然如果在实际项目中,什么用起来简单用什么。

代码如下:

function format4(num){
  return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
console.log(format3(2343143.123)); // 2,343,143.123
console.log(format3(2343143)); // 2,343,143
console.log(format3(234)); // 234
复制代码

总结

想要实现该需求,方式多种多样,具体使用哪一种方式需要结合实际应用场景,比如说需要性能好一点,或者说需要代码简洁一点等等。出了上面几种,还有很多种方式可以实现,这就需要大家自己下去挖掘了。

如果觉得文章太繁琐或者没看懂,可以观看视频: 小猪课堂

来源:https://juejin.cn/post/7107046772815429645

标签:分割,console,log,千分,几种,num,result,343,const
From: https://www.cnblogs.com/konglxblog/p/16756397.html

相关文章

  • 基于深度学习的语义分割综述
    ImageSegmentationUsingDeepLearning:ASurveyPaper链接:https://arxiv.org/abs/2001.05566摘要图像分割是图像处理和计算机视觉领域的一个重要课题,在场景理解、医学......
  • MySQL注入的几种绕过方式
        在平时进行MySQL注入的过程当中,有时会遇到过滤关键字的情况,这篇文章就介绍绕过几种过滤关键字的方式。    绕过过滤and和or    打开sqli的......
  • 几种常见的概率分布表
    参考:《概率论与数理统计第四版》......
  • k8s 自定义pod hosts的几种方法
    日常中我们可能会碰到不少关于自定义podhosts的场景,对于不同的k8s版本处理的不一样的以下整理一些参考方法自定义coredns自定义coredns可以直接让解析的域名使用coredn......
  • C++之字符串分割案例---数据分析-03
    stringdata="我叫李宇博,我今年13岁,我家住在不知道,今天是星期天," "我喜欢吃粑粑,我喜欢做打篮球,我的学校是太康三中,我的生日是1月1号," "我的语文成绩是:0分,我的......
  • Python实现文件中的所有词汇分割为单独的字母
    基于Character-BasedLanguageModel在制作之前需要对语料库中的词汇进行分割,将每个字母单拎出来存在另一个文件里使用;下方是干分割工序的Python脚本:#-*-coding:UTF-8-*......
  • C++之字符串分割案例---数据分析(1)
    包含知识点:函数的使用、指针变量的使用、字符串查找、子字符串截取、字符串长度等。查看代码#include<iostream>#include<string>#include<cstdlib>usingnames......
  • 字符串分割
    #include<iostream>#include<fstream>#include<string>usingnamespacestd;intmain(){ ifstreamreadfile; readfile.open("八卦图数据源.txt"); stringstr......
  • vite开启gzip压缩和代码分割-保证你收获满满
    为什么要开启gzip压缩有些时候,我们我们的打包后的代码文件体积比较大。我们就需要对大文件进行压缩。增加渲染速度vite开启gzip压缩下载插件yarnaddvite-compress......
  • 杂谈:几种接口
    货铺QQ群号:8345082741)FTP这个我第一次用是2011年,老久了,可能到现在也已经有一些变化了。2)PI RFC这个就是最简单的配置一下PI,SAP内建RFC函数绑定就行了。《简单PI配置完整流......