概述

基于Java,介绍将浮点类型小数进行格式化的方案。

正文

在Java中,用于格式化小数的类是java.text.DecimalFormat,比如你可以这样使用:

double data = 3334590479.22d;
System.out.println(data); // 3.33459047922E9 java.text.DecimalFormat df = new java.text.DecimalFormat("$#,###.##");
String result = df.format(data);
System.out.println(result); // $3,334,590,479.22

对于比较大的数值,默认使用科学表示法(scientific notation);使用java.text.DecimalFormat指定格式,则用指定的格式。

格式"$#,###.##"包含以下语义:

1. 前缀为$

2. 整数部分每3位数为一组

3. 最多保留2位小数

关于格式

一个格式的大致结构是:Prefixopt Number Suffixopt,即前缀 + 数字 + 后缀;其中前缀和后缀都是可选的。

关于分组

组分隔符使用,且只能在整数部分使用;不管模式中有多少个分隔符,最右边的那一个有效;每一组的个数就是最右边的分隔符之右的整数位数。

所以"#,##,###,####" == "######,####" == "##,####,####"。

关于小数

小数分隔符使用.,用以分隔整数部分和小数部分。

关于数字特殊字符

1. #

#是一个特殊字符,用于数字部分;它表示显示数字,但是最前面和最后面的0不予显示。

data:02222.20
pattern:",###.##"
result:2,222.2

#用于整数部分没有数位的限制,但是用于小数部分,却有“最多只能有多少位小数的意思”,多余的进行舍入。比如:

data:2222.222
pattern:",###.##"
result:2,222.22

2. 0

0和#的用法是相近的,却又略有不同;不同之处在于:

a. 0限制整数部分最少出现的位数;不足这个位数的,前面补0

data:22.26
pattern:"0,000.00"
result:0,022.26

b. 0限制小数部分出现的位数;不足补0,多的舍入

data:22.26
-----------------
pattern:"00.000"
result:22.260
-----------------
pattern:"00.0"
result:22.3

3. E

科学表示法,尾数和指数的分隔符。

具体内容见后文。

关于前缀、后缀

除\uFFFE, \uFFFF和特殊字符之外的任意Unicode字符,都可以作为前缀、后缀;有四个特殊的字符:

1. %

将数字乘以100

data:1234.567
pattern:",###.##%"
result:123,456.7%

2. \u2030

将数字乘以1000

data:1234.567
pattern:",###.##\u2030"
result:1,234,567‰

3. ¤(\u00A4)

本地化货币符号,如果连续出现两次,代表货币符号的国际代号。

data:1234.567
---------------------
pattern:",###.##¤"
result:1,234.57¥
---------------------
pattern:",###.##¤¤"
result:1,234.57CNY

4. '

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

data:1234.567
pattern:"'#',###.##"
result:#1,234.57

如果想使用'本身作为前缀或后缀,连续输入两次:

data:1234.567
pattern:"'',###.##"
result:'1,234.57

关于科学表示法

科学表示法是在数字部分的尾部添加如E0的内容,其中E是尾数和指数的分隔符,E后面的0的个数表示指数的最少位数(不足前面补0)。

data:1E5
pattern:0.#E00
result:1E05 // 注意指数有2位

E的前面必须要有内容,至少要有一个#或者0,否则E就被当作前缀处理了:

data:1E5
---------------
pattern:"E0"
result:E100000
---------------
pattern:"0E0"
result:1E5
---------------
pattern:"#E0"
result:.1E6

指数部分没有多少内容,下面讨论尾数部分。

尾数一般包括整数和小数,如果整数部分没有内容(.前面没有内容),有效数字就全部在小数上:

data:12345E5
pattern:".###E0"
result:.123E10

如果整数部分需要保留几位数,就使用几个0(使用#的结果有点匪夷所思,大家自行尝试):

data:12345E5
----------------------
pattern:"0.###E0"
result:1.234E9
----------------------
pattern:"00.###E0"
result:12.345E8
---------------------
pattern:"000.###E0"
result:123.45E7

小数部分,如果想实现“最多保留几位小数”的效果,在pattern的.之后添加相应个#。这样,多余的会舍入;如果想实现“恰好保留几位小数”的效果,在pattern的.之后添加相应个0。这样,缺少会在后面补0,多余的会舍入。

data:123E5
------------------
pattern:"0.#E0"
result:1.2E7
------------------
pattern:"0.##E0"
result:1.23E7
------------------
pattern:"0.###E0"
result:1.23E7
==================
pattern:"0.0E0"
result:1.2E7
------------------
pattern:"0.00E0"
result:1.23E7
------------------
pattern:"0.000E0"
result:1.230E7

Java浮点类型的格式化的更多相关文章

  1. java浮点类型计算

    java浮点类型需要采用java.math.*这个工具包,这样的计算结果才是我们想要的.呵呵 import java.math.BigDecimal; import java.text.NumberF ...

  2. java 基础 浮点类型

    1.浮点类型用于表示小数的数据类型. 2.浮点数原理:也就是二进制科学计数法. 3.Java的浮点类型有float和double两种. 4.Java默认浮点类型计算的结果是double类型,字面量也是 ...

  3. Java中浮点类型的精度问题 double float

    要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法与浮点数的结构组成.因为机器只认识01,你想表示小数,你要机器认识小数点这个东西,必须采用某种方法.比如,简单点的,float四个字 ...

  4. Java基础扫盲系列(二)—— Java中BigDecimal和浮点类型

    一直以来我几乎未使用过BigDecimal类型,只有在DB中涉及到金额字段时听说要用Decimal类型,但是今天再项目代码中看到使用BigDecimal表示贷款金额. 本篇文章不是介绍BigDecim ...

  5. java.lang.NumberFormatException: Infinite or NaN原因之浮点类型除数为0结果探究

    背景 在对Double类型的数据进行计算操作,将结果转化为BigDecimal时抛出了下面的异常,进行了Debug才发现了问题原因,同时也暴露出了自己在一些基础知识上还有些欠缺. Exception ...

  6. JAVA字符串与整形、浮点类型之间的相互转换总结

    1.字符串转化为整形.浮点类型 String s = "100"; //方法一 int a = Integer.parseInt(String s); Long.parseLong ...

  7. 【转】Java 中字符串的格式化

    原文网址:http://blog.csdn.net/aimartt/article/details/8307237 参考资料:JDK API 1.6.0 中文文档 1.格式字符串语法 产生格式化输出的 ...

  8. Java 中字符串的格式化

    1.格式字符串语法 产生格式化输出的每个方法都需要格式字符串 和参数列表.格式字符串是一个String,它可以包含固定文本以及一个或多个嵌入的格式说明符.请考虑以下示例: Calendar c = C ...

  9. 转!!Java代码规范、格式化和checkstyle检查配置文档

    为便于规范各位开发人员代码.提高代码质量,研发中心需要启动代码评审机制.为了加快代码评审的速度,减少不必要的时间,可以加入一些代码评审的静态检查工具,另外需要为研发中心配置统一的编码模板和代码格式化模 ...

随机推荐

  1. 【C++ STL】Vector

    1.结构 vector模塑出一个动态数组,因此,它本身是“将元素置于动态数组中加以管理”的一个抽象概念.vector将其元素复制到内部的dynamic array中.元素之间总存在某种顺序,所以vec ...

  2. Linux之防火墙与端口

    1.关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放.下面是命令实现: iptables -P INPUT DROPiptables -P FORWARD DROPiptable ...

  3. Linux LVM分区管理、扩展

    一.LVM简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写.LVM将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它 ...

  4. uoj308 【UNR #2】UOJ拯救计划

    传送门:http://uoj.ac/problem/308 [题解] 考虑枚举用了$i$所学校,那么贡献为${k \choose i} * cnt * i!$ 意思是从$k$所选$i$所出来染色,$c ...

  5. Vue 键盘事件

    Vue2键盘事件:keydown/keyup... 1.使用 <!DOCTYPE html> <html> <head> <title></tit ...

  6. bzoj 1084 DP

    首先对于m==1的情况非常容易处理(其实这儿因为边界我错了好久...),直接DP就好了,设f[i][k]为这个矩阵前i个选k个矩阵的最大和,那么f[i][k]=max(f[j][k-1]+sum[j+ ...

  7. bufferd对象详解

    使用buffer类处理二进制数据 在客户端javascript脚本代码中,对于二进制数据并没有提供一个很好的支持.然后在nodejs中需要处理像TCP流或文件流时,必须要处理二进制数据.因此在node ...

  8. fundamentals of the jQuery library

    1.why is jquery Only 32kB minified and gzipped. Can also be included as an AMD module Supports CSS3 ...

  9. 广度优先算法(BFS)与深度优先算法(DFS)

    一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...

  10. MVC自定义路由实现URL重写,SEO优化

    //App_Start-RouteConfig.cs public class RouteConfig { public static void RegisterRoutes(RouteCollect ...