String.Format用法 String.Format用法

String.Format用法

 名称 说明 
  Format(String, Object)  将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项。 
  Format(String, array<>[]()[])  将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的文本等效项。 
  Format(IFormatProvider, String, array<>[]()[])  将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的文本等效项。指定的参数提供区域性特定的格式设置信息。 
  Format(String, Object, Object)  将指定的 String 中的格式项替换为两个指定的 Object 实例的值的文本等效项。 
  Format(String, Object, Object, Object)  将指定的 String 中的格式项替换为三个指定的 Object 实例的值的文本等效项。


多个参数

int m[]=new int{a,b,c,d};

string.format("{0}{1}{2}",m);

  目录                              

    一、前言

    二、重载方法

    三、占位符

    四、对字符、字符串进行格式化

    五、对整数进行格式化

    六、对浮点数进行格式化

    七、对日期时间进行格式化

    八、其他转换符

    九、总结

    参考

 

一、前言                            

   String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.format("Hello %s""John");

,下面将笔记整理并记录下来。

 

二、重载方法                          

// 使用当前本地区域对象(Locale.getDefault())格式化字符串
String String.format(String fmt, Object... args);

// 自定义本地区域对象格式化字符串
String String.format(Locale locale, String fmt, Object... args);

 

三、占位符                                   

  占位符完整格式为: %[index$][标识]*[最小宽度][.精度]转换符 。

  针对不同数据类型的格式化,占位符的格式将有所裁剪。

  % ,占位符的其实字符,若要在占位符内部使用%,则需要写成 %% 。

  [index$] ,位置索引从1开始计算,用于指定对索引相应的实参进行格式化并替换掉该占位符。

  [标识] ,用于增强格式化能力,可同时使用多个 [标识] ,但某些标识是不能同时使用的。

  [最小宽度] ,用于设置格式化后的字符串最小长度,若使用 [最小宽度] 而无设置 [标识] ,那么当字符串长度小于最小宽度时,则以左边补空格的方式凑够最小宽度。

  [.精度] ,对于浮点数类型格式化使用,设置保留小数点后多少位。

  转换符 ,用于指定格式化的样式,和限制对应入参的数据类型。

 

四、对字符、字符串进行格式化                    

  占位符格式为: %[index$][标识][最小宽度]转换符 

  示例——将"hello"格式化为"  hello"

String raw = "hello";
String str = String.format("%1$7s", raw);
// 简化
//String str = String.format("%7s", raw);

  示例——将"hello"格式化为"hello  "

String raw = "hello";
String str = String.format("%1$-7s", raw);
// 简化
//String str = String.format("%-7s", raw);

可用标识:

   -,在最小宽度内左对齐,右边用空格补上。

可用转换符:

   s,字符串类型。

   c,字符类型,实参必须为char或int、short等可转换为char类型的数据类型,否则抛IllegalFormatConversionException异常。

   b,布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false。

   n,平台独立的换行符(与通过 System.getProperty("line.separator") 是一样的)

 

五、对整数进行格式化                       

  占位符格式为: %[index$][标识]*[最小宽度]转换符 

  示例——将1显示为0001

int num = 1;
String str = String.format("%04d", num)

  示例——将-1000显示为(1,000)

int num = -1000;
String str = String.format("%(,d", num)

可用标识:

复制代码
-,在最小宽度内左对齐,不可以与0标识一起使用。
0,若内容长度不足最小宽度,则在左边用0来填充。
#,对8进制和16进制,8进制前添加一个0,16进制前添加0x。
+,结果总包含一个+或-号。
空格,正数前加空格,负数前加-号。
,,只用与十进制,每3位数字间用,分隔。
(,若结果为负数,则用括号括住,且不显示符号。
复制代码

可用转换符:

b,布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false。
d,整数类型(十进制)。
x,整数类型(十六进制)。
o,整数类型(八进制)
n,平台独立的换行符, 也可通过System.getProperty("line.separator")获取

 

六、对浮点数进行格式化                        

   占位符格式为: %[index$][标识]*[最小宽度][.精度]转换符 

   示例:

double num = 123.4567899;
System.out.print(String.format("%f %n", num)); // 123.456790 
System.out.print(String.format("%a %n", num)); // 0x1.edd3c0bb46929p6 
System.out.print(String.format("%g %n", num)); // 123.457

可用标识:

复制代码
-,在最小宽度内左对齐,不可以与0标识一起使用。
0,若内容长度不足最小宽度,则在左边用0来填充。
#,对8进制和16进制,8进制前添加一个0,16进制前添加0x。
+,结果总包含一个+或-号。
空格,正数前加空格,负数前加-号。
,,只用与十进制,每3位数字间用,分隔。
(,若结果为负数,则用括号括住,且不显示符号。
复制代码

可用转换符:

b,布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false。
n,平台独立的换行符, 也可通过System.getProperty("line.separator")获取。
f,浮点数型(十进制)。显示9位有效数字,且会进行四舍五入。如99.99。
a,浮点数型(十六进制)。
e,指数类型。如9.38e+5。
g,浮点数型(比%f,%a长度短些,显示6位有效数字,且会进行四舍五入)

 

七、对日期时间进行格式化                      

   占位符格式为: %[index$]t转换符 

   示例:

Date now = new Date();
String str = String.format("%tF", now); // 2014-10-12

可用转换符

  1. 日期的转换符

复制代码
c,星期六 十月 27 14:21:20 CST 2007
F,2007-10-27
D,10/27/07
r,02:25:51 下午
T,14:28:16
R,14:28
b, 月份简称
B, 月份全称
a, 星期简称
A, 星期全称
C, 年前两位(不足两位补零)
y, 年后两位(不足两位补零)
j, 当年的第几天
m, 月份(不足两位补零)
d, 日期(不足两位补零)
e, 日期(不足两位不补零)
复制代码

  2. 时间的转换符

复制代码
H, 24小时制的小时(不足两位补零)
k, 24小时制的小时(不足两位不补零)
I, 12小时制的小时(不足两位补零)
i, 12小时制的小时(不足两位不补零)
M, 分钟(不足两位补零)
S, 秒(不足两位补零)
L, 毫秒(不足三位补零)
N, 毫秒(不足9位补零)
p, 小写字母的上午或下午标记,如中文为“下午”,英文为pm
z, 相对于GMT的时区偏移量,如+0800
Z, 时区缩写,如CST
s, 自1970-1-1 00:00:00起经过的秒数
Q, 自1970-1-1 00:00:00起经过的豪秒
复制代码

 

八、其他转换符                          

 <,用于格式化前一个转换符所描述的参数。

 示例:

int num = 1000;
String str = String.format("%d %<,d", num);
// 结果"1000 1,000

1.常规类型、字符类型和数值类型的格式说明符的语法如下

%[argument_index$][flags][width][.precision]conversion

      可选的 argument_index 是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由 "1$" 引用,第二个参数由 "2$" 引用,依此类推。 
      可选的 flags 是修改输出格式的字符集。有效标志的集合取决于转换类型。  

      可选 width 是一个非负十进制整数,表明要向输出中写入的最少字符数。 
      可选 precision 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。 
      所需的 conversion 是一个表明应该如何格式化参数的字符。给定参数的有效转换集合取决于参数的数据类型。

2.用来表示日期和时间类型的格式说明符的语法如下: 
%[argument_index$][flags][width]conversion

可选的 argument_index 、flags 和 width 的定义同上。 
所需的 conversion 是一个由两字符组成的序列。第一个字符是 't' 或 'T'。第二个字符表明所使用的格式。这些字符类似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定义的字符。


3.与参数不对应的格式说明符的语法如下: 
%[flags][width]conversion

可选 flags 和 width 的定义同上。 
所需的 conversion 是一个表明要在输出中所插内容的字符。

转换 
转换可分为以下几类: 
1. 常规 - 可应用于任何参数类型 
2. 字符 - 可应用于表示 Unicode 字符的基本类型:char、Character、byte、Byte、short 和 Short。当 Character.isValidCodePoint(int) 返回 true 时,可将此转换应用于 int 和 Integer 类型 
3. 数值 
      1. 整数 - 可应用于 Java 的整数类型:byte、Byte、short、Short、int、Integer、long、Long 和 BigInteger 
      2. 浮点 - 可用于 Java 的浮点类型:float、Float、double、Double 和 BigDecimal 
4. 日期/时间 - 可应用于 Java 的、能够对日期或时间进行编码的类型:long、Long、Calendar 和 Date。 
5. 百分比 - 产生字面值 '%' ('\u0025') 
6. 行分隔符 - 产生特定于平台的行分隔符

格式化表达式:%[零个或多个标志][最小字段宽度][精度][修改符]格式码

注意:[]方括号表示可选参数

常规类型的格式化

String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处。format()方法有两种重载形式。

format(String format, Object... args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串。

format(Locale locale, String format, Object... args) 使用指定的语言环境,制定字符串格式和参数生成格式化的字符串。

显示不同转换符实现不同数据类型到字符串的转换,如图所示

转  换  符

说    明 

示    例

%s

字符串类型

"mingrisoft"

%c

字符类型

'm'

%b

布尔类型

true

%d

整数类型(十进制)

99

%x

整数类型(十六进制)

FF

%o

整数类型(八进制)

77

%f

浮点类型

99.99

%a

十六进制浮点类型

FF.35AE

%e

指数类型

9.38e+5

%g

通用浮点类型(f和e类型中较短的)

 

%h

散列码

 

%%

百分比类型

%n

换行符

 

%tx

日期与时间类型(x代表不同的日期与时间转换符

 
测试用例

[java]  view plain  copy
  1. public static void main(String[] args) {  
  2.     String str=null;  
  3.     str=String.format("Hi,%s""王力");  
  4.     System.out.println(str);  
  5.     str=String.format("Hi,%s:%s.%s""王南","王力","王张");            
  6.     System.out.println(str);                           
  7.     System.out.printf("字母a的大写是:%c %n"'A');  
  8.     System.out.printf("3>7的结果是:%b %n"3>7);  
  9.     System.out.printf("100的一半是:%d %n"100/2);  
  10.     System.out.printf("100的16进制数是:%x %n"100);  
  11.     System.out.printf("100的8进制数是:%o %n"100);  
  12.     System.out.printf("50元的书打8.5折扣是:%f 元%n"50*0.85);  
  13.     System.out.printf("上面价格的16进制数是:%a %n"50*0.85);  
  14.     System.out.printf("上面价格的指数表示:%e %n"50*0.85);  
  15.     System.out.printf("上面价格的指数和浮点数结果的长度较短的是:%g %n"50*0.85);  
  16.     System.out.printf("上面的折扣是%d%% %n"85);  
  17.     System.out.printf("字母A的散列码是:%h %n"'A');  
  18. }  
输出结果

[plain]  view plain  copy
  1. Hi,王力  
  2. Hi,王南:王力.王张  
  3. 字母a的大写是:A   
  4. 3>7的结果是:false   
  5. 100的一半是:50   
  6. 100的16进制数是:64   
  7. 100的8进制数是:144   
  8. 50元的书打8.5折扣是:42.500000 元  
  9. 上面价格的16进制数是:0x1.54p5   
  10. 上面价格的指数表示:4.250000e+01   
  11. 上面价格的指数和浮点数结果的长度较短的是:42.5000   
  12. 上面的折扣是85%   
  13. 字母A的散列码是:41   
搭配转换符的标志,如图所示。

标    志

说    明

示    例

结    果

+

为正数或者负数添加符号

("%+d",15)

+15

左对齐

("%-5d",15)

|15   |

0

数字前面补0

("%04d", 99)

0099

空格

在整数之前添加指定数量的空格

("% 4d", 99)

|  99|

,

以“,”对数字分组

("%,f", 9999.99)

9,999.990000

(

使用括号包含负数

("%(f", -99.99)

(99.990000)

#

如果是浮点数则包含小数点,如果是16进制或8进制则添加0x或0

("%#x", 99)

("%#o", 99)

0x63

0143

格式化前一个转换符所描述的参数

("%f和%<3.2f", 99.45)

99.450000和99.45

$

被格式化的参数索引

("%1$d,%2$s", 99,"abc")

99,abc

测试用例

[java]  view plain  copy
  1. public static void main(String[] args) {  
  2.     String str=null;  
  3.     //$使用  
  4.     str=String.format("格式参数$的使用:%1$d,%2$s"99,"abc");             
  5.     System.out.println(str);                       
  6.     //+使用  
  7.     System.out.printf("显示正负数的符号:%+d与%d%n"99,-99);  
  8.     //补O使用  
  9.     System.out.printf("最牛的编号是:%03d%n"7);  
  10.     //空格使用  
  11.     System.out.printf("Tab键的效果是:% 8d%n"7);  
  12.     //.使用  
  13.     System.out.printf("整数分组的效果是:%,d%n"9989997);  
  14.     //空格和小数点后面个数  
  15.     System.out.printf("一本书的价格是:% 50.5f元%n"49.8);  
  16. }  

输出结果

[plain]  view plain  copy
  1. 格式参数$的使用:99,abc  
  2. 显示正负数的符号:+99与-99  
  3. 最牛的编号是:007  
  4. Tab键的效果是:       7  
  5. 整数分组的效果是:9,989,997  
  6. 一本书的价格是:                                          49.80000元  

日期和事件字符串格式化

在程序界面中经常需要显示时间和日期,但是其显示的 格式经常不尽人意,需要编写大量的代码经过各种算法才得到理想的日期与时间格式。字符串格式中还有%tx转换符没有详细介绍,它是专门用来格式化日期和时 间的。%tx转换符中的x代表另外的处理日期和时间格式的转换符,它们的组合能够将日期和时间格式化成多种格式。

常见日期和时间组合的格式,如图所示。

转  换  符

说    明

示    例

c

包括全部日期和时间信息

星期六 十月 27 14:21:20 CST 2007

F

“年-月-日”格式

2007-10-27

D

“月/日/年”格式

10/27/07

r

“HH:MM:SS PM”格式(12时制)

02:25:51 下午

T

“HH:MM:SS”格式(24时制)

14:28:16

R

“HH:MM”格式(24时制)

14:28

测试用例

[java]  view plain  copy
  1. public static void main(String[] args) {  
  2.     Date date=new Date();                                  
  3.     //c的使用  
  4.     System.out.printf("全部日期和时间信息:%tc%n",date);          
  5.     //f的使用  
  6.     System.out.printf("年-月-日格式:%tF%n",date);  
  7.     //d的使用  
  8.     System.out.printf("月/日/年格式:%tD%n",date);  
  9.     //r的使用  
  10.     System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date);  
  11.     //t的使用  
  12.     System.out.printf("HH:MM:SS格式(24时制):%tT%n",date);  
  13.     //R的使用  
  14.     System.out.printf("HH:MM格式(24时制):%tR",date);  
  15. }  

输出结果

[plain]  view plain  copy
  1. 全部日期和时间信息:星期一 九月 10 10:43:36 CST 2012  
  2. 年-月-日格式:2012-09-10  
  3. 月/日/年格式:09/10/12  
  4. HH:MM:SS PM格式(12时制):10:43:36 上午  
  5. HH:MM:SS格式(24时制):10:43:36  
  6. HH:MM格式(24时制):10:43  
定义日期格式的转换符可以使日期通过指定的转换符生成新字符串。这些日期转换符如图所示。
[java]  view plain  copy
  1. public static void main(String[] args) {  
  2.     Date date=new Date();                                      
  3.     //b的使用,月份简称  
  4.     String str=String.format(Locale.US,"英文月份简称:%tb",date);       
  5.     System.out.println(str);                                                                              
  6.     System.out.printf("本地月份简称:%tb%n",date);  
  7.     //B的使用,月份全称  
  8.     str=String.format(Locale.US,"英文月份全称:%tB",date);  
  9.     System.out.println(str);  
  10.     System.out.printf("本地月份全称:%tB%n",date);  
  11.     //a的使用,星期简称  
  12.     str=String.format(Locale.US,"英文星期的简称:%ta",date);  
  13.     System.out.println(str);  
  14.     //A的使用,星期全称  
  15.     System.out.printf("本地星期的简称:%tA%n",date);  
  16.     //C的使用,年前两位  
  17.     System.out.printf("年的前两位数字(不足两位前面补0):%tC%n",date);  
  18.     //y的使用,年后两位  
  19.     System.out.printf("年的后两位数字(不足两位前面补0):%ty%n",date);  
  20.     //j的使用,一年的天数  
  21.     System.out.printf("一年中的天数(即年的第几天):%tj%n",date);  
  22.     //m的使用,月份  
  23.     System.out.printf("两位数字的月份(不足两位前面补0):%tm%n",date);  
  24.     //d的使用,日(二位,不够补零)  
  25.     System.out.printf("两位数字的日(不足两位前面补0):%td%n",date);  
  26.     //e的使用,日(一位不补零)  
  27.     System.out.printf("月份的日(前面不补0):%te",date);  
  28. }  
输出结果

[plain]  view plain  copy
  1. 英文月份简称:Sep  
  2. 本地月份简称:九月  
  3. 英文月份全称:September  
  4. 本地月份全称:九月  
  5. 英文星期的简称:Mon  
  6. 本地星期的简称:星期一  
  7. 年的前两位数字(不足两位前面补0):20  
  8. 年的后两位数字(不足两位前面补0):12  
  9. 一年中的天数(即年的第几天):254  
  10. 两位数字的月份(不足两位前面补0):09  
  11. 两位数字的日(不足两位前面补0):10  
  12. 月份的日(前面不补0):10  
和日期格式转换符相比,时间格式的转换符要更多、更精确。它可以将时间格式化成时、分、秒甚至时毫秒等单位。格式化时间字符串的转换符如图所示。

转  换  符

说    明

示    例

H

2位数字24时制的小时(不足2位前面补0)

15

I

2位数字12时制的小时(不足2位前面补0)

03

k

2位数字24时制的小时(前面不补0)

15

l

2位数字12时制的小时(前面不补0)

3

M

2位数字的分钟(不足2位前面补0)

03

S

2位数字的秒(不足2位前面补0)

09

L

3位数字的毫秒(不足3位前面补0)

015

N

9位数字的毫秒数(不足9位前面补0)

562000000

p

小写字母的上午或下午标记

中:下午

英:pm

z

相对于GMT的RFC822时区的偏移量

+0800

Z

时区缩写字符串

CST

s

1970-1-1 00:00:00 到现在所经过的秒数

1193468128

Q

1970-1-1 00:00:00 到现在所经过的毫秒数

1193468128984


测试代码

[java]  view plain  copy
  1. public static void main(String[] args) {  
  2.     Date date = new Date();  
  3.     //H的使用  
  4.     System.out.printf("2位数字24时制的小时(不足2位前面补0):%tH%n", date);  
  5.     //I的使用  
  6.     System.out.printf("2位数字12时制的小时(不足2位前面补0):%tI%n", date);  
  7.     //k的使用  
  8.     System.out.printf("2位数字24时制的小时(前面不补0):%tk%n", date);  
  9.     //l的使用  
  10.     System.out.printf("2位数字12时制的小时(前面不补0):%tl%n", date);  
  11.     //M的使用  
  12.     System.out.printf("2位数字的分钟(不足2位前面补0):%tM%n", date);  
  13.     //S的使用  
  14.     System.out.printf("2位数字的秒(不足2位前面补0):%tS%n", date);  
  15.     //L的使用  
  16.     System.out.printf("3位数字的毫秒(不足3位前面补0):%tL%n", date);  
  17.     //N的使用  
  18.     System.out.printf("9位数字的毫秒数(不足9位前面补0):%tN%n", date);  
  19.     //p的使用  
  20.     String str = String.format(Locale.US, "小写字母的上午或下午标记(英):%tp", date);  
  21.     System.out.println(str);   
  22.     System.out.printf("小写字母的上午或下午标记(中):%tp%n", date);  
  23.     //z的使用  
  24.     System.out.printf("相对于GMT的RFC822时区的偏移量:%tz%n", date);  
  25.     //Z的使用  
  26.     System.out.printf("时区缩写字符串:%tZ%n", date);  
  27.     //s的使用  
  28.     System.out.printf("1970-1-1 00:00:00 到现在所经过的秒数:%ts%n", date);  
  29.     //Q的使用  
  30.     System.out.printf("1970-1-1 00:00:00 到现在所经过的毫秒数:%tQ%n", date);  
  31. }  

输出结果

[plain]  view plain  copy
  1. 2位数字24时制的小时(不足2位前面补0):11  
  2. 2位数字12时制的小时(不足2位前面补0):11  
  3. 2位数字24时制的小时(前面不补0):11  
  4. 2位数字12时制的小时(前面不补0):11  
  5. 2位数字的分钟(不足2位前面补0):03  
  6. 2位数字的秒(不足2位前面补0):52  
  7. 3位数字的毫秒(不足3位前面补0):773  
  8. 9位数字的毫秒数(不足9位前面补0):773000000  
  9. 小写字母的上午或下午标记(英):am  
  10. 小写字母的上午或下午标记(中):上午  
  11. 相对于GMT的RFC822时区的偏移量:+0800  
  12. 时区缩写字符串:CST  
  13. 1970-1-1 00:00:00 到现在所经过的秒数:1347246232  
  14. 1970-1-1 00:00:00 到现在所经过的毫秒数:1347246232773  

猜你喜欢

转载自blog.csdn.net/kavito/article/details/80663439