字符串格式化
获取字符串使用 String.format(String format, Object… args)
来创建格式化的字符串
转化符 | 说明 | 示例 |
---|
%s | 字符串类型 | “asdf” |
%c | 字符类型 | ‘m’ |
%b | 布尔类型 | true |
%d | 整数类型(十进制) | 99 |
%x | 整数类型(十六进制) | FF |
%o | 整数类型(八进制) | 77 |
%f | 浮点类型 | 99.99 |
%a | 十六进制浮点类型 | FF.35AE |
%e | 指数类型 | 9.38e+5 |
%g | 通用浮点类型(f 和 e 类型中较短的) | |
%h | 散列码 | |
%% | 百分比类型 | 99% |
%n | 换行符 | |
%tx | 日期与时间类型(x 代表不同的日期与时间转换符 | |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| 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');
|
string.xml 中动态配置多个占位字符串内容
1
| %n$ms、%n$md、%n$mf (也可以简写为%s、%d、%f)
|
分别代表输出字符串、整数、浮点数,n 代表是第几个参数,m 的值用来设置空格(3 代表一个空格、4 代表两个..以此类推)
输出浮点数时,m 的值可以控制小数位数,如 m=2.2 时,输出格式为 00.00
1
| <string name="mis_action_button_string">%1$s(%2$d/%3$d)</string>
|
plurals strings 复数
1
2
3
4
| <plurals name="buy_kindle">
<item quantity="one">I want to buy a Kindle</item>
<item quantity="other">I want to buy some Kindles</item>
</plurals>
|
获得该 plurals 方法如下,第二参数传入 quantity,系统会根据 quantity 来选择对应的显示,该方法后也可以加入参数:
1
| getResources().getQuantityString(R.plurals.buy_kindle, 2)
|
strings.xml 放 html 标签
Html.fromHtml(text) 支持的 html 标签却不只这些,具体有那些 android 平台并没有详细列举.在 HTML Tags Supported By TextView 有详细列举.但是额外的标签不能直接定义在 xml 中.貌似会被过滤掉.所以使用额外的标签时,必须用 <![CDATA[
xxx]]>
包围住.当然这样的字符串就不能直接在 xml 中调用了
Html.fromHtml
这个操作耗时,注意
strings.xml 放置特殊字符
转义字符
1
2
3
4
5
6
| // 以下为XML标志符的数字和字符串转义符
" (" 或 ")
' (' 或 ')
& (& 或 &)
lt(<) (< 或 <)
gt(>) (> 或 >)
|
空格
特殊字符
1
| <string name="welcome_messages">Your First Var is %1$s! You Second Var is %2$d.</string>
|
strings.xml 放 emoji
strings.xml 是 UTF-8 编码,
直接将 emoji 放到 strings.xml 中,会报错:
1
| JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xf0
|
1
2
3
4
5
| <!--异常的-->
<string name="withdraw_share_title">👉最近很火的App🔥看新闻👀👀轻轻松松赚零花💰1元提现,秒到账!填写我的邀请码领额外现金红包:BX00100014 🔥 点击下载 👉 http://url.cn/51HKuI8</string>
<!--正确的-->
<string name="withdraw_share_title">👉最近很火的App🔥看新闻👀👀轻轻松松赚零花💰1元提现,秒到账!填写我的邀请码领额外现金红包:BX00100014 🔥 点击下载 👉 http://url.cn/51HKuI8</string>
|
需要将 emoji 换成 unicode,然后放到 strings.xml 中去
https://www.ifreesite.com/unicode/
这种方式部分手机不支持,如 oppo a37m
用 Java 代码转换
1
2
3
4
| // greeting_3 is defined as: "hello there %1$s!"
String s = context.getString(R.string.greeting_3, "😜");
// OR:
String s = context.getString(R.string.greeting_3, new String(Character.toChars(0x1F61C)));
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| private String buildShareMsgWithEmojiStr() {
StringBuilder sb = new StringBuilder();
sb.append(getEmojiByUnicode(0x1F525));
sb.append("最近很火的App");
sb.append(getEmojiByUnicode(0x1F449));
sb.append("看新闻");
sb.append(getEmojiByUnicode(0x1F440));
sb.append(getEmojiByUnicode(0x1F440));
sb.append("轻轻松松赚零花");
sb.append(getEmojiByUnicode(0x1F4B0));
sb.append("1元提现,秒到账!\n");
sb.append("填写我的邀请码领额外现金红包:" + UserCenter.getInstance().getInviteCode() + "\n");
sb.append("点击下载");
sb.append(getEmojiByUnicode(0x1F449));
sb.append("http://url.cn/51HKuI8\n");
return sb.toString();
}
public String getEmojiByUnicode(int unicode) {
return new String(Character.toChars(unicode));
}
|
https://stackoverflow.com/questions/26893796/how-set-emoji-by-unicode-in-a-textview
使用在 xml 文件中定义的带有 emoji 表情内容的文字崩溃的问题
https://github.com/chiemy/android-summary/issues/11
https://stackoverflow.com/questions/35792856/emoji-symbol-in-string-xml-crashes-app
https://stackoverflow.com/questions/24852806/how-can-i-put-utf-16-characters-in-android-string-resource