如何优雅地处理Echarts环形图中的小数显示?

简介: 本文介绍了在数据可视化中处理数字格式的三种方法,重点解决保留两位小数并去除末尾多余0的问题。通过字符串操作、正则表达式和Number类型转换,实现简洁高效的数字格式化,推荐使用Number方法最优。

## 目录


- [前言](#%E5%89%8D%E8%A8%80)

- [需求描述](#%E9%9C%80%E6%B1%82%E6%8F%8F%E8%BF%B0)

- [解决方法](#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95)

   - [方法一:修正字符串处理方法](#%E6%96%B9%E6%B3%95%E4%B8%80%E4%BF%AE%E6%AD%A3%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%A4%84%E7%90%86%E6%96%B9%E6%B3%95)

   - [方法二:正则表达式处理](#%E6%96%B9%E6%B3%95%E4%BA%8C%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%A4%84%E7%90%86)

   - [方法三:使用 Number 方法](#%E6%96%B9%E6%B3%95%E4%B8%89%E4%BD%BF%E7%94%A8-Number-%E6%96%B9%E6%B3%95)

- [总结](#%E6%80%BB%E7%BB%93)

![请在此添加图片描述](https://developer.qcloudimg.com/http-save/1209475/9b03a51b97052190e92f0d328b2e5514.png)


## 前言


你好,我是喵喵侠。在数据可视化中,我们经常会遇到需要对数据进行格式化的需求。例如,在 Echarts 的环形图中,我们希望在图表中心的总数,显示经过计算后的结果,比方说25.66这样的小数,默认保留两位小数。但光保留两位小数可不行,还得去掉多余的末尾0。下面来一起探究如何优雅实现吧!


## 需求描述


假设现在有这样一个饼图,中间需要显示数字:


![请在此添加图片描述](https://developer.qcloudimg.com/http-save/1209475/aaf8f313c9833f46c50ed99eb19e2c91.png)


这个总数是通过每个扇区计算出来的,计算结果要求保留两位小数。保留两位小数很简单,总数计算后,调用下`toFixed(2)`就好了。但是这样会有个问题,如果结果是上面这样的25.6,保留两位小数后就是25.60,这个后面的0是不需要的。同理,如果计算结果是25.00,这个后面的00也是不需要的。


确切的说,当总数的小数位数超过2位的时候,只保留2位小数;如果得到的结果小数位末尾有多余的0,则需要去掉。


## 解决方法


针对这个数字的处理,我有三种解决方法,一起来看看吧。


### 方法一:修正字符串处理方法


这个方法通过将数字转换为字符串并手动处理小数部分来达到预期效果:


```javascript

function formatNumber(num) {

 let str = num.toFixed(2);

 if (str.indexOf(".") > -1) {

   let parts = str.split(".");

   let decimalPart = parts[1];

   // 去掉末尾的0

   while (decimalPart.endsWith("0")) {

     decimalPart = decimalPart.slice(0, -1);

   }

   // 如果小数部分为空,则仅返回整数部分

   str = decimalPart ? `${parts[0]}.${decimalPart}` : parts[0];

 }

 return str;

}


let num1 = 12.5;

let num2 = 12.0;

let num3 = 12.34;


console.log(formatNumber(num1)); // 输出 "12.5"

console.log(formatNumber(num2)); // 输出 "12"

console.log(formatNumber(num3)); // 输出 "12.34"

```


这种方法的核心思路是,把数字转换成字符串,通过小数点.来切割成两个数组,索引为1的数组是小数部分,通过while循环判断,如果字符串的末尾有0,那么用slice方法截取字符串第0位到倒数第2位(也就是-1,end位置这个不包含)。直到末尾找不到0,则跳出循环。最后三元判断,判断小数部分是否还存在(存在小数部分都是0被截取丢弃完的情况),然后通过字符串拼接的方式组合出新的总数。


### 方法二:正则表达式处理


使用正则表达式也可以达到类似的效果,以下是一个简洁的实现:


```javascript

function formatNumber(num) {

 return num.toFixed(2).replace(/\.?0+$/, '');

}


console.log(formatNumber(12.50)); // 输出 "12.5"

console.log(formatNumber(12.00)); // 输出 "12"

console.log(formatNumber(12.34)); // 输出 "12.34"

```


这种方法比较简单,一行代码就搞定。但理解起来需要对正则比较熟悉,尤其是这个`?`的含义要知道是什么,这个是点睛之笔。下面我解释下`/\.?0+$/`这个正则的含义:


- `/``/`:表示正则表达式的起始和结束。

- `.?`:匹配一个小数点 `.`,其中 `.` 用于转义小数点,因为小数点在正则表达式中是一个特殊字符。`?` 表示前面的小数点是可选的,也就是说这个部分匹配“零个或一个”小数点。

- `0+`:匹配一个或多个零 (`0`),`+` 表示前面的 `0` 可以出现一次或多次。

- `$`:表示字符串的结尾,确保匹配发生在字符串的末尾。


比方说数字是123.10,那么这个.?表示这里末尾0的左边可以没有小数点,匹配的就是`0``replace`后得到的是123.1。


如果数字是123.00,这种情况小数点和后面紧跟的0就都匹配上了,匹配的部分是`.00`,小数点和末尾的0就都去掉了,`replace`后的结果就是123。


### 方法三:使用 `Number` 方法


最简单的方法是直接用 `Number` 转换字符串,这样会自动去掉多余的零:


```javascript

function formatNumber(num) {

 return Number(num.toFixed(2));

}


console.log(formatNumber(12.50)); // 输出 "12.5"

console.log(formatNumber(12.00)); // 输出 "12"

console.log(formatNumber(12.34)); // 输出 "12.34"

```


## 总结


对字符串数组操作比较熟练的同学,可能会写出方法一,但需要考虑的细节比较多,得反复测试;方法二也是需要反复测试验证,只是写法实现更简洁一些;最好的方法还是方法三,用内置的Number构造函数,直接就去掉了末尾多余的0,没有任何副作用,以后建议就用它吧!

目录
相关文章
|
2月前
|
前端开发 开发者 容器
如何解决 flex 布局下子元素 width 宽度设置失效的问题
本文通过实际案例,探讨前端开发中flex布局导致子元素宽度设置失效的问题,分析原因并提供两种解决方案:去除flex布局(不推荐)和设置min-width(推荐),帮助开发者深入理解flex特性,提升布局控制能力。
194 0
如何解决 flex 布局下子元素 width 宽度设置失效的问题
|
2月前
|
前端开发 JavaScript 定位技术
前端表单输入框自动填充和覆盖逻辑的实现
本文介绍Web开发中表单联动的实现方案,针对输入框与下拉框的数据填充需求,提出两种解决思路:一是通过比对选项label判断是否覆盖,二是监听用户输入行为设置flag开关。结合Vue与Element-UI实战代码,详解如何智能控制数据填充逻辑,避免覆盖用户手动输入内容,提升表单交互体验。
180 0
前端表单输入框自动填充和覆盖逻辑的实现
|
JavaScript
3分钟了解 vue props type类型
3分钟了解 vue props type类型
748 0
|
2月前
|
人工智能 JavaScript UED
如何实现两个下拉选择框 select选中联动效果?
本文通过一个公司与产品联动的下拉选择案例,详细讲解了Element UI中双向联动下拉框的实现方法。涵盖数据过滤、回显处理、重置功能及注意事项,结合Vue实战代码,帮助开发者提升表单交互体验,适用于各类关联选择场景的开发参考。(238字)
250 0
如何实现两个下拉选择框 select选中联动效果?
|
2月前
|
JavaScript 数据可视化 视频直播
如何手动停止 videojs 直播视频流 m3u8 请求?
在可视化大屏项目中,多个VideoJS组件播放m3u8流时,即使暂停仍持续请求,导致页面卡顿。通过监听display属性,结合`dispose()`销毁实例并重建同ID的video DOM元素,有效释放资源且保留组件结构,解决性能问题,提升用户体验。
200 0
|
2月前
|
JavaScript 搜索推荐 持续交付
手把手教你用 Vercel 免费部署 RSSHub
本文详细介绍如何使用Vercel免费部署RSSHub服务。通过Fork仓库、注册Vercel、导入项目并调整分支与Node.js版本配置,实现一键部署个性化的RSS订阅源,解决部署中常见的版本冲突问题,并提供注意事项与验证方法,助你快速搭建可公开访问的RSS服务。
603 0
|
2月前
|
存储 数据可视化 BI
什么是CMS系统
本文介绍 CMS 系统的定义、五大核心作用,并举 PageAdmin、ECreator 低代码平台、QuickSSO 统一身份认证平台三例,说明其在各类网站搭建与企业数字化管理中的应用。
201 4
|
2月前
|
存储 人工智能 缓存
8核32G服务器怎么样?2026年阿里云 8 核 32G 云服务器价格、配置与性能解析
阿里云 8 核 32G 云服务器凭借 1:4 的 CPU 与内存均衡配比,成为兼顾性能与实用性的热门选择,既能支撑中大型企业核心业务(如高并发官网、中型数据库),也能满足开发者高性能测试需求(如批量数据运算、轻量 AI 推理)。下面从价格、核心配置、实测性能三方面详细解析,帮你判断是否适配业务需求。
|
2月前
|
文字识别 开发者 Windows
Windows 上值得推荐的软件(第一弹)
本文推荐两款提升Windows使用效率的神器:Listary,实现文件快速搜索与路径跳转;uTools,集快捷启动、剪贴板智能识别与丰富插件于一体,助力高效办公。
172 0
Windows 上值得推荐的软件(第一弹)
|
2月前
|
存储 弹性计算 人工智能
租用阿里云服务器一年要多少钱?2026年最新费用价格全解析
租用阿里云服务器的成本受配置、实例类型、地域等因素影响,不同需求对应不同价格区间。以下结合最新优惠信息,梳理轻量应用服务器、ECS 云服务器及 GPU 服务器的热门配置与一年费用,帮助用户根据业务场景选择合适方案,避免盲目消费。

热门文章

最新文章