String.format
Java 中,使用 +
进行字符串的硬拼接是非常 low 的,更优雅的做法是使用 String.format
。
介绍
Java 中 String 类的 format()
方法就用于创建格式化的字符串以及连接多个字符串对象:
String.format(String format, Object … args)
format 详细
查看 JDK 文档得知,String.format()
方法的第一个参数是有个完整公式: %[argument_index$][flags][width][.precision]conversion
翻译过来就是:
%[index$][标识][最小宽度][.精度]转换符
这里我们只要牢记这个公式就可以,下面说下每部分所代表的含义
-
argument_index
: 可选,是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由1$
引用,第二个参数由2$
引用,依此类推。 -
flags
: 可选,用来控制输出格式,比如左对齐,金额用逗号隔开等 -
width
: 可选,是一个正整数,表示输出的最小长度 -
precision
:可选,用来限定输出字符数,就是浮点数的精度 -
conversion
:必须,用来表示如何格式化参数的字符
先看一个简单的列子:
System.out.println(String.format("我的名字叫%s", "小明")); //打印:我的名字叫小明
这里我们只用了 %s
这个简单的表达式。
对比上面完整的公式,我们发现 [argument_index$][flags][width][.precision]
这些部分全都省略了,只留下一个必须的 conversion
,在这里 conversion
就是 s
,百分号 %
是固定不变的,[argument_index$]
省略之后,它会自动把 小明
这个值填入到 %s
中去。
下面,我们依次举例说明各个参数的意义:
-
[argument_index$]
String.format("格式参数$的使用:%1$d,%2$s", 99,"abc"); //格式参数$的使用:99,abc String.format("我叫%2$s,她叫%1$s", "小明","小方"); // 我叫小方,她叫小明
依然是百分号%开头,中间多了个
2$
、1$
,表示后面参数位置的索引. -
[flags]
金额添加,
分隔:String.format("%1$,d", 999999999); // 999,999,999
为正负数添加符号:
String.format("显示正负数的符号:%+d与%+d", 99, -99) //显示正负数的符号:+99与-99
-
[width]
String.format("%1$08d", 123456); //00123456
这里0就是flag,表示结果将用零来填充,8就是width,表示最少要8位
-
[.precision]
浮点型数据保留两位小数:String.format("%1$.2f", 12.12555); //12.13
看小数点就知道使用它必须是浮点型数据
-
conversion
八进制整数:String.format("%o", 8); //10
浮点型:
String.format("%f 元", 50*0.85); //42.500000 元
更多conversion 以及 flags 见下表。
flages 与 conversion
flags列表
标 志 | 说 明 | 示 例 | 结 果 |
---|---|---|---|
+ | 为正数或者负数添加符号 | (“%+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 |
conversion列表
转 换 符 | 说 明 | 示 例 |
---|---|---|
%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代表不同的日期与时间转换符) | |
%% | 百分比类型 | % |
时间格式化
我们经常需要格式化时间,所需的 conversion
是一个由两字符组成的序列。
第一个字符是 t
或 T
。
第二个字符表明所使用的格式。
也就是说用 conversion
的时候首先必要写一个t
,然后在写 conversion
。
时间类型有它自己的一套 conversion
,我们简单的选择几个来说:
-
Y
年份,被格式化为必要时带前导零的四位数(至少)。 -
m
月份,被格式化为必要时带前导零的两位数,即 01 - 12。 -
d
一个月中的天数,被格式化为必要时带前导零两位数,即 01 - 31。
上面三个分别表示年月日
String.format("%1$tY-%1$tm-%1$td", new Date()); //2016-11-13
以上就是 yyyy-MM-dd
格式显示当前时间
日期转换符
转 换 符 | 示例说明 |
---|---|
c | 全部日期和时间信息:周二 11月 15 14:37:04 GMT+08:00 2016 |
F | 年-月-日格式:2016-11-15 |
D | 月/日/年格式:11/15/16 |
r | HH:MM:SS PM格式(12时制):02:37:04 下午 |
T | HH:MM:SS格式(24时制):14:37:04 |
R | HH:MM格式(24时制):14:37 |
b | 月份简称 |
B | 月份全称 |
a | 星期简称 |
A | 星期全称 |
C | 年前两位(不足两位补零) |
y | 年后两位(不足两位补零) |
j | 当年的第几天 |
m | 月份(不足两位补零) |
d | 日期(不足两位补零) |
e | 日期(不足两位不补零) |
时间转换符
转 换 符 | 示例说明 |
---|---|
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起经过的豪秒 |
项目中,一般通过网络请求获取的时间日期是字符串,需要配合java中的SimpleDateFormat
类使用,然后转成Date来处理或显示,如下:
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=sdf.parse("2016-11-13 15:30:22");
解释一下,yyyy是完整的西元年,MM是月份,dd是日期,HH是24小时制,而hh是12小时制 ,mm是分,ss是秒
还有,如果涉及到日期的计算,建议不要使用 java 的 Date 类,而是使用 Joda-Time ,或者使用 java8 新的时间类来进行计算。
参考
上一篇: 从1到n之间的数字1出现的次数
下一篇: Scheme & Rewrite