Java DecimalFormat
2016-07-26 11:45
573 查看
定义参考 http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/text/DecimalFormat.html
一、定义
要获取具体语言环境的
用于无穷大值、数字、千位分隔符、小数分隔符等的前缀、后缀和各种符号可设置为任意值,并且能在格式化期间正确显示。但是,必须注意不要让符号和字符串发生冲突,否则解析是不可靠的。例如,为了让
分组分隔符通常用于千位,但是在某些国家/地区中它用于分隔万位。分组大小是分组字符之间的固定数字位数,例如 100,000,000 是 3,而 1,0000,0000 则是 4。如果使用具有多个分组字符的模式,则最后一个分隔符和整数结尾之间的间隔才是使用的分组大小。所以
下列字符用在非本地化的模式中。已本地化的模式使用从此格式器的
1234 格式化为
指数字符后面的数字位数字符数给出了最小的指数位数。没有最大值。使用本地化的减号来格式化负数指数,不 使用模式中的前缀和后缀。这就允许存在诸如
最小和最大整数数字位数一起进行解释:
如果最大整数数字位数大于其最小整数数字位数并且大于 1,则强制要求指数为最大整数数字位数的倍数,并将最小整数数字位数解释为 1。最常见的用法是生成工程计数法,其中指数是 3 的倍数,如
否则通过调整指数来得到最小整数数字位数。示例:使用
尾数中的有效位数是最小整数 和最大小数 位数的和,不受最大整数位数的影响。例如,使用
指数模式可能不包含分组分隔符。
10 个连续字符作为阿拉伯数字。为了进行解析,可识别
Unicode 十进制阿拉伯数字。
无穷大的值被格式化为一个字符串,通常具有单个字符
将负零(
如果
如果
如果
二、代码实战
public class DecimalFormatDemo {
public static void main(String[] args) {
double d1 = 12.34;
DecimalFormat df1 = new DecimalFormat("0");//12
DecimalFormat df2 = new DecimalFormat("#");//12
DecimalFormat df3 = new DecimalFormat(".0");//12.3
DecimalFormat df4 = new DecimalFormat("0.0");//12.3
DecimalFormat df5 = new DecimalFormat("#.#");//12.3
DecimalFormat df6 = new DecimalFormat("000.000");//012.340
DecimalFormat df7 = new DecimalFormat("###.###");//12.34
log(df1.format(d1));
log(df2.format(d1));
log(df3.format(d1));
log(df4.format(d1));
log(df5.format(d1));
log(df6.format(d1));
log(df7.format(d1));
double d2 = 1234567890;
DecimalFormat df8 = new DecimalFormat(",##");//12,34,56,78,90
DecimalFormat df9 = new DecimalFormat("##,###");//1,234,567,890
//如果有多个分组模式(,),由最右边的逗号和其右边的占位符(0或#)决定
DecimalFormat df10 = new DecimalFormat(",##,###");//1,234,567,890
log(df8.format(d2));
log(df9.format(d2));
log(df10.format(d2));
//分组分隔符(,)只能位于整数部分,不能位于小数部分
// //error: java.lang.IllegalArgumentException: Malformed pattern ",##,###.#,"
// DecimalFormat df11 = new DecimalFormat(",##,###.#,");
// //error: java.lang.IllegalArgumentException: Malformed pattern ",##,###.#,#"
// DecimalFormat df12 = new DecimalFormat(",##,###.#,#");
// log(df11.format(d2));
// log(df12.format(d2));
//注意:"-"这个符号是"减号",它不能代表负号
double d3 = 1;
DecimalFormat df13 = new DecimalFormat("-#");//-1
log(df13.format(d3));
double d4 = -1;
DecimalFormat df14 = new DecimalFormat("#");//-1
DecimalFormat df15 = new DecimalFormat("-#");//--1
log(df14.format(d4));
log(df15.format(d4));
//(%和\u2030)可放置在
double d6 = 0.12345;
DecimalFormat df16 = new DecimalFormat("0.00%");//12.35%
DecimalFormat df17 = new DecimalFormat("%0.00");//%12.35
//"\u2030"表示千分数,"‰"为千分号。另外,"\u2030"所代表的特殊符号就是"‰"
DecimalFormat df18 = new DecimalFormat("0.00\u2030");//123.45‰
DecimalFormat df19 = new DecimalFormat("\u20300.00");//‰123.45
log(df16.format(d6));
log(df17.format(d6));
log(df18.format(d6));
log(df19.format(d6));
double d7 = 123456789;
DecimalFormat df20 = new DecimalFormat("0.000E000");//1.235E008
DecimalFormat df21 = new DecimalFormat("00.00E00");//12.35E07
log(df20.format(d7));
log(df21.format(d7));
double d8 = 123;
double d9 = -123;
//子模式边界(;)用于分割"正数"(前)和"负数"(后),采用不同的格式化方式,会替换掉负数前面的"负号"
DecimalFormat df22 = new DecimalFormat("#;负数(#)");
log(df22.format(d8));//123
log(df22.format(d9));//负数(123)
double d10 = 123.45;
DecimalFormat df23 = new DecimalFormat("#\u00A4");//123¥
DecimalFormat df24 = new DecimalFormat("\u00A4#");//¥123
DecimalFormat df25 = new DecimalFormat("¤#");//¥123
DecimalFormat df26 = new DecimalFormat("$#");//$123
log(df23.format(d10));
log(df24.format(d10));
log(df25.format(d10));
log(df26.format(d10));
double d11 = 123456789.123456789;
//用于在前缀或或后缀中为特殊字符加引号,引号(')必须成对。如果要输出引号(')本身,则使用两个连续的引号
DecimalFormat df27 = new DecimalFormat("'#'#");//#123456789
DecimalFormat df28 = new DecimalFormat("''#''");//'123456789'
log(df27.format(d11));
log(df28.format(d11));
isDecimal("123");//yes
isDecimal("123.123");//yes
isDecimal("123.123.123");//not
isDecimal("-123");//yes
isDecimal("--123");//not
double d12 = 123456.123456;
DecimalFormat df29 = new DecimalFormat("#");
//默认当没有小数部分时,不会显示分隔符(.)
df29.setDecimalSeparatorAlwaysShown(true);
log(df29.format(d12));//123456.
DecimalFormat df30 = new DecimalFormat("#.#");
DecimalFormat df31 = new DecimalFormat(",###.###");
//某些国家"整数"和"小数"的分隔符是逗号(,)而分组符号才是点号(.)
df29.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.ITALY));
df30.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.ITALY));
df31.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.ITALY));
log(df29.format(d12));//12,
log(df30.format(d12));//123456,1
log(df31.format(d12));//123.456,123
}
public static final void log(String msg) {
System.out.println(msg);
}
public static final void isDecimal(String value) {
Pattern decimalPattern = Pattern.compile("-?\\d*(\\.\\d*)?");
Matcher matcher = decimalPattern.matcher(value);
log(value + " is" + (matcher.matches()?"":" not") + " a decimal");
}
}
三、运行截图
一、定义
DecimalFormat是
NumberFormat的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。
要获取具体语言环境的
NumberFormat(包括默认语言环境),可调用
NumberFormat的某个工厂方法,如
getInstance()。通常不直接调用
DecimalFormat的构造方法,因为
NumberFormat的工厂方法可能返回不同于
DecimalFormat的子类。如果需要自定义格式对象,可执行:
NumberFormat f = NumberFormat.getInstance(loc); if (f instanceof DecimalFormat) { ((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true); }
DecimalFormat包含一个模式 和一组符号。可直接使用
applyPattern()或间接使用 API 方法来设置模式。符号存储在
DecimalFormatSymbols对象中。使用
NumberFormat工厂方法时,可从已本地化的
ResourceBundle中读取模式和符号。
模式
DecimalFormat模式具有下列语法:
模式: 正数模式 正数模式;负数模式 正数模式: 前缀opt 数字后缀opt 负数模式: 前缀opt 数字后缀opt 前缀: 除 \uFFFE、\uFFFF 和特殊字符以外的所有 Unicode 字符 后缀: 除 \uFFFE、\uFFFF 和特殊字符以外的所有 Unicode 字符 数字: 整数指数opt 整数。小数指数opt 整数: 最小整数 # # 整数 # , 整数 最小整数: 0 0 最小整数 0 , 最小整数 小数: 最小小数opt 可选小数opt 最小小数: 0 最小小数opt 可选小数: # 可选小数opt 指数: E 最小指数 最小指数: 0 最小指数opt
DecimalFormat模式包含正数和负数子模式,例如
"#,##0.00;(#,##0.00)"。每个子模式都有前缀、数字部分和后缀。负数子模式是可选的;如果存在,则将用已本地化的减号(在多数语言环境中是
'-')作为前缀的正数子模式用作负数子模式。也就是说,单独的
"0.00"等效于
"0.00;-0.00"。如果存在显式的负数子模式,则它仅指定负数前缀和后缀;数字位数、最小位数,其他特征都与正数模式相同。这意味着
"#,##0.0#;(#)"的行为与
"#,##0.0#;(#,##0.0#)"完全相同。
用于无穷大值、数字、千位分隔符、小数分隔符等的前缀、后缀和各种符号可设置为任意值,并且能在格式化期间正确显示。但是,必须注意不要让符号和字符串发生冲突,否则解析是不可靠的。例如,为了让
DecimalFormat.parse()能够区分正数和负数,正数和负数前缀或后缀必须是不同的。(如果它们相同,则
DecimalFormat的行为就如同未指定负数子模式一样。)另一个示例是小数分隔符和千位分隔符应该是不同的字符,否则将不可能进行解析。
分组分隔符通常用于千位,但是在某些国家/地区中它用于分隔万位。分组大小是分组字符之间的固定数字位数,例如 100,000,000 是 3,而 1,0000,0000 则是 4。如果使用具有多个分组字符的模式,则最后一个分隔符和整数结尾之间的间隔才是使用的分组大小。所以
"#,##,###,####"==
"######,####"==
"##,####,####"。
特殊模式字符
模式中的很多字符都是按字面解释的;在解析期间对其进行匹配,在格式化期间则不经改变地输出。另一方面,特殊字符代表了其他字符、字符串或字符类。如果要将其作为字面量出现在前缀或后缀中,那么除非另行说明,否则必须对其加引号。下列字符用在非本地化的模式中。已本地化的模式使用从此格式器的
DecimalFormatSymbols对象中获得的相应字符,这些字符已失去其特殊状态。两种例外是货币符号和引号,不将其本地化。
符号 | 位置 | 本地化? | 含义 |
---|---|---|---|
0 | 数字 | 是 | 阿拉伯数字 |
# | 数字字 | 是 | 阿拉伯数字,如果不存在则显示为 0 |
. | 数字 | 是 | 小数分隔符或货币小数分隔符 |
- | 数字 | 是 | 减号 |
, | 数字 | 是 | 分组分隔符 |
E | 数字 | 是 | 分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号。 |
; | 子模式边界 | 是 | 分隔正数和负数子模式 |
% | 前缀或后缀 | 是 | 乘以 100 并显示为百分数 |
\u2030 | 前缀或后缀 | 是 | 乘以 1000 并显示为千分数 |
¤( \u00A4) | 前缀或后缀 | 否 | 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。 |
' | 前缀或后缀 | 否 | 用于在前缀或或后缀中为特殊字符加引号,例如 "'#'#"将 123 格式化为 "#123"。要创建单引号本身,请连续使用两个单引号: "# o''clock"。 |
科学计数法
科学计数法中的数表示为一个尾数和一个 10 的几次幂的乘积,例如可将 1234 表示为 1.234 x 10^3。尾数的范围通常是 1.0 <= x < 10.0,但并非必需如此。可指示DecimalFormat仅通过某个模式 来格式化和解析科学计数法表示的数;目前没有创建科学计数法格式的工厂方法。在这个模式中,指数字符后面紧跟着一个或多个数字字符即指示科学计数法。示例:
"0.###E0"将数字
1234 格式化为
"1.234E3"。
指数字符后面的数字位数字符数给出了最小的指数位数。没有最大值。使用本地化的减号来格式化负数指数,不 使用模式中的前缀和后缀。这就允许存在诸如
"0.###E0 m/s"等此类的模式。
最小和最大整数数字位数一起进行解释:
如果最大整数数字位数大于其最小整数数字位数并且大于 1,则强制要求指数为最大整数数字位数的倍数,并将最小整数数字位数解释为 1。最常见的用法是生成工程计数法,其中指数是 3 的倍数,如
"##0.#####E0"。使用此模式时,数 12345 格式化为
"12.345E3",123456 则格式化为
"123.456E3"。
否则通过调整指数来得到最小整数数字位数。示例:使用
"00.###E0"格式化 0.00123 时得到
"12.3E-4"。
尾数中的有效位数是最小整数 和最大小数 位数的和,不受最大整数位数的影响。例如,使用
"##0.##E0"格式化 12345 得到
"12.3E3"。要显示所有位数,请将有效位数计数设置为零。有效位数不会影响解析。
指数模式可能不包含分组分隔符。
舍入
DecimalFormat提供
RoundingMode中定义的舍入模式进行格式化。默认情况下,它使用
RoundingMode.HALF_EVEN。
阿拉伯数字
为了进行格式化,DecimalFormat使用
DecimalFormatSymbols对象中所定义的、从已本地化的阿拉伯数字 0 开始的
10 个连续字符作为阿拉伯数字。为了进行解析,可识别
Character.digit所定义的这些阿拉伯数字和所有
Unicode 十进制阿拉伯数字。
特殊值
NaN被格式化为一个字符串,通常具有单个字符
\uFFFD。此字符串由
DecimalFormatSymbols对象所确定。这是唯一不使用前缀和后缀的值。
无穷大的值被格式化为一个字符串,通常具有单个字符
\u221E,具有正数或负数前缀和后缀。无穷大值的字符串由
DecimalFormatSymbols对象所确定。
将负零(
"-0")解析为
如果
isParseBigDecimal()为 true,则为
BigDecimal(0),
如果
isParseBigDecimal()为 false 并且
isParseIntegerOnly()为 true,则为
Long(0),
如果
isParseBigDecimal()和
isParseIntegerOnly()均为 false,则为
Double(-0.0)。
同步
DecimalFormat 通常不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问某个格式,则必须保持外部同步。二、代码实战
public class DecimalFormatDemo {
public static void main(String[] args) {
double d1 = 12.34;
DecimalFormat df1 = new DecimalFormat("0");//12
DecimalFormat df2 = new DecimalFormat("#");//12
DecimalFormat df3 = new DecimalFormat(".0");//12.3
DecimalFormat df4 = new DecimalFormat("0.0");//12.3
DecimalFormat df5 = new DecimalFormat("#.#");//12.3
DecimalFormat df6 = new DecimalFormat("000.000");//012.340
DecimalFormat df7 = new DecimalFormat("###.###");//12.34
log(df1.format(d1));
log(df2.format(d1));
log(df3.format(d1));
log(df4.format(d1));
log(df5.format(d1));
log(df6.format(d1));
log(df7.format(d1));
double d2 = 1234567890;
DecimalFormat df8 = new DecimalFormat(",##");//12,34,56,78,90
DecimalFormat df9 = new DecimalFormat("##,###");//1,234,567,890
//如果有多个分组模式(,),由最右边的逗号和其右边的占位符(0或#)决定
DecimalFormat df10 = new DecimalFormat(",##,###");//1,234,567,890
log(df8.format(d2));
log(df9.format(d2));
log(df10.format(d2));
//分组分隔符(,)只能位于整数部分,不能位于小数部分
// //error: java.lang.IllegalArgumentException: Malformed pattern ",##,###.#,"
// DecimalFormat df11 = new DecimalFormat(",##,###.#,");
// //error: java.lang.IllegalArgumentException: Malformed pattern ",##,###.#,#"
// DecimalFormat df12 = new DecimalFormat(",##,###.#,#");
// log(df11.format(d2));
// log(df12.format(d2));
//注意:"-"这个符号是"减号",它不能代表负号
double d3 = 1;
DecimalFormat df13 = new DecimalFormat("-#");//-1
log(df13.format(d3));
double d4 = -1;
DecimalFormat df14 = new DecimalFormat("#");//-1
DecimalFormat df15 = new DecimalFormat("-#");//--1
log(df14.format(d4));
log(df15.format(d4));
//(%和\u2030)可放置在
double d6 = 0.12345;
DecimalFormat df16 = new DecimalFormat("0.00%");//12.35%
DecimalFormat df17 = new DecimalFormat("%0.00");//%12.35
//"\u2030"表示千分数,"‰"为千分号。另外,"\u2030"所代表的特殊符号就是"‰"
DecimalFormat df18 = new DecimalFormat("0.00\u2030");//123.45‰
DecimalFormat df19 = new DecimalFormat("\u20300.00");//‰123.45
log(df16.format(d6));
log(df17.format(d6));
log(df18.format(d6));
log(df19.format(d6));
double d7 = 123456789;
DecimalFormat df20 = new DecimalFormat("0.000E000");//1.235E008
DecimalFormat df21 = new DecimalFormat("00.00E00");//12.35E07
log(df20.format(d7));
log(df21.format(d7));
double d8 = 123;
double d9 = -123;
//子模式边界(;)用于分割"正数"(前)和"负数"(后),采用不同的格式化方式,会替换掉负数前面的"负号"
DecimalFormat df22 = new DecimalFormat("#;负数(#)");
log(df22.format(d8));//123
log(df22.format(d9));//负数(123)
double d10 = 123.45;
DecimalFormat df23 = new DecimalFormat("#\u00A4");//123¥
DecimalFormat df24 = new DecimalFormat("\u00A4#");//¥123
DecimalFormat df25 = new DecimalFormat("¤#");//¥123
DecimalFormat df26 = new DecimalFormat("$#");//$123
log(df23.format(d10));
log(df24.format(d10));
log(df25.format(d10));
log(df26.format(d10));
double d11 = 123456789.123456789;
//用于在前缀或或后缀中为特殊字符加引号,引号(')必须成对。如果要输出引号(')本身,则使用两个连续的引号
DecimalFormat df27 = new DecimalFormat("'#'#");//#123456789
DecimalFormat df28 = new DecimalFormat("''#''");//'123456789'
log(df27.format(d11));
log(df28.format(d11));
isDecimal("123");//yes
isDecimal("123.123");//yes
isDecimal("123.123.123");//not
isDecimal("-123");//yes
isDecimal("--123");//not
double d12 = 123456.123456;
DecimalFormat df29 = new DecimalFormat("#");
//默认当没有小数部分时,不会显示分隔符(.)
df29.setDecimalSeparatorAlwaysShown(true);
log(df29.format(d12));//123456.
DecimalFormat df30 = new DecimalFormat("#.#");
DecimalFormat df31 = new DecimalFormat(",###.###");
//某些国家"整数"和"小数"的分隔符是逗号(,)而分组符号才是点号(.)
df29.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.ITALY));
df30.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.ITALY));
df31.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.ITALY));
log(df29.format(d12));//12,
log(df30.format(d12));//123456,1
log(df31.format(d12));//123.456,123
}
public static final void log(String msg) {
System.out.println(msg);
}
public static final void isDecimal(String value) {
Pattern decimalPattern = Pattern.compile("-?\\d*(\\.\\d*)?");
Matcher matcher = decimalPattern.matcher(value);
log(value + " is" + (matcher.matches()?"":" not") + " a decimal");
}
}
三、运行截图
相关文章推荐
- JAVA运行JAR包
- Struts2+Spring+Hibernate+Maven框架整合
- JDK环境变量
- Java集合类之HashMap原理小结
- Java数组初始化
- Java数据持久层框架 MyBatis之API学习一(简介)
- 垃圾收集器,详解jdk参数配置
- 深入理解Java的接口和抽象类
- java文件下载文件名乱码
- Java并发编程(20):并发新特性—Lock锁和条件变量(含代码)
- Java IO梗概图
- javascrip 日常使用
- java反射获取类信息
- Java反射详解
- Spring+quart
- java I/O模型
- 使用 iOS 8 Spring Animation API 创建动画
- eclipse导出的jar包不能运行
- JAVA中pdf转图片的方法
- RxJava实战演示1------基本代码使用