Android开发:String.format() 详解 (string的高级用法)

目录

 

一、问题

二、解决

2.1、例1:“我叫小五,今年23岁了,毕业于家里蹲,目前就职于老牛公司,薪资9000”。

2.2、例二:“我叫小五,今年23岁了,毕业于家里蹲,目前就职于老牛公司,薪资9000.00”。

三、扩展

3.1、重载方法

 3.2、占位符

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

 3.4、对整数进行格式化

 3.5、对浮点数进行格式化

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

3.7、转换符汇总

3.8、标识汇总

3.9、日期转换符

3.10、时间转换符


一、问题

在实际开发过程中会有如下的业务:在一个Textview需要显示”我叫xxx,今年xxx岁了,毕业于xxx,目前就职于xxx,薪资xxx” 。
其中的 xxx 是变化的, 每个用户也是不一样的 。
作为老司机的你,遇到这种情况会怎么样解决呢?写多个TextView  ,分别进行赋值吗?这样做的话,怎么能担负得起老司机的称号呢?我们应该遵循Google的开发模式,通过string和String.format()搭配,来实现这一需求。接下来,上车,系好安全带,发车喽~

二、解决

2.1、例1:“我叫小五,今年23岁了,毕业于家里蹲,目前就职于老牛公司,薪资9000”。

在string.xml中可以这样写:

<resources>
     <string name="old">我叫%s,今年%d岁了,毕业于%s,目前就职于%s,薪资%.0f</string>
</resources>

在业务代码中这样写:

        LineTextView lineTextView = findViewById(R.id.lineTextView);
        String formatStr = getResources().getString(R.string.old);
        lineTextView.setText(String.format(formatStr, "小五", 23, "家里蹲", "老牛公司", 9000.0));

然后,我们进行分析。

我叫小五,今年23岁了,毕业于家里蹲,目前就职于老牛公司,薪资9000” ,

首先,把这句话中的变量找出来,分别是“小五”、“23”、“家里蹲”、“老牛公司”、“9000”,这些是我要实时变化的变量。和业务相关,这里我暂定以上5个关键词为变量。

下一步, 区分变量的类型,我这五个变量中有字符串类型(小五 、家里蹲、老牛公司)、整型(23)、和浮点型(9000)。

第三步,用占位符表示变量,%s表示字符串、%d表示整型、%f表示浮点型,重新组装句子为:“我叫%s,今年%d岁了,毕业于%s,目前就职于%s,薪资%f”。

第四步,使用String.format(String format, Object... args)进行格式化,填充内容String.format(“我叫%s,今年%d岁了,毕业于%s,目前就职于%s,薪资%f”, "小五", 23, "家里蹲", "老牛公司", 9000.0) ,第一个“%s”对应“小五”,第二个“%d”对应23,第三个“%s”对应“家里蹲”,第四个“%s”对应“老牛公司”,第五个“%f”对应9000.0,将实参和占位符形参对应上就可以了。

2.2、例二:“我叫小五,今年23岁了,毕业于家里蹲,目前就职于老牛公司,薪资9000.00”。

例二 和 例一  的区别就在于薪资的小数点位数,来看看实现两位小数点该怎么写。

在string.xml中可以这样写:

<resources>
     <string name="old">我叫%s,今年%d岁了,毕业于%s,目前就职于%s,薪资%.2f</string>
</resources>

在业务代码中这样写:

        LineTextView lineTextView = findViewById(R.id.lineTextView);
        String formatStr = getResources().getString(R.string.old);
        lineTextView.setText(String.format(formatStr, "小五", 23, "家里蹲", "老牛公司", 9000.0));

然后,我们进行分析。

细心的你是否已经发现了两者的不同,其实差别只有一点点,在string的语句中 ,例一是这样写的“薪资%.0f”,例二是这样写的“薪资%.2f”。没错,“.”后面的数字代表的就是要保留小数位数,聪明的你学会了吗?

三、扩展

3.1、重载方法

// 使用本地语言(Locale.getDefault())格式化字符串
String String.format(String fmt, Object... args);

// 自定义语言环境格式化字符串
String String.format(Locale locale, String fmt, Object... args);

 3.2、占位符

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

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

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

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

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

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

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

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

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

占位符格式为: %[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") 是一样的)

 3.4、对整数进行格式化

 占位符格式为: %[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")获取

 3.5、对浮点数进行格式化

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

示例:

double num = 123.4567899;
String.format("%f %n", num); // 123.456790 
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位有效数字,且会进行四舍五入)

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

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

示例:

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

可用转换符

  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起经过的豪秒

3.7、转换符汇总

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

转  换  符

说    明 

示    例

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

 

3.8、标识汇总

标    志

说    明

示    例

结    果

+

为正数或者负数添加符号

("%+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

3.9、日期转换符

转  换  符

说    明

示    例

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

3.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

猜你喜欢

转载自blog.csdn.net/android157/article/details/112448721