字符串格式


    DecimalFormat format = new DecimalFormat("00%");
    System.out.println(format.format(0.2));

运行结果:20%

显示百分比

	DecimalFormat format = new DecimalFormat("00%");
	System.out.println(format.format(0.235));

运行结果:24%

结果自动四舍五入了


	DecimalFormat format = new DecimalFormat("0000");
	System.out.println(format.format(23));

运行结果:0023

结果不够四位,自动补0


	DecimalFormat format = new DecimalFormat("#,###");
	System.out.println(format.format(23546));

运行结果:23,546

每三位加逗号

	DecimalFormat format = new DecimalFormat("#\u2030");
	System.out.println(format.format(25));

运行结果:25000‰

这个是千分比哦


	DecimalFormat format = new DecimalFormat("0.##E0");
	System.out.println(format.format(12345678));

运行结果:1.23E7

科学计数法




对于以上的例子,看后会用了吗?

字符串格式还有一个String.format(),大家也可以用这个进行格式相关的数据


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。如果使用具有多个分组字符的模式,则最后一个分隔符和整数结尾之间的间隔才是使用的分组大小。所以 "#,##,###,####" == "######,####" == "##,####,####"。


特殊模式字符

模式中的很多字符都是按字面解释的;在分析期间对其进行匹配,在格式化期间则不经改变地输出。另一方面,特殊字符代表了其他字符、字符串或字符类。如果要将其作为字面量出现在前缀或后缀中,那么除非另行说明,否则必须对其加引号。

下列字符用在非本地化的模式中。已本地化的模式使用从此 formatter 的 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"。要显示所有位数,请将有效位数计数设置为零。有效位数不会影响分析。
  • 指数模式可能不包含分组分隔符。
特殊值

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

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

将负零("-0")分析为

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

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



下面列出部分方法,其它请参考相应的文档

 String format(double number)
          格式双精度。
abstract  StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos)
          格式化一个数并把所得文本追加到给定字符串缓冲区。
 String format(long number)
          格式长整形。
abstract  StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos)
          格式化一个数并把所得文本追加到给定字符串缓冲区。
 StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos)
          格式化一个数并把所得文本追加到给定字符串缓冲区。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值