JDK12的新特性之CompactNumberFormat详解

简介

JDK12引入了新的格式化数字的类叫做CompactNumberFormat。主要方便我们对很长的数字进行简写。比如1000可以简写为1K或者1 thousand。

本文将会讲解CompactNumberFormat的基本构成和使用方法,最后在实际的例子中结束文章的讲解。

更多内容请访问www.flydean.com

CompactNumberFormat详解

CompactNumberFormat做为格式化数字的一部分是NumberFormat的子类。作用就是将数字进行格式化。要想构建一个CompactNumberFormat,最简单的办法就是使用NumberFormat.getCompactNumberInstance方法了。

下面是该方法的定义:

 public static NumberFormat getCompactNumberInstance(Locale locale,
   NumberFormat.Style formatStyle)

方法需要传入两个参数:Locale和Style。

Locale

Locale代表着本地语言特性,比如在US locale中,10000可以表示为“10K”,而在China locale中,10000中就变成了“1万”。

Style

Style有两种类型,short和long。比如说10000的short表示是“10K”,而它的long表示是“10 thousand”。

JDK已经为我们自定义了很多种内置的Compact实现,我们可以直接使用:

@Test
 public void testCompactNumberFormat(){
  NumberFormat fmtShort = NumberFormat.getCompactNumberInstance(
    Locale.US, NumberFormat.Style.SHORT);
  NumberFormat fmtLong = NumberFormat.getCompactNumberInstance(
    Locale.US, NumberFormat.Style.LONG);
  log.info(fmtShort.format(312));
  log.info(fmtShort.format(3123));
  log.info(fmtShort.format(31234));
  log.info(fmtLong.format(312));
  log.info(fmtLong.format(3123));
  log.info(fmtLong.format(31234));
 }

输出结果:

312
 3K
 31K
 312
 3 thousand
 31 thousand

自定义CompactNumberFormat

除了使用NumberFormat工具类之外,我们还可以自定义CompactNumberFormat。

先看下CompactNumberFormat的定义:

public CompactNumberFormat(String decimalPattern,
DecimalFormatSymbols symbols, String[] compactPatterns)
public CompactNumberFormat(String decimalPattern,
DecimalFormatSymbols symbols, String[] compactPatterns,
String pluralRules)

CompactNumberFormat可以接受3个或者4个参数的构造函数。

其中decimalPattern和symbols是用来正常解析数字的,compactPatterns则是用来生成缩写。pluralRules表示的是复数规则。

@Test
 public void useCustom(){
   String[] compactPatterns
    = {"", "", "", "0千", "0万", "00万", "0百万", "0千万", "0亿",
    "00亿", "0百亿", "0千亿", "0兆", "00兆", "000兆"};
   DecimalFormat decimalFormat = (DecimalFormat)
    NumberFormat.getNumberInstance(Locale.CHINA);
   CompactNumberFormat format
    = new CompactNumberFormat( decimalFormat.toPattern(),
    decimalFormat.getDecimalFormatSymbols(),
    compactPatterns);
  log.info(format.format(312340000));
 }

上面是一个我们自定义的缩写规则。

输出结果:

3亿

解析CompactNumber

能生成自然也能够解析,我们看一个解析的例子:

 @Test
 public void testParse() throws ParseException {
  NumberFormat fmtLong = NumberFormat.getCompactNumberInstance(
    Locale.US, NumberFormat.Style.LONG);
  log.info(String.valueOf(fmtLong.parse("3 thousand")));
 }

输出结果:

3000

总结

本文介绍了JDK12中引入的新的CompactNumberFormat类,希望大家能够喜欢。

本文的例子

[https://github.com/ddean2009/
learn-java-base-9-to-20](https://github.com/ddean2009/
learn-java-base-9-to-20)

到此这篇关于JDK12的新特性:CompactNumberFormat的文章就介绍到这了,更多相关JDK12的新特性:CompactNumberFormat内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JDK14性能管理工具之Jconsole的使用详解

    我们在开发java项目的时候,或多或少都会去用到Java的性能管理工具.有时候是为了提升应用程序的性能,有时候是为了查找java应用程序的bug. 性能监控和调试工具在英文中叫做profile tool,提起这种工具大家可能会想到一些非常出名的jprofile等收费工具,其实JDK也自带了一些性能调试工具,比如JMC和Jconsole. JMC现在已经和JDK的版本独立出来了,详情请参考我之前的文章: JDK 14的新特性:JFR,JMC和JFR事件流 ,今天我们将会重点讲解Jconsole的使

  • JDK14性能管理工具之jstack使用介绍

    在之前的文章中,我们介绍了JDK14中jstat工具的使用,本文我们再深入探讨一下jstack工具的使用. jstack工具主要用来打印java堆栈信息,主要是java的class名字,方法名,字节码索引,行数等信息. jstack的命令格式 Usage: jstack [-l][-e] <pid> (to connect to running process) Options: -l long listing. Prints additional information about lock

  • 在windows环境下安装jdk8、jdk9、jdk11、jdk12并自由切换

    在windows环境下安装jdk8.jdk9.jdk11.jdk12并自由切换在windows下安装jdk的各个版本安装各个版本的jdk,并设置安装路径配置环境各个版本的环境变量设置JAVA_HOME设置path切换jdk版本 在windows下安装jdk的各个版本安装各个版本的jdk,并设置安装路径 jdk8安装在C:\ProgramFile\Java jdk11安装在C:\ProgramFile\Java jdk12安装在C:\ProgramFile\Java jdk9安装在C:\Java9

  • Java中JDK14的新特性之JFR,JMC和JFR事件流(推荐)

    简介 Java Flight Recorder(JFR)是JVM的诊断和性能分析工具.它可以收集有关JVM以及在其上运行的Java应用程序的数据.JFR是集成到JVM中的,所以JFR对JVM的性能影响非常小,我们可以放心的使用它. 一般来说,在使用默认配置的时候,性能影响要小于1%. JFR的历史很久远了.早在Oracle2008年收购BEA的时候就有了.JFR一般和JMC(Java Mission Control)协同工作. JFR是一个基于事件的低开销的分析引擎,具有高性能的后端,可以以二进

  • 浅析JDK12的五大重要新特性(推荐)

    JDK12的五大重要新特性 Java12在March 19, 2019发布了. 在2017年发布Java 9之后,Java平台发布节奏已从每3年以上的主要版本转变为每6个月发布一次功能.现在,每年的3月和9月都会发布新的版本功能. 从而提供了更细化,更快和可管理的版本更新. 这是一个好消息,不好的就是大家会觉得JDK的版本更新太快了. 什么?JDK12已经出来了? 什么?9月份要出JDK13了? 什么?我还在用JDK8? 废话少说,我们来看下JDK12的五个比较重要的新特性: 引入JVM常量AP

  • JDK12的新特性之teeing collectors

    简介 JDK12为java.util.stream.Collectors添加了一个新的teeing方法,怎么翻译呢?看到很多人都把它翻译成"发球台",我不禁潸然泪下,哪里有那么复杂,tee就是T.它的作用就像是一个T型,数据从两头进入,然后从一头流出.teeing的作用也就在此. talk is cheap, show me the code 我最喜欢的就是一言不合上代码,文字的描述总是让人有点摸不着头脑,程序员还是要用程序说话.有了程序就有了逻辑,有了逻辑一切都有了. 各大网站上的例

  • JDK12的新特性之CompactNumberFormat详解

    简介 JDK12引入了新的格式化数字的类叫做CompactNumberFormat.主要方便我们对很长的数字进行简写.比如1000可以简写为1K或者1 thousand. 本文将会讲解CompactNumberFormat的基本构成和使用方法,最后在实际的例子中结束文章的讲解. 更多内容请访问www.flydean.com CompactNumberFormat详解 CompactNumberFormat做为格式化数字的一部分是NumberFormat的子类.作用就是将数字进行格式化.要想构建一

  • SpringBoot2.3新特性优雅停机详解

    什么是优雅停机 先来一段简单的代码,如下: @RestController public class DemoController { @GetMapping("/demo") public String demo() throws InterruptedException { // 模拟业务耗时处理流程 Thread.sleep(20 * 1000L); return "hello"; } } 当我们流量请求到此接口执行业务逻辑的时候,若服务端此时执行关机 (ki

  • C#11新特性使用案例详解

    目录 前言 新特性之原始字符串 使用案例 原始字符串使用需要注意的地方 什么情况下需要超过三个双引号开头 尾引号和尾引号前面的换行符不包括在最终内容中 结尾的三个引号不另起一行行不行 和内插字符一起使用 总结 前言 在日常开发中我们经常会将JSON.XML.HTML.SQL.Regex等字符串拷贝粘贴到我们的代码中,而这些字符串往往包含很多的引号",我们就必须将所有引号逐个添加转义符\进行转义.这个转义十分麻烦,且容易出错,而当我们们需要替换这些字符串时,重新粘贴进来的文本仍需要再次进行转义,简

  • JDK19新特性使用实例详解

    目录 前提 新特性列表 新特性使用详解 Record模式 Linux/RISC-V移植 外部函数和内存API 虚拟线程 向量API switch匹配模式 结构化并发 前提 JDK19于2022-09-20发布GA版本,本文将会详细介绍JDK19新特性的使用. 新特性列表 新特性列表如下: JPE-405:Record模式(预览功能) JPE-422:JDK移植到Linux/RISC-V JPE-424:外部函数和内存API(预览功能) JPE-425:虚拟线程,也就是协程(预览功能) JPE-4

  • Java8新特性 StreamAPI实例详解

    目录 Stream结果收集 结果收集到集合中 结果收集到数组中 对流中的数据做聚合计算 对流中数据做分组操作 对流中的数据做分区操作 对流中的数据做拼接 并行的Stream流 串行的Stream流 并行流 获取并行流 并行流操作 并行流和串行流对比 线程安全问题 Stream结果收集 面试官:说说你常用的StreamAPI. 结果收集到集合中 public static void main(String[] args){ // Stream<String> stream = Stream.of

  • JDK13的新特性之AppCDS详解

    简介 AppCDS的全称是Application Class-Data Sharing.主要是用来在不同的JVM中共享Class-Data信息,从而提升应用程序的启动速度. 通常来说,如果要执行class字节码,JVM需要执行下面的一些步骤:给定一个类的名字,JVM需要从磁盘上面找到这个文件,加载,并验证字节码,最后将它加载进来. 如果JVM启动的时候需要加载成百上千个class,那么需要的就不是一个小数目了. 对于打包好的jar包来说,只要jar的内容不变,那么jar包中的类的数据始终是相同的

  • Vue高版本中一些新特性的使用详解

    一.深度作用选择器( >>> ) 严格来说,这个应该是vue-loader的功能."vue-loader": "^12.2.0" 在项目开发中,如果业务比较复杂,特别像中台或B端功能页面都不可避免的会用到第三方组件库,产品有时会想对这些组件进行一些UI方面的定制.如果这些组件采用的是有作用域的CSS,父组件想要定制第三方组件的样式就比较麻烦了. 深度作用选择器( >>> 操作符)可以助你一臂之力. <template>

  • SpringBoot2新特性 自定义端点详解

    SpringBoot2新特性 自定义端点 package com.yan.otlan.springboot; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.boot.actuate.endpoint.a

  • react-router v6新特性总结示例详解

    目录 支持嵌套路由 Outlet 嵌套路由可配置化 useNavigate代替useHistory 由于之前的项目一直使用的是V5版本,最新新建项目的时候,默认使用的是V6版本,根据官方的介绍,V6版本的新特性如下. 新特性 <Switch>重命名为<Routes>: <Route>的新特性变更: 嵌套路由变得更简单: 新钩子useRoutes代替react-router-config: 用useNavigate代替useHistory: Link不再支持compone

  • Java8新特性之Base64详解_动力节点Java学院整理

    BASE64 编码是一种常用的字符编码,在很多地方都会用到.但base64不是安全领域下的加密解密算法.能起到安全作用的效果很差,而且很容易破解,他核心作用应该是传输数据的正确性,有些网关或系统只能使用ASCII字符.Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据. JDK里面实现Base64的API 在JDK1.6之前,JDK核心类一直没有Base64的实现类,有人建议用Sun/Oracle JDK里面

随机推荐