Java字符串格式化功能 String.format用法详解

 更新时间:2024年09月06日 00:38:45   作者:肥仔John  
String类的format()方法用于创建格式化的字符串以及连接多个字符串对象,熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处,format()方法有两种重载形式

一、前言

   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") 是一样的)

五、对整数进行格式化                       

常规类型的格式化

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代表不同的日期与时间转换符

测试用例

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

输出结果

Hi,王力
Hi,王南:王力.王张
字母a的大写是:A 
3>7的结果是:false 
100的一半是:50 
100的16进制数是:64 
100的8进制数是:144 
50元的书打8.5折扣是:42.500000 元
上面价格的16进制数是:0x1.54p5 
上面价格的指数表示:4.250000e+01 
上面价格的指数和浮点数结果的长度较短的是:42.5000 
上面的折扣是85% 
字母A的散列码是:41 

占位符格式为: %[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); // 2024-09-06

可用转换符

  1. 日期的转换符

c,星期六 十月 27 14:21:20 CST 2024
F,2024-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

九、总结

  暂时写到这里吧,以后用到其他的再补充上去!

参考

http://blog.csdn.net/lonely_fireworks/article/details/7962171

http://www.cnblogs.com/xytop/articles/1277125.html

相关文章

  • Java DelayQueue实现延时任务的示例详解

    Java DelayQueue实现延时任务的示例详解

    DelayQueue是一个无界的BlockingQueue的实现类,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。本文就来利用DelayQueue实现延时任务,感兴趣的可以了解一下
    2022-08-08
  • Java实现生成JSON字符串的三种方式分享

    Java实现生成JSON字符串的三种方式分享

    这篇文章主要来和大家分享一下Java实现生成JSON字符串的常见三种方式,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-05-05
  • Java实现删除文件中的指定内容

    Java实现删除文件中的指定内容

    在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧
    2025-06-06
  • 使用工具类-java精确到小数点后6位

    使用工具类-java精确到小数点后6位

    这篇文章主要介绍了使用工具类-java精确到小数点后6位,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 由@NotNull注解引出的关于Java空指针的控制

    由@NotNull注解引出的关于Java空指针的控制

    这是一些很容易学会的简单技术,但是对于代码质量和健壮性来说确实很重要。以我的经验,仅是第一个小技巧就已经对改进代码质量具有很大的作用了
    2016-09-09
  • java中SPI服务提供者的接口使用总结

    java中SPI服务提供者的接口使用总结

    SPI英文全称为Service Provider Interface,顾名思义,服务提供者接口,它是jdk提供给“服务提供厂商”或者“插件开发者”使用的接口
    2022-02-02
  • SpringBoot(JAVA)整合微信公众号消息推送完整步骤(文本、图片/视频推送)

    SpringBoot(JAVA)整合微信公众号消息推送完整步骤(文本、图片/视频推送)

    微信公众号消息推送包括文本推送和图文/视频推送两类,文本推送通过模板消息或自定义消息实现,而图文/视频推送需先上传素材至临时/永久素材库,再上传图文消息,最后进行消息推送,文中将实现的方法介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • 本地缓存在Java中的实现过程

    本地缓存在Java中的实现过程

    这篇文章主要介绍了本地缓存在Java中的实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • SpringBoot项目中访问HTML页面的实现示例

    SpringBoot项目中访问HTML页面的实现示例

    本文主要介绍了SpringBoot项目中访问HTML页面的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • java语言注解基础概念详解

    java语言注解基础概念详解

    这篇文章主要介绍了java语言注解基础概念详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论