User-Profile-Image
hankin
  • 5
  • Java
  • Kotlin
  • Spring
  • Web
  • SQL
  • MegaData
  • More
  • Experience
  • Enamiĝu al vi
  • 分类
    • Zuul
    • Zookeeper
    • XML
    • WebSocket
    • Web Notes
    • Web
    • Vue
    • Thymeleaf
    • SQL Server
    • SQL Notes
    • SQL
    • SpringSecurity
    • SpringMVC
    • SpringJPA
    • SpringCloud
    • SpringBoot
    • Spring Notes
    • Spring
    • Servlet
    • Ribbon
    • Redis
    • RabbitMQ
    • Python
    • PostgreSQL
    • OAuth2
    • NOSQL
    • Netty
    • MySQL
    • MyBatis
    • More
    • MinIO
    • MegaData
    • Maven
    • LoadBalancer
    • Kotlin Notes
    • Kotlin
    • Kafka
    • jQuery
    • JavaScript
    • Java Notes
    • Java
    • Hystrix
    • Git
    • Gateway
    • Freemarker
    • Feign
    • Eureka
    • ElasticSearch
    • Docker
    • Consul
    • Ajax
    • ActiveMQ
  • 页面
    • 归档
    • 摘要
    • 杂图
    • 问题随笔
  • 友链
    • Spring Cloud Alibaba
    • Spring Cloud Alibaba - 指南
    • Spring Cloud
    • Nacos
    • Docker
    • ElasticSearch
    • Kotlin中文版
    • Kotlin易百
    • KotlinWeb3
    • KotlinNhooo
    • 前端开源搜索
    • Ktorm ORM
    • Ktorm-KSP
    • Ebean ORM
    • Maven
    • 江南一点雨
    • 江南国际站
    • 设计模式
    • 熊猫大佬
    • java学习
    • kotlin函数查询
    • Istio 服务网格
    • istio
    • Ktor 异步 Web 框架
    • PostGis
    • kuangstudy
    • 源码地图
    • it教程吧
    • Arthas-JVM调优
    • Electron
    • bugstack虫洞栈
    • github大佬宝典
    • Sa-Token
    • 前端技术胖
    • bennyhuo-Kt大佬
    • Rickiyang博客
    • 李大辉大佬博客
    • KOIN
    • SQLDelight
    • Exposed-Kt-ORM
    • Javalin—Web 框架
    • http4k—HTTP包
    • 爱威尔大佬
    • 小土豆
    • 小胖哥安全框架
    • 负雪明烛刷题
    • Kotlin-FP-Arrow
    • Lua参考手册
    • 美团文章
    • Java 全栈知识体系
    • 尼恩架构师学习
    • 现代 JavaScript 教程
    • GO相关文档
    • Go学习导航
    • GoCN社区
    • GO极客兔兔-案例
    • 讯飞星火GPT
    • Hollis博客
    • PostgreSQL德哥
    • 优质博客推荐
    • 半兽人大佬
    • 系列教程
    • PostgreSQL文章
    • 云原生资料库
    • 并发博客大佬
Help?

Please contact us on our email for need any support

Support
    首页   ›   Java   ›   Java Notes   ›   正文
Java Notes

Java—DecimalFormat(数字格式化)

2020-05-08 19:47:57
1841  0 0
参考目录 隐藏
1) 符号含义:
2) 1.最基本的使用
3) 0和#配合使用
4) 2.科学计数法 E
5) 3.分组分隔符和减号
6) 分组分隔符
7) 减号 –
8) 4.关于前缀、后缀
9) % 将数字乘以100
10) \u2030 将数字乘以1000
11) ¤(\u00A4) 本地化货币符号
12) ‘ 用于引用特殊的字符,作为前缀或后缀。
13) 5.四舍五入
14) 6. 同步
15) 7. 特殊值

阅读完需:约 9 分钟

DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。
DecimalFormat 包含一个模式 和一组符号。

符号含义:

上一个经典的表格,我们来说一说响应的符号的意义:

符号 位置 本地化? 含义
0 数字 是 阿拉伯数字
# 数字 是 阿拉伯数字如果不存在就显示为空
. 数字 是 小数分隔符或货币小数分隔符
– 数字 是 减号
, 数字 是 分组分隔符
E 数字 是 分割科学技术法中的尾数和指数。在前缀和后缀中无需添加引号
; 子模式边界 是 分隔正数和负数子模式
% 前缀或后缀 是 乘以100并显示为百分数
/u2030 前缀或后缀 是 乘以1000并显示为千分数
¤ (\u00A4) 前缀或后缀 否 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符
‘ 前缀或后缀 否 用于在前缀或或后缀中为特殊字符加引号,例如 “‘#’#” 将 123 格式化为 “#123″。要创建单引号本身,请连续使用两个单引号:”# o”clock”

1.最基本的使用

0和#配合使用

double pi = 3.1415927;//圆周率
//取一位整数
System.out.println(new DecimalFormat("0").format(pi));//3
//取一位整数和两位小数
System.out.println(new DecimalFormat("0.00").format(pi));//3.14
//取两位整数和三位小数,整数不足部分以0填补。
System.out.println(new DecimalFormat("00.000").format(pi));// 03.142
//取所有整数部分
System.out.println(new DecimalFormat("#").format(pi));//3
//以百分比方式计数,并取两位小数
System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%

 /**
  * 上面的代码就是网上很经典的案例,下面我们来分析另外的一个值
  */      
pi=12.34567;
//取一位整数
System.out.println(new DecimalFormat("0").format(pi));//12
//取一位整数和两位小数
System.out.println(new DecimalFormat("0.00").format(pi));//12.35
//取两位整数和三位小数,整数不足部分以0填补。
System.out.println(new DecimalFormat("00.000").format(pi));// 12.346
//取所有整数部分
System.out.println(new DecimalFormat("#").format(pi));//12
//以百分比方式计数,并取两位小数
System.out.println(new DecimalFormat("#.##%").format(pi));//1234.57%

/**
 * 扩展,如果是其他的数字会是下面的效果
 */
pi=12.34;
//整数
System.out.println(new DecimalFormat("6").format(pi));//612
System.out.println(new DecimalFormat("60").format(pi));//612
System.out.println(new DecimalFormat("06").format(pi));//126
System.out.println(new DecimalFormat("00600").format(pi));//00126
System.out.println(new DecimalFormat("#####60000").format(pi));//00126
//小数
System.out.println(new DecimalFormat(".6").format(pi));//12.6
System.out.println(new DecimalFormat(".06").format(pi));//12.36
System.out.println(new DecimalFormat(".60").format(pi));//12.36
System.out.println(new DecimalFormat(".0600").format(pi));//12.3406
System.out.println(new DecimalFormat(".6000").format(pi));//12.3406
System.out.println(new DecimalFormat(".600000##").format(pi));//12.340006
 1.整数:若是n个0,就从个位开始向高位填充,如果有值就是原来的值,没有就填充0。
             若都是#,没有实际意义,不管是几个#,最后的结果都是原来的整数。
             0和#配合使用,只能是"##00",不能是"00##",就是#在前0在后。实现是上面的合集。
 2.小数:是可以保留小数点后几位的(几个0后或几个#)。
            若n个0,就是保留n位小数,小数不足的部分用0填充。
            若n个#,就是保留n位小数,小数不足部分没有就是没有。
             0和#配合使用,只能是".00##",不能是".##00",就是0在前#在后。实现和上面一样。
 3.数字(1-9):上面的分析不是#就是0,如果是其他的数值会怎样呢?
 上面的扩展很详细的说明这个问题。
         整数:若没有0或#,默认在后面拼接整数;若有0或#,找到第一个0或#的位置,然后找出所有的0或#拼在一起,按照上面的规则,在第一个0或#出现的位置插入响应的格式化以后的值。
         小数:若没有0或#,格式化是什么就显示什么;若有0或#,找出所有的0或#拼在一起,按照上面的规则,在小数点的后面插入响应的格式化以后的值。

2.科学计数法 E

pi = 123456789.3456;
System.out.println(new DecimalFormat("0E0").format(pi));//1E8
System.out.println(new DecimalFormat("0E00").format(pi));//1E08
System.out.println(new DecimalFormat("#E0").format(pi));//.1E9
System.out.println(new DecimalFormat("##E0").format(pi));//1.2E8
System.out.println(new DecimalFormat("###E0").format(pi));//123E6
System.out.println(new DecimalFormat("####E0").format(pi));//1.235E8
System.out.println(new DecimalFormat("#####E0").format(pi));//1234.6E5
System.out.println(new DecimalFormat("######E0").format(pi));//123.457E6
System.out.println(new DecimalFormat("#######E0").format(pi));//12.34568E7
System.out.println(new DecimalFormat("########E0").format(pi));//1.2345679E8
System.out.println(new DecimalFormat("#########E0").format(pi));//123456789E0
System.out.println(new DecimalFormat("##########E0").format(pi));//123456789.3E0
      
pi = 12345678.3456;
System.out.println(new DecimalFormat("0E0").format(pi));//1E7
System.out.println(new DecimalFormat("0E00").format(pi));//1E07
System.out.println(new DecimalFormat("#E0").format(pi));//.1E8
System.out.println(new DecimalFormat("##E0").format(pi));//12E6
System.out.println(new DecimalFormat("###E0").format(pi));//12.3E6
System.out.println(new DecimalFormat("####E0").format(pi));//1235E4
System.out.println(new DecimalFormat("#####E0").format(pi));//123.46E5
System.out.println(new DecimalFormat("######E0").format(pi));//12.3457E6
System.out.println(new DecimalFormat("#######E0").format(pi));//12.34568E7
System.out.println(new DecimalFormat("########E0").format(pi));//12345678E0
System.out.println(new DecimalFormat("#########E0").format(pi));//12345678.3E0
System.out.println(new DecimalFormat("##########E0").format(pi));//12345678.35E0

/**
 * 0的个数决定最后输出结果的位数
 * 并且与0的位置无关
 */
pi = 12345;
System.out.println(new DecimalFormat("###.##E0").format(pi));//12.345E3
System.out.println(new DecimalFormat("##0.##E0").format(pi));//12.345E3
System.out.println(new DecimalFormat("##0.0##E0").format(pi));//12.345E3
System.out.println(new DecimalFormat("##0.00000##E0").format(pi));//12.3450E3
System.out.println(new DecimalFormat("#00.0000##E0").format(pi));//12.3450E3
System.out.println(new DecimalFormat("#00.00000##E0").format(pi));//12.34500E3
 总结:
 1.使用科学计数法,首先保证E前面有0或者#,否则就不是科学计数法。
 2.E后面必须是0,0的个数对后面的显示是有影响的,多余就会填充0.
 3.E前面只有一个#,得到的结果肯定是.开头的结果。
 4.E前面#与0的总个数决定后面的指数,具体:总个数和指数比较,如果指数的值大于总个数,那么得到的指数的值是个数的倍数;如果指数的值小于等于总个数,那么得到的指数的值等于总个数;
 5.整个模式中的0的总个数决定最后输出结果的位数,并且与0的位置无关。
 6.如果整数部分需要保留几位数,就使用几个0。

3.分组分隔符和减号

分组分隔符

这不就是逗号么?不这是分隔符!
直接上代码:

pi = 1299792458;
//每三位以逗号进行分隔。
System.out.println(new DecimalFormat(",###").format(pi));//1,299,792,458
System.out.println(new DecimalFormat(",##").format(pi));//12,99,79,24,58
System.out.println(new DecimalFormat("###,##").format(pi));//12,99,79,24,58
上面的代码,最常用的就是千位分隔符。
不管模式中有多少个分隔符,最右边的那一个有效;每一组的个数就是最右边的分隔符之右的整数位数。

减号 –

-表示输出为负数, 要放在最前面。代码如下:

pi = 3.14;
System.out.println(new DecimalFormat("-0.00").format(pi));//-3.14

4.关于前缀、后缀

% 将数字乘以100

pi = 0.1234;
System.out.println(new DecimalFormat("0.00%").format(pi));//12.34%
System.out.println(new DecimalFormat("0%.00").format(pi));//12.34%
System.out.println(new DecimalFormat("%0.00").format(pi));//%12.34
 %处理最前面不能放置之外,其他的地方都可以放置。 

\u2030 将数字乘以1000

pi = 0.1234;
System.out.println(new DecimalFormat("0.00\u2030").format(pi));//123.40‰
System.out.println(new DecimalFormat("0.0\u20300").format(pi));//123.40‰
System.out.println(new DecimalFormat("\u20300.00").format(pi));//‰123.40
\u2030和%用法是一样的。

¤(\u00A4) 本地化货币符号

pi = 1234.5678;
System.out.println(new DecimalFormat(",000.00¤").format(pi));//1,234.57¥
System.out.println(new DecimalFormat(",000.¤00").format(pi));//1,234.57¥
System.out.println(new DecimalFormat("¤,000.00").format(pi));//¥1,234.57
System.out.println(new DecimalFormat(",00¤0.¤00").format(pi));//1,234.57¥¥
System.out.println(new DecimalFormat("¤,000.¤00").format(pi));//¥1,234.57¥
System.out.println(new DecimalFormat(",000.00¤¤").format(pi));//1,234.57CNY
如果连续出现两次,代表货币符号的国际代号

 ‘ 用于引用特殊的字符,作为前缀或后缀。

pi = 4.5678;
System.out.println(new DecimalFormat("'#'0.00").format(pi));//#4.57
System.out.println(new DecimalFormat("'^ _ ^'0.00").format(pi));//^ _ ^4.57
//使用'本身作为前缀或后缀
System.out.println(new DecimalFormat("''0.00").format(pi));//'4.57

5.四舍五入

说的就是我们数学上常说的四舍五入的问题。
DecimalFormat 提供 RoundingMode 中定义的舍入模式进行格式化。默认情况下,它使用 RoundingMode.HALF_EVEN。

6. 同步

DecimalFormat 通常不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问某个格式,则必须保持外部同步。

7. 特殊值

NaN 被格式化为一个字符串,通常具有单个字符 \uFFFD。此字符串由 DecimalFormatSymbols 对象所确定。这是唯一不使用前缀和后缀的值。

无穷大的值被格式化为一个字符串,通常具有单个字符 \u221E,具有正数或负数前缀和后缀。无穷大值的字符串由 DecimalFormatSymbols 对象所确定。

将负零(”-0″)解析为

  • 如果 isParseBigDecimal() 为 true,则为 BigDecimal(0),
  • 如果 isParseBigDecimal() 为 false 并且 isParseIntegerOnly() 为 true,则为 Long(0),
  • 如果 isParseBigDecimal() 和 isParseIntegerOnly() 均为 false,则为 Double(-0.0)。

中文官方文档:

https://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/text/DecimalFormat.html

如本文“对您有用”,欢迎随意打赏作者,让我们坚持创作!

0 打赏
Enamiĝu al vi
不要为明天忧虑.因为明天自有明天的忧虑.一天的难处一天当就够了。
543文章 68评论 294点赞 593812浏览

随机文章
Kotlin—String的常用方法
4年前
Java—HashMap
5年前
SpringBoot—过滤器注册方式
5年前
MyBatis笔记2—HelloWorld
5年前
Spring—@Autowired的使用
5年前
博客统计
  • 日志总数:543 篇
  • 评论数目:68 条
  • 建站日期:2020-03-06
  • 运行天数:1927 天
  • 标签总数:23 个
  • 最后更新:2024-12-20
Copyright © 2025 网站备案号: 浙ICP备20017730号 身体没有灵魂是死的,信心没有行为也是死的。
主页
页面
  • 归档
  • 摘要
  • 杂图
  • 问题随笔
博主
Enamiĝu al vi
Enamiĝu al vi 管理员
To be, or not to be
543 文章 68 评论 593812 浏览
测试
测试
看板娘
赞赏作者

请通过微信、支付宝 APP 扫一扫

感谢您对作者的支持!

 支付宝 微信支付