开发过程中,通常会遇到一个问题:我们需要将一个数值转换为格式化的数值,比:3.145678保留两位有效数字,这时候我们该用什么方法来转换呢?
这篇笔记,将教会我们如何将String、double、float格式化为我们所需要的格式(比如:保留两位小数),而我们要用到的对象就是:DecimalFormat。

1、DecimalFormat的介绍

  • 全路径名:java.text.DecimalFormat

  • JavaSE官方文档的描述:
    DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。

  • 舍入
    DecimalFormat 提供 RoundingMode 中定义的舍入模式进行格式化。默认情况下,它使用 RoundingMode.HALF_EVEN。
    以上是JavaSE官方文档的一些描述,下面我们需要进行一些自己的使用总结。

2、使用方法

2.1、占位符的使用

我们要实现格式化数据,需要使用到DecimalFormat的其中一个构造方法:

public DecimalFormat(String pattern)

构造参数pattern就是用来格式化的:一个非本地化的模式字符串。
0和#都是常用的占位符,但是他们俩还有些区别。
下面我们举几个例子看看pattern的具体使用,以及0和#的区别。

2.1.1 - 0占位符的使用

  • 占位符比实际数字多
new DecimalFormat("00.00").format(3.14567);//结果:03.15
new DecimalFormat("0.000").format(3.14);//结果:3.140
new DecimalFormat("00.000").format(3.14);//结果:03.140
  • 占位符比实际数字少
new DecimalFormat("00.00").format(13.14567);//结果:13.15
new DecimalFormat("0.000").format(13.14567);//结果:13.146
new DecimalFormat("0.00").format(13.14567);//结果:13.15

总结
使用0占位符的时候:
1、 比实际数字的位数多,不足的地方用0补上。
2、 比实际数字的位数少:整数部分不改动,小数部分,四舍五入(其实并不是四舍五入,而是默认的RoundingMode.HALF_EVEN方式,下面会讲到DecimalFormat的舍入方式)。

2.1.2 - #占位符的使用

  • 占位符比实际数字多
new DecimalFormat("##.##").format(3.14567);//结果:3.15
new DecimalFormat("#.###").format(3.14);//结果:3.14
new DecimalFormat("##.###").format(3.14);//结果:3.14
  • 占位符比实际数字少
new DecimalFormat("#.###").format(13.145678);//结果:13.146
new DecimalFormat("##.##").format(13.14567);//结果:13.15
new DecimalFormat("#.##").format(13.14567);//结果:13.15

总结
使用#占位符的时候:
1、 比实际数字的位数多,不变。
2、 比实际数字的位数少:整数部分不改动,小数部分,四舍五入(其实并不是四舍五入,而是默认的RoundingMode.HALF_EVEN方式,下面会讲到DecimalFormat的舍入方式)。

2.1.3 占位符使用总结

通过上面的例子,可以看到0和#占位符的区别,在实际使用的时候,可以根据不同需来选择占位符。
比如:
1、格式化数字,保留两位小数,不足的小数部分用0代替,这时候,我们就可以使用:“0.00”;
2、格式化数字,只保留有效数字,最多保留两位小数,这时候,我们就可以使用:"#.##"。

2.2 DecimalFormat的格式化方式(舍入方式)

在以上的几个例子,我们可以发现,当要格式化的数字超过占位符的时候,格式化的结果会进行四舍五入。这并不是按照四舍五入的方式舍入的,而是因为没有指定格式化的RoundingMode,而默认使用了RoundingMode.HALF_EVEN方式。

关于RoundingMode,这里就不做介绍了,可以参照另一篇笔记BigDecimal - 用于加、减、乘、除计算的工具类,里面对RoundingMode进行了详细的介绍。

  • 使用方式
    下面举两个例子,指定舍入方式的格式化。
DecimalFormat format = new DecimalFormat("#.##");
//指定舍入方式为:RoundingMode.DOWN,直接舍去格式化以外的部分
format.setRoundingMode(RoundingMode.DOWN);
String formatDown = format.format(13.14567);//结果:13.14
//指定舍入方式为:RoundingMode.HALF_UP,四舍五入
format.setRoundingMode(RoundingMode.HALF_UP);
String formatHalfUp = format.format(13.14567);//结果:13.15

总结
关于DecimalFormat 的舍入方式,可以参考以上的例子,根据需求的不同,使用对应的RoundingMode。

3、封装

在BigDecimal - 用于加、减、乘、除计算的工具类这篇笔记中,我们说过,要用String类型进行加、减、乘、除运算。所以,我们接受服务器返回的数据都是用String类型接收的,这时候我们用DecimalFormat 如何格式化String类型的数据呢?

  • 下面是个例子来实现String类型的格式化,将String类型的数据,格式化为只保留有效数字,最多保留两位小数,采用截取方式的方法(这个方法返回的是double,至于返回String、float、int都是可以的)。
    /*** @param str 需要格式化的字符串* @return 格式化后的double型数值*/public static double stringToDouble(String str) {if (TextUtils.isEmpty(str)) {return 0;}DecimalFormat format = new DecimalFormat("#.##");//提供 RoundingMode 中定义的舍入模式进行格式化。默认情况下,它使用 RoundingMode.HALF_EVEN。format.setRoundingMode(RoundingMode.DOWN);//使用BigDecimal对象来将String类型转换为DecimalFormat可以格式化的类型。String formatStr = format.format(new BigDecimal(str));//将格式化后的类型,转换为double类型(当然,也可以转换为float或int,视需求而定)。BigDecimal bigDecimal = new BigDecimal(formatStr);return bigDecimal.doubleValue();}

4、总结

以上是DecimalFormat的一些基础使用,在实际开发过程中:
1、根据不同需求,来判断使用哪种占位符:0、#;
2、根据不同需求,来判断使用哪种舍入方式:RoundingMode.DOWN、RoundingMode.HALF_UP等等。

DecimalFormat - 格式化数据相关推荐

  1. MPAndroidChart使用记录

    文章目录 前言 举例说明一些概念 Chart设置 补充1:ViewPortHandler类 补充2:设置空数据文案 补充3:设置触摸监听并打印当前坐标 补充4:给chart设置一组数据 折线图示例 柱 ...

  2. Android中DecimalFormat的用法

    import java.text.*; import java.util.*; public class DecimalFormatSample {  public static void main( ...

  3. Android DecimalFormat详解

    转至:http://blog.csdn.net/brucexu1978/article/details/7598911 import java.text.*; import java.util.*; ...

  4. DecimalFormat 的使用

    DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字 默认采用的是四舍五入模式,当然我们可以修改模式 具体用法如下 符号 位置 本地化? 含义 0 数字 是 ...

  5. java中decimalFormat格式化数值

    介绍 我们经常要对数字进行格式化,比如取小数点后两位小数,或者加个百分比符号等,Java提供了DecimalFormat这个类 0 和 # 的区别 "#"可以理解为在正常的数字显示 ...

  6. java中关于DecimalFormat四舍五入的用法

    DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字.它可以支持不同类型的数,包括整数 (123).定点数 (123.4).科学记数法表示的数 (1.23E4 ...

  7. Java DecimalFormat 用法 小数位的处理 公司内部处理小数位

    <pre name="code" class="javascript"><pre name="code" class=&q ...

  8. decimalformat精度丢失_笔记一:DecimalFormat BigDecimal

    一.DecimalFormat(数字格式化) 例1: import java.text.DecimalFormat; public class Test{ public static void mai ...

  9. (转)java DecimalFormat用法

    DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字. DecimalFormat 包含一个模式 和一组符号 符号含义: 0 一个数字 # 一个数字,不包括 ...

最新文章

  1. Windows 10预览版14316开启Bash命令支持
  2. NLP学习思维导图,非常的全面和清晰
  3. Frost Sullivan权威报告:阿里云再次领跑云WAF大中华区市场
  4. gitlab的日常使用
  5. NB模组基本AT指令
  6. 计算机在管理会计应用中的作用,信息化在管理会计中的作用
  7. 2017.10.1 蚯蚓 思考记录
  8. 【超详细】在Linux上远程登录遇到的若干问题及解决方法(一)
  9. MaxScript与外部程序通讯
  10. oracle的dbv命令,Oracle的DBV命令行工具用法详解
  11. Python之网络数据采集入门常用模块初识
  12. linux如何查看路由器ip地址,如何查找路由器IP地址?
  13. Unity一键更换TextMeshPro的字体
  14. 微信小程序游戏开发介绍,微信互动游戏有哪些?
  15. 杭州端点科技java,端点实习面试(一面)
  16. [网络安全自学篇] 七十二.逆向分析之OllyDbg动态调试工具(一)基础入门及TraceMe案例分析
  17. 利用CIBERSORT免疫细胞类群分析详细教程
  18. android devik进程,suckit后门程序的分析 (二)
  19. C#源码QQ空间自动点赞神器,无需密码直接点头像登录,可加自动功能评论转发等。
  20. 全世界的程序员,我只服女程序员

热门文章

  1. 2021年12月10日
  2. 将下列计算机中文翻译成英文,急...将计算机类英文翻译成中文
  3. gsm模块网站服务器,GPRS模块与GSM模块的七大区别
  4. 面试直播,真刀真枪的干一场!实战派VS学术派
  5. 解决html5语意标签在IE低版本浏览器下的兼容问题:
  6. 竣达技术丨多台精密空调微信云监控方案
  7. 安居客新建表必须回答DBA的5个问题(DBRT规范)
  8. 配置基于接口的ARP表项限制和端口安全(限制用户私自接入傻瓜交换机或非法主机接入)
  9. 【Python】音乐可视化播放器(PyQt5 + matplotlib.animation)
  10. Dev-C++ 下载安装教程【超详细】