前言

以前用到要对数字格式的地方,都是直接到网上搜一下。拿过来能用就行。因为平时用的不多。但是最近的项目对这个用的多了。网上拿来的不够用了。自己看了java源码把这方面恶补了。而且最近也好长时间没有写博客了。正好写一篇抛砖引玉吧。

如果你只想知道怎么用,可以直接看下面使用示例↓↓↓。三分钟速成。

正文

如果你对java源码比较了解。你会发现java对文字,数字的格式化,是有一个公共的父类的Format
NumberFormat和DecimalFormat都是它的子类关于数字的。
DateFormat和SimpleDateFormat也是它的子类关于文字的

当然今天只说NumberFormat和DecimalFormat。相信我,当你搞懂这两个以后,那么DateFormat和SimpleDateFormat也是肯定会的。

首先,要特别注意的是 NumberFormat和DecimalFormat是线程不安全的。 这意味你如果同时有多个线程操作一个format实例对象,会出现意想不到的结果。
解决方法有两个:

  1. 为每个线程都创建一个 format实例,通过ThreadLocal 来给每个线程都产生一个本地实例。如果你对ThreadLocal不了解,可以看我这篇博客
    ThreadLocal 的用法以及内存泄露(内存溢出)
  2. 进行外部同步,这个就可以通过关键词 synchronized来进行同步。如果 你不了解synchronized,可以看我这篇博客synchronized 参数 及其含义

上面的这两种方法呢,
第一种方法 **比较占用内存多,但是速度快,效率高。并发。**第二种方法 **占用内存少,效率低,耗费时间长,毕竟要排队嘛,串行。**具体取舍,看项目的情况。

JavaAPI官方描述

NumberFormat

NumberFormat帮助您格式化和解析任何区域设置的数字。您的代码可以完全独立于小数点,千位分隔符的区域设置约定,甚至是使用的特定十进制数字,或者数字格式是否为十进制。

DecimalFormat

DecimalFormat是NumberFormat十进制数字格式的具体子类 。它具有多种功能,旨在解析和格式化任何语言环境中的数字,包括支持西方,阿拉伯语和印度语数字。它还支持不同类型的数字,包括整数(123),定点数(123.4),科学记数法(1.23E4),百分比(12%)和货币金额(123美元)。所有这些都可以本地化。

NumberFormat

获取NumberFormat实例

//创建 一个整数格式 地区用系统默认的
NumberFormat integerNumber = NumberFormat.getIntegerInstance(Locale.getDefault());
  1. 使用getInstance或getNumberInstance获取正常的数字格式。
  2. 使用getIntegerInstance得到的整数格式。
  3. 使用getCurrencyInstance来获取货币数字格式。
  4. 使用getPercentInstance获取显示百分比的格式。

常用方法


由于API 的描述足够详细,所以我就直接截图上来了。

使用示例

DecimalFormat是NumberFormat,所以,就不要单独的为NumberFormat写一个完整的示例了。只写一下配合FieldPosition怎么使用的示例:

NumberFormat numberFormat = NumberFormat.getInstance(Locale.getDefault());
//整数部分不会每隔三个,就会有 " ,"
numberFormat.setGroupingUsed(false);
//线程安全的字符串缓冲类
StringBuffer stringBuffer = new StringBuffer();
//构造参数 是Format子类里面的 自己特有的参数,传入就行
//构造 小数部分的,所以开始 beginIndex()是从小数点 后面算的,  但是0是从整个格式化数字,第一个算起, 包括 之间用于分组的 " ,"
FieldPosition fieldPosition = new FieldPosition(NumberFormat.FRACTION_FIELD);
stringBuffer = numberFormat.format(1234.56789, stringBuffer, fieldPosition);
System.out.println(stringBuffer.toString());
//小数部分, 所以 从5 开始
System.out.println(fieldPosition.getBeginIndex() + "   " + fieldPosition.getEndIndex());
//切割字符串
System.out.println(stringBuffer.toString().substring(fieldPosition.getBeginIndex()));

运行结果

DecimalFormat

获取DecimalFormat实例

要获取特定地区(包括默认地区)的NumberFormat,请调用NumberFormat的工厂方法之一,例如getInstance()。通常,不要直接调用DecimalFormat构造函数,因为NumberFormat工厂方法可能返回DecimalFormat之外的子类。如果需要自定义format对象,可以这样做:

        try {NumberFormat f = NumberFormat.getInstance(Locale.getDefault());if (f instanceof DecimalFormat) {((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true);//写具体的代码}} catch (Exception e) {e.printStackTrace();}

设置Pattern

DecimalFormat作为NumberFormat的具体实现子类,最大的特点就是 可以使用Pattern。来实现最大程度的对数据格式进行定制。
一个Pattern中的许多字符是按字面意思理解的;它们在解析期间匹配,在格式化期间输出不变,就是字符在Pattern中 不影响最后的数字格式化另一方面,特殊字符代表其他字符、字符串或字符类。如果要以文字形式出现在前缀或后缀中,必须引用它们(除非另有说明)。

子类特有的方法

因为懒,而且这玩意是在简单,大家就将就看个截图吧。

使用示例

接下来就是万众瞩目的示例代码了,只要java基础可以,一开始看这个完全就可以学会用法。

通用格式

        //创建一个默认的通用格式NumberFormat numberFormat = NumberFormat.getInstance();DecimalFormat numberDecimalFormat;//捕捉异常,以防强制类型转换出错try {//强制转换成DecimalFormatnumberDecimalFormat = (DecimalFormat) numberFormat;//保留小数点后面三位,不足的补零,前面整数部分 每隔四位 ,用 “,” 符合隔开numberDecimalFormat.applyPattern("#,####.000");//设置舍入模式 为DOWN,否则默认的是HALF_EVENnumberDecimalFormat.setRoundingMode(RoundingMode.DOWN);//设置 要格式化的数 是正数的时候。前面加前缀numberDecimalFormat.setPositivePrefix("Prefix  ");System.out.println("正数前缀  "+numberDecimalFormat.format(123456.7891));//设置 要格式化的数 是正数的时候。后面加后缀numberDecimalFormat.setPositiveSuffix("  Suffix");System.out.println("正数后缀  "+numberDecimalFormat.format(123456.7891));//设置整数部分的最大位数numberDecimalFormat.setMaximumIntegerDigits(3);System.out.println("整数最大位数 "+numberDecimalFormat.format(123456.7891));//设置整数部分最小位数numberDecimalFormat.setMinimumIntegerDigits(10);System.out.println("整数最小位数 "+numberDecimalFormat.format(123456.7891));//设置小数部分的最大位数numberDecimalFormat.setMaximumFractionDigits(2);System.out.println("小数部分最大位数 "+numberDecimalFormat.format(123.4));//设置小数部分的最小位数numberDecimalFormat.setMinimumFractionDigits(6);System.out.println("小数部分最小位数 "+numberDecimalFormat.format(123.4));}catch (Exception e){e.printStackTrace();}

运行结果

获取百分比格式

对数字 进行 百分比 格式化

        //创建一个中国地区的 百分比格式NumberFormat perFormat = NumberFormat.getPercentInstance(Locale.CHINA);DecimalFormat percentFormat;try {percentFormat = (DecimalFormat) perFormat;//设置Pattern 会使百分比格式,自带格式失效
//            percentFormat.applyPattern("##.00");//设置小数部分 最小位数为2percentFormat.setMinimumFractionDigits(2);System.out.println(percentFormat.format(0.912345));} catch (Exception e) {e.printStackTrace();}

运行结果:

货币格式

        //创建一个中国地区的 货币格式NumberFormat curFormat = NumberFormat.getCurrencyInstance(Locale.CHINA);DecimalFormat currencyFormat;try {currencyFormat = (DecimalFormat) curFormat;//设置Pattern 会使百分比格式,自带格式失效
//            currencyFormat.applyPattern("##.00");System.out.println(currencyFormat.format(0.912345));//乘法 数乘以多少 这个方法是 百分比时候 设置成100   km时候 是1000currencyFormat.setMultiplier(100);System.out.println(currencyFormat.format(0.912345));} catch (Exception e) {e.printStackTrace();}

运行结果:

整数格式

因为它很简单,作用就是只解析 整数部分的。小数部分的会被舍入。
例如 “3456.78”→3456(并且在索引6之后保留解析位置)

如果有不懂的,可以关注我的公众号 “知我饭否” 向我留言。我会每天更新一些文章,有兴趣的可以 微信 搜索"知我饭否" or 扫描我的 博客头像

java格式化数字 NumberFormat及DecimalFormat相关推荐

  1. java格式化数字DecimalFormat

    常用的几种需求格式 // 圆周率,请允许我用 π 这个命名,手动滑稽 double π = 3.1415926535898; 保留两位小数(多保留几位就多加几个零) new DecimalFormat ...

  2. (最简单)Java 格式化数字每3位加逗号分隔(自己封装好的工具类,直接可用)

    滴滴滴,快上车,都在备注里了~~~ package com.softsec.util;/*** Created with IDEA** @Author Chenhh* @Date 2019/12/11 ...

  3. java 格式化数字(每三位加逗号),保留两位小数。

    public String formatNumber(String num) {DecimalFormat df = new DecimalFormat("###,###.00") ...

  4. java 格式化 布尔型_这么久才知道Java中的format很强大!

    Java中允许我们对指定的对象进行某种格式化,从而得到我们想要的格式化样式. Format 首先介绍java.text包中的Format Foramt是一个抽象基类,其具体子类必须实现 format( ...

  5. java对数字的处理_[java初探10]__关于数字处理类

    前言 在我们的日常开发过程中,我们会经常性的使用到数字类型的数据,同时,也会有众多的对数字处理的需求,针对这个方面的问题,在JAVA语言中.提供解决方法的类就是数字处理类 java中的数字处理类包括: ...

  6. java中NumberFormat 、DecimalFormat的介绍及使用,java数字格式化,BigDecimal数字格式化

    文章目录 前言 一.NumberFormat 1.概述 2.实例化方法 3.货币格式化 4.百分比格式化 5.NumberFormat的坑 5.1.不同的格式化对象处理相同数值返回结果不同 问题 源码 ...

  7. Java数字格式:DecimalFormat

    在Java Numeric Formatting一文中 ,我描述并演示了NumberFormat静态方法提供的一些有用实例,例如NumberFormat.getNumberInstance(Local ...

  8. JAVA中计算百分比 格式化数字

    JAVA中计算百分比 格式化数字 这个是我在程序使用的例子: public String myPercent(int y,int z){    String baifenbi="" ...

  9. java输出数字格式化_Java™ 教程(格式化数字打印输出)

    格式化数字打印输出 以前你已经看到使用print和println方法将字符串打印到标准输出(System.out),因为全部数字均可以转换为字符串(你将在本课后面看到),你可使用这些方法打印出任意的字 ...

  10. Java中数字格式化

    在解决实际问题时,对数字的处理是非常普遍的,如数学问题.随机问题.商业货币问题.科学计数问题等.为了应对以上问题,Java提供了处理相关问题的类,包括DecimalFormat类(用于格式化数字).M ...

最新文章

  1. MyBatis 一个简单配置搞定数据加密解密!
  2. 【jq】c#零基础学习之路(1)Hello World!
  3. openshift 3 mysql_最新OpenShift免费空间申请与使用教程-1G内存1G空间支持PHP和MysqL
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的医院就诊系统
  5. jmx监控java进程_用VisualVM远程监控Java进程
  6. TensorFlow在win10上的安装与使用(二)
  7. 19春北理工计算机应用基础,19春北理工《计算机应用基础》在线作业(02)【标准答案】.doc...
  8. Python开发之路(1)— 使用Pyaudio进行录音和播音
  9. Xshell注册激活教程
  10. GitLab账号注册及分组
  11. Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
  12. html5在线俄罗斯方块,html5网页版俄罗斯方块小游戏代码
  13. matlab的比较器模块,simulink中的比较器
  14. 期权定价模型BS模型及反推隐含波动率 golang实现
  15. BYK-A500消泡剂:泡沫的一切都在计算中
  16. unity中的一个简单易用的A*寻路算法类
  17. 移动端页面有滚动条但是无法滚动的问题
  18. 一个优秀IT专家的成长历程 激励所有颓废的人们
  19. 博图SCL_先进先出排序法
  20. POI导出Excel遇到数据量大该如何解决

热门文章

  1. JVM之类的加载与类加载器
  2. 关于游戏乐趣的几点思考
  3. Python人脸检测与人脸数据集的生成
  4. 机械动力学瑞利法matlab程序,工业机器人的动力学建模与仿真+MATLAB程序
  5. php 读取js文件,JS中如何读取文件
  6. mysql alter table 速度慢_mysql问题: alter导致速度慢 | 学步园
  7. 同时处理知网、万方、维普数据库——CiteSpace、Ucinet、Vosviewer等
  8. Qt 网络编程制作一个客户端与服务器
  9. win7c语言命令行编译,易语言命令行编译工具
  10. 嵌入式控制K60考试复习