java格式化数字操作 NumberFormat及DecimalFormat
作者:知我饭否 时间:2023-02-23 22:03:23
前言
以前用到要对数字格式的地方,都是直接到网上搜一下。拿过来能用就行。因为平时用的不多。但是最近的项目对这个用的多了。网上拿来的不够用了。自己看了java源码把这方面恶补了。而且最近也好长时间没有写博客了。正好写一篇抛砖引玉吧。
如果你只想知道怎么用,可以直接看下面使用示例↓↓↓。三分钟速成。
如果你对java源码比较了解。你会发现java对文字,数字的格式化,是有一个公共的父类的Format。
NumberFormat和DecimalFormat都是它的子类关于数字的。
DateFormat和SimpleDateFormat也是它的子类关于文字的。
当然今天只说NumberFormat和DecimalFormat。相信我,当你搞懂这两个以后,那么DateFormat和SimpleDateFormat也是肯定会的。
首先,要特别注意的是 NumberFormat和DecimalFormat是线程不安全的。 这意味你如果同时有多个线程操作一个format实例对象,会出现意想不到的结果。
解决方法有两个:
为每个线程都创建一个 format实例,通过ThreadLocal 来给每个线程都产生一个本地实例。如果你对ThreadLocal不了解,可以看我这篇文章:ThreadLocal 的用法以及内存泄露(内存溢出)
进行外部同步,这个就可以通过关键词 synchronized来进行同步。如果 你不了解synchronized,可以看我这篇文章:synchronized 参数 及其含义
上面的这两种方法呢,
第一种方法 **比较占用内存多,但是速度快,效率高。并发。**第二种方法 **占用内存少,效率低,耗费时间长,毕竟要排队嘛,串行。**具体取舍,看项目的情况。
JavaAPI官方描述
NumberFormat
NumberFormat帮助您格式化和解析任何区域设置的数字。您的代码可以完全独立于小数点,千位分隔符的区域设置约定,甚至是使用的特定十进制数字,或者数字格式是否为十进制。
DecimalFormat
DecimalFormat是NumberFormat十进制数字格式的具体子类 。它具有多种功能,旨在解析和格式化任何语言环境中的数字,包括支持西方,阿拉伯语和印度语数字。它还支持不同类型的数字,包括整数(123),定点数(123.4),科学记数法(1.23E4),百分比(12%)和货币金额(123美元)。所有这些都可以本地化。
NumberFormat
获取NumberFormat实例
//创建 一个整数格式 地区用系统默认的
NumberFormat integerNumber = NumberFormat.getIntegerInstance(Locale.getDefault());
使用getInstance或getNumberInstance获取正常的数字格式。
使用getIntegerInstance得到的整数格式。
使用getCurrencyInstance来获取货币数字格式。
使用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 {
//强制转换成DecimalFormat
numberDecimalFormat = (DecimalFormat) numberFormat;
//保留小数点后面三位,不足的补零,前面整数部分 每隔四位 ,用 “,” 符合隔开
numberDecimalFormat.applyPattern("#,####.000");
//设置舍入模式 为DOWN,否则默认的是HALF_EVEN
numberDecimalFormat.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");
//设置小数部分 最小位数为2
percentFormat.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时候 是1000
currencyFormat.setMultiplier(100);
System.out.println(currencyFormat.format(0.912345));
} catch (Exception e) {
e.printStackTrace();
}
运行结果:
整数格式
因为它很简单,作用就是只解析 整数部分的。小数部分的会被舍入。
例如 “3456.78”→3456(并且在索引6之后保留解析位置)
来源:https://blog.csdn.net/a1064072510/article/details/89887633
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
详谈Java中net.sf.json包关于JSON与对象互转的坑
![](https://img.aspxhome.com/file/2023/0/65180_0s.jpg)
逆转交替合并两个链表的解析与实现
![](https://img.aspxhome.com/file/2023/2/88752_0s.png)
探究实现Aware接口的原理及使用
![](https://img.aspxhome.com/file/2023/0/126350_0s.jpg)
C语言实现四窗口聊天
![](https://img.aspxhome.com/file/2023/1/121431_0s.jpg)
Android开发之HttpClient异步请求数据的方法详解【附demo源码下载】
![](https://img.aspxhome.com/file/2023/8/123248_0s.png)
探讨:将两个链表非降序合并为一个链表并依然有序的实现方法
Java中BigDecimal类的使用详解
![](https://img.aspxhome.com/file/2023/0/62770_0s.png)
C#实现自定义打印文字和图片的示例代码
![](https://img.aspxhome.com/file/2023/2/110172_0s.png)
C# WinForm窗体编程中处理数字的正确操作方法
Springboot全局异常捕获及try catch区别解析
![](https://img.aspxhome.com/file/2023/7/59227_0s.png)
Android微信SDK实现分享
MyBatis中${} 和 #{} 有什么区别小结
![](https://img.aspxhome.com/file/2023/2/89572_0s.jpg)
Winform应用程序如何使用自定义的鼠标图片
Android使用ViewPager实现类似laucher左右拖动效果
![](https://img.aspxhome.com/file/2023/4/98634_0s.png)
Android-App增量更新的使用姿势
![](https://img.aspxhome.com/file/2023/7/139137_0s.jpg)
详解Java中Optional类的使用方法
![](https://img.aspxhome.com/file/2023/4/59694_0s.png)
Java中对话框的弹出方法
Java Swing组件布局管理器之FlowLayout(流式布局)入门教程
![](https://img.aspxhome.com/file/2023/1/61581_0s.gif)
Android Studio和阿里云数据库实现一个远程聊天程序
![](https://img.aspxhome.com/file/2023/4/92614_0s.jpg)
C和指针小结(推荐)
![](https://img.aspxhome.com/file/2023/7/127527_0s.png)