热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

以友好的方式显示前端号码的提示

您如何在前端平稳显示数字?在本文中,我们总结了一些实用的原理,介绍了一个工具库-NumberDisplay,并分析了其源代码

您如何在前端平稳显示数字? 在本文中,我们总结了一些实用的原理,介绍了一个工具库-Number Display,并分析了其源代码。

Number Display具有用于Web的Javascript版本和用于Flutter的Dart版本。

Javascript版本

飞镖版

在前端开发中,显示数字是非常普遍的要求。 与统计或科学报告中的那些报告最关注精度和标准化不同,前端中的数字更关心友好的用户体验。 让用户乍一看就知道数字,并保持页面整洁很重要。

在移动应用程序,后台管理系统或流行的数据可视化屏幕中,天气显示数字有一些共同的要求:

  • 受几何空间的限制,数字字符串不能溢出一定的长度。
  • 禁止使用null,NaN或undefined之类的字符串,在例外情况下最好使用占位符,例如“-”。
  • 对于大整数,请添加逗号作为组分隔符(1,234,222)或以单位转换(1.23k)。
  • 没有科学记数法(1.23e + 4)。
  • 没有尾随的十进制零。

如果有一个工具功能,只需简单的配置就可以将输入数字转换为所需的字符串,那将是非常好的。 特别是当几何空间有限时,它可以通过转换单位或减少小数位来自动修剪数字字符串:

-254623933.876 => -254.62 M
-1.2345e+5 => -123 , 450
12.000 => 12
NaN => --

数字显示是针对以下需求而构建的:

rstStr = display( -254623933.876 ) // result: -254.62M

用法

原则上将配置和用法分开,Number Display导出一个名为createDisplay的高阶函数。 通过将参数作为配置传递给createDisplay,我们可以定制小部件中使用的实际显示功能。

网络用途:

import createDisplay from 'number-display' ;const display = createDisplay({length : 8 ,decimal : 0 ,
});

{display(data)}

Flutter中的用法:

import 'package:number_display/number_display.dart' ;final display = createDisplay(length: 8 ,decimal : 0 ,
);print(display(data));

这使得使用display非常简洁,并且可以批量配置。 请注意,配置在Javascript中作为对象传递,但在Dart中称为参数。

现在,数字显示包括5种配置:

  • length:结果的最大长度。 长度不应小于5,以便修剪后可以显示任何数字(例如-123000)。
  • 小数:最大十进制长度。 请注意,这只是一个约束。 最终精度将根据长度计算,且小于此参数。 将没有十进制尾随零。
  • 占位符:输入既不是字符串也不是数字,或者输入是NaN,Infinity或-Infinity时的结果。 如果长度超过长度参数,它将被切片。
  • allowText:允许文本 (无法转换为数字的字符串)作为输入和结果。 它将在长度参数内切片。 如果为false,则文本结果将为占位符。 请注意,某些特殊格式将被视为诸如“ NaN”,“-1.2345e + 5”之类的文本。 请注意,Dart版本没有此参数。
  • 逗号:如果有房间,则区域设置字符串是否具有逗号(1,234,222)。
整理原则

当显示在页面上时,数字字符串受几何空间限制。

从理论上讲,在设计小部件的大小时,应考虑其值的长度。 但是实际上,它不可能如此全面,并且响应总是落在前端开发人员的手中。

数字的形式可以灵活,但是字符串绝对不可接受在小部件外部溢出。 这是最高优先级。 这是数字显示的主要功能。 当长度受限制时,“数字显示”将按以下顺序修剪数字字符串:

  • 省略区域逗号
  • 将左小数部分切成小数
  • 用数字单位(k,M,G,T,P)修剪整数
  • 如果长度> = 5,则可以在其中修剪任何数字。 如果小于5并且输入数字太长,则显示将引发错误。
源代码

引擎盖后面的数字显示主要使用正则表达式来处理数字字符串。 步骤如下:

1.法律判断

对于Javascript(这是一种非常动态的语言),实际上输入的“数字”可以是数字或字符串:

if ((type !== 'number' && type !== 'string' )|| (type === 'number' && ! Number .isFinite(value))
) {return placeholder;
}

对于静态类型的Dart,我们宣布输入类型为num:

if (value == null || !value.isFinite) {return placeholder;
}

2.切符号,整数和小数部分

符号,整数和小数部分由分隔符“-”和“。”标识。 引用Ant Design Statistic组件的代码 ,并使用Javascript中的String.match函数,我们可以匹配多个模式,并在一行中将所有三个部分作为一个数组获得:

const cells = value.match( /^(-?)(\d*)(\.(\d+))?$/ );

但是在Dart中,我们没有这样的技巧:

final negative = RegExp (r '^-?' ).stringMatch(valueStr) ?? '' ;
final integer = RegExp (r '\d+' ).stringMatch(valueStr) ?? '' ;
final deciRaw &#61; RegExp (r &#39;(?<&#61;\.)\d&#43;$&#39; ).stringMatch(valueStr) ?? &#39;&#39; ;

实际上dart中的正则表达式正在优化&#xff0c;我们注意到在所有最新版本&#xff08;2.1-2.4&#xff09;中正则表达式都有变化。

3.修剪小数部分

省略逗号分隔符后&#xff0c;如果空间仍然有限&#xff0c;则十进制长度将减小。 请注意&#xff0c;由于小数点仅在存在小数部分时出现&#xff0c;因此长度会有两个边界&#xff0c;0和2。 同时&#xff0c;我们将通过以下方式减去尾随零&#xff1a;

&#xff08;对于左侧&#xff0c;Javascript和Dart代码非常相似&#xff0c;因此我们仅以Javascript代码为例&#xff09;

let space &#61; length - negative.length - int.length;
if (space >&#61; 2 ) {deciShow &#61; deci.slice( 0 , space - 1 ).replace( /0&#43;$/ , &#39;&#39; );return &#96; ${negative} ${int} ${deciShow && &#39;.&#39; } ${deciShow} &#96; ;
}
if (space >&#61; 0 ) {return &#96; ${negative} ${int} &#96; ;
}

4.修剪整数部分

如果字符串仍然溢出&#xff0c;则必须使用诸如k或M之类的单位转换整数部分。由于我们之前添加了组分隔符&#xff1a;

const localeInt &#61; int.replace( /\B(?&#61;(\d{3})&#43;(?!\d))/g , &#39;,&#39; );

我们可以用它来计算我们需要的单位&#xff1a;

const sections &#61; localeInt.split( &#39;,&#39; );
const units &#61; [ &#39;k&#39; , &#39;M&#39; , &#39;G&#39; , &#39;T&#39; , &#39;P&#39; ];
const unit &#61; units[sections.length - 2 ];

最后&#xff0c;与修整小数部分相同&#xff0c;将尾随的部分减小到左边的空间&#xff1a;

space &#61; length - negative.length - mainSection.length - 1 ;
if (space >&#61; 2 ) {const tailShow &#61; tailSection.slice( 0 , space - 1 ).replace( /0&#43;$/ , &#39;&#39; );return &#96; ${negative} ${mainSection} ${tailShow && &#39;.&#39; } ${tailShow} ${unit} &#96; ;
}if (space >&#61; 0 ) {return &#96; ${negative} ${mainSection} ${unit} &#96; ;
}

讨论区

在开发过程中&#xff0c;通常不显示数字&#xff0c;并且其中确实没有深层的技术。 但是&#xff0c;如果我们不能彻底考虑&#xff0c;就会有很多麻烦。

以上原则寻求更多共同点。 但是总是有独特的需求&#xff0c;因此我们试图使其可配置。 数字显示经历了两次重大更新&#xff0c;并简化了配置。 为了获得更好的性能&#xff0c;我们使用正则表达式操作更改了一些循环和判断。 希望您能提供一些建议&#xff1a;

问题&#xff08;Javascript&#xff09;

问题&#xff08;飞镖&#xff09;



From: https://hackernoon.com/tips-for-displaying-frontend-numbers-in-a-friendly-manner-bf9t37gv



推荐阅读
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文介绍了Go语言中正则表达式的基本使用方法,并提供了一些实用的示例代码。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Python正则表达式详解:掌握数量词用法轻松上手
    Python正则表达式详解:掌握数量词用法轻松上手 ... [详细]
  • python模块之正则
    re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • Python内置模块详解:正则表达式re模块的应用与解析
    正则表达式是一种强大的文本处理工具,通过特定的字符序列来定义搜索模式。本文详细介绍了Python内置的`re`模块,探讨了其在字符串匹配、验证和提取中的应用。例如,可以通过正则表达式验证电子邮件地址、电话号码、QQ号、密码、URL和IP地址等。此外,文章还深入解析了`re`模块的各种函数和方法,提供了丰富的示例代码,帮助读者更好地理解和使用这一工具。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • 利用Java开发功能完备的电话簿应用程序,支持添加、查询与删除操作
    本研究基于Java语言开发了一款功能全面的电话簿应用程序,实现了与数据库的高效连接。该应用不仅支持添加、查询和删除联系人信息,还具备输出最大和最小ID号的功能,并能够对用户输入的ID号进行有效性验证,确保数据的准确性和完整性。详细实现方法可参阅相关文档。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
author-avatar
双子-殇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有