字符串格式化-字符轉(zhuǎn)換符

前言

熟悉C語言的同學(xué)應(yīng)該記得C語言的sprintf()方法,它是通過在字符串中預(yù)先在需要替換的部位寫入字符轉(zhuǎn)換符冒滩,然后通過不定項對象的傳值進行字符轉(zhuǎn)換,而 Java 也有相似的方法format()進行字符轉(zhuǎn)換抡笼,因為本人當(dāng)前主要以 Java 語言進行開發(fā)工作锚贱,也出于對 Java 更為熟悉欢策,所以接下來的博文主要以 Java 語言編寫案例代碼吆寨。

基礎(chǔ)知識

Java 的 format()

方法format()有兩種重載形式:

  1. format(String format, Object... args) 新字符串使用本地語言環(huán)境,制定字符串格式和參數(shù)生成格式化的新字符串踩寇。
  2. format(Locale locale, String format, Object... args) 使用指定的語言環(huán)境啄清,制定字符串格式和參數(shù)生成格式化的字符串。
    當(dāng)然俺孙,最常使用format()方法的地方是System.out辣卒,那么一般的寫法是System.out.print(String.format("Hello %s", "World!"));,代碼既長也不優(yōu)雅睛榄,所以語法糖的寫法是System.out.printf("Hello %s", "World!"));

字符轉(zhuǎn)換符對應(yīng)關(guān)系

轉(zhuǎn)換符 說 明 示 例
%s 字符串類型 "NeFeed"
%c 字符類型 'm'
%b 布爾類型 true OR false
%d 整數(shù)類型(十進制) 10
%x 整數(shù)類型(十六進制) FF
%o 整數(shù)類型(八進制) 77
%f 浮點類型 6.66
%a 十六進制浮點類型 E.4F
%e 指數(shù)類型 6.23e+24
%g 通用浮點類型(f和e類型中較短的) 42.5000
%h 散列碼 'A' -> 41
%% 百分比類型
%n 換行符 相當(dāng)于"\n"換行作用
%tx 日期與時間類型(x代表不同的日期與時間轉(zhuǎn)換符) 詳見本博文的后半段

基礎(chǔ)代碼實戰(zhàn)

測試用例(jUnit單元測試用例):

@Test
public void stringFormatTest() {
    System.out.println(String.format("Hello %s", "World!"));
    System.out.println(String.format("Hi,%s荣茫、%s、%s", "Java", "Kolin", "Golang"));
    System.out.printf("字母a的大寫是:%c %n", 'A');
    System.out.printf("10>1的結(jié)果是:%b %n", 10 > 1);
    System.out.printf("100的一半是:%d %n", 100 / 2);
    System.out.printf("100的16進制數(shù)是:%x %n", 100);
    System.out.printf("100的8進制數(shù)是:%o %n", 100);
    System.out.printf("50元的書打8.5折扣是:%f 元 %n", 50 * 0.85);
    System.out.printf("上面價格的16進制數(shù)是:%a %n", 50 * 0.85);
    System.out.printf("上面價格的指數(shù)表示:%e %n", 50 * 0.85);
    System.out.printf("上面價格的指數(shù)和浮點數(shù)結(jié)果的長度較短的是:%g %n", 50 * 0.85);
    System.out.printf("上面的折扣是%d%% %n", 85);
    System.out.printf("字母A的散列碼是:%h %n", 'A');
}

控制臺輸出結(jié)果:

Hello World!
Hi,Java懈费、Kolin计露、Golang
字母a的大寫是:A 
10>1的結(jié)果是:true 
100的一半是:50 
100的16進制數(shù)是:64 
100的8進制數(shù)是:144 
50元的書打8.5折扣是:42.500000 元
上面價格的16進制數(shù)是:0x1.54p5 
上面價格的指數(shù)表示:4.250000e+01 
上面價格的指數(shù)和浮點數(shù)結(jié)果的長度較短的是:42.5000 
上面的折扣是85% 
字母A的散列碼是:41 

進階知識

進階標(biāo)識基礎(chǔ)轉(zhuǎn)換符表

標(biāo) 志 說 明 示 例 結(jié) 果
+ 為正數(shù)或者負數(shù)添加符號 ("%+d",15) +15
? 左對齊 ("n%-5dn",25) n25 n
0 數(shù)字前面補0 ("%04d", 21) 0021
空格 在整數(shù)之前添加指定數(shù)量的空格 ("n% 4dn", 99) n 99n
, 以“,”對數(shù)字分組(英式數(shù)字計數(shù)法) ("%,f", 9999.99) 9,999.990000
( 使用括號包含負數(shù) ("%(f", -99.99) (99.990000)
# 如果是浮點數(shù)則包含小數(shù)點,如果是16進制或8進制則添加0x或0 ("%#x", 99)<br />("%#o", 99) 0x63<br />0143
< 格式化前一個轉(zhuǎn)換符所描述的參數(shù) ("%f", 99.45)<br />("%<3.2f", 99.45) 99.450000<br />99.45
$ 被格式化的參數(shù)索引 ("%1$d,%2$s", 99,"abc") 99,abc

進階代碼實戰(zhàn)

測試用例(jUnit單元測試用例):

@Test
public void advanceStringFormatTest() {
    // + 使用
    System.out.printf("顯示正負數(shù)的符號:%+d與%d %n", 10, -10);
    // - 使用
    System.out.printf("顯示左對齊的符號:n%-5dn%-6dn %n", 25, -32);
    // O 使用
    System.out.printf("編號是:%04d %n", 21);
    // 空格 使用
    System.out.printf("Tab鍵的效果是:% 4d %n", 7);
    // , 使用
    System.out.printf("整數(shù)分組的效果是:%,d %n", 9989997);
    // ( 使用
    System.out.printf("使用括號包含負數(shù)的效果是:%(f", -88.88);
    // # 使用
    System.out.printf("#x的效果是:%#x憎乙,#o的效果是:%#o %n", 99, 99);
    // < 使用
    System.out.printf("格式化前一個轉(zhuǎn)換符所描述的參數(shù):%f ; %<3.2f %n", 99.45, 99.45);
    // $ 使用
    System.out.println(String.format("格式參數(shù)$的使用:%1$d,%2$s", 99, "abc"));
    // 空格和小數(shù)點后面?zhèn)€數(shù)
    System.out.printf("一本書的價格是:% 5.5f元%n", 49.8);
}

控制臺輸出結(jié)果:

顯示正負數(shù)的符號:+10與-10 
顯示左對齊的符號:n25   n-32   n 
編號是:0021 
Tab鍵的效果是:   7 
整數(shù)分組的效果是:9,989,997 
使用括號包含負數(shù)的效果是:(88.880000)#x的效果是:0x63,#o的效果是:0143 
格式化前一個轉(zhuǎn)換符所描述的參數(shù):99.450000 ; 99.45 
格式參數(shù)$的使用:99,abc
一本書的價格是: 49.80000元

日期和事件字符串格式化

在程序界面中經(jīng)常需要顯示時間和日期叉趣,但是其顯示的格式在各個界面和業(yè)務(wù)需求中又是大相徑庭泞边,需要編寫大量的代碼經(jīng)過各種算法才得到適用的日期與時間格式。字符串格式中還有%tx轉(zhuǎn)換符沒有詳細介紹疗杉,它是專門用來格式化日期和時間的阵谚。%tx轉(zhuǎn)換符中的x代表另外的處理日期和時間格式的轉(zhuǎn)換符蚕礼,它們的組合能夠?qū)⑷掌诤蜁r間格式化成多種格式。

常見日期和時間轉(zhuǎn)換符表

轉(zhuǎn)換符 說 明 示 例
%tc 包括完整的日期和時間信息 星期五 四月 21 14:21:20 CST 2017
%tF “年-月-日”格式 2017-04-21
%tD “月/日/年”格式 04/21/17
%tr “HH:MM:SS PM”格式(12時制) 02:25:51 下午
%tT “HH:MM:SS”格式(24時制) 14:28:16
%tR “HH:MM”格式(24時制) 14:28

日期代碼實戰(zhàn)

測試用例(jUnit單元測試用例):

@Test
public void dateAndTimeFormatTest() {
    Date date = new Date();
    // c 的使用
    System.out.printf("完整的日期和時間信息:%tc%n", date);
    // f 的使用
    System.out.printf("年-月-日格式:%tF%n", date);
    // d 的使用
    System.out.printf("月/日/年格式:%tD%n", date);
    // r 的使用
    System.out.printf("HH:MM:SS PM格式(12時制):%tr%n", date);
    // t 的使用
    System.out.printf("HH:MM:SS格式(24時制):%tT%n", date);
    // R 的使用
    System.out.printf("HH:MM格式(24時制):%tR", date);
}

控制臺輸出結(jié)果:

完整的日期和時間信息:星期五 四月 21 14:47:00 CST 2017
年-月-日格式:2017-04-21
月/日/年格式:04/21/17
HH:MM:SS PM格式(12時制):02:47:00 下午
HH:MM:SS格式(24時制):14:47:00
HH:MM格式(24時制):14:47

進階日期轉(zhuǎn)換符表

轉(zhuǎn)換符 說 明 示 例
%tb 月份簡稱 Apr<br />四月
%tB 英文月份全稱 April<br /> 四月
%ta 星期的簡稱 Fri<br />星期五
%tA 星期的全稱 Friday<br /> 星期五
%tC 年數(shù)的前兩位數(shù)字(不足兩位前面補0) 20
%ty 年數(shù)的后兩位數(shù)字(不足兩位前面補0) 17
%tj 今年已經(jīng)過去的天數(shù) 111
%tm 兩位數(shù)字的月份(不足兩位前面補0) 04
%td 兩位數(shù)字的日(不足兩位前面補0) 21
%te 月份的日(前面不補0) 21

進階日期代碼實戰(zhàn)

@Test
public void advanceDateFormatTest() {
    Date date=new Date();
    // b 的使用梢什,月份簡稱
    String str=String.format(Locale.US,"英文月份簡稱:%tb",date);
    System.out.println(str);
    System.out.printf("本機語言環(huán)境的月份簡稱:%tb%n",date);
    // B 的使用奠蹬,月份全稱
    str=String.format(Locale.US,"英文月份全稱:%tB",date);
    System.out.println(str);
    System.out.printf("本機語言環(huán)境的月份全稱:%tB%n",date);
    // a 的使用,星期簡稱
    str=String.format(Locale.US,"英文星期的簡稱:%ta",date);
    System.out.println(str);
    System.out.printf("本機語言環(huán)境的星期的簡稱:%ta%n",date);
    // A 的使用嗡午,星期全稱
    str=String.format(Locale.US,"英文星期的全稱:%tA",date);
    System.out.println(str);
    System.out.printf("本機語言環(huán)境的星期的全稱:%tA%n",date);
    // C 的使用囤躁,年數(shù)的前兩位數(shù)字(不足兩位前面補0)
    System.out.printf("年的前兩位數(shù)字(不足兩位前面補0):%tC%n",date);
    // y 的使用,年數(shù)的后兩位數(shù)字(不足兩位前面補0)
    System.out.printf("年的后兩位數(shù)字(不足兩位前面補0):%ty%n",date);
    // j 的使用荔睹,今年已經(jīng)過去的天數(shù)
    System.out.printf("今年已經(jīng)過去的天數(shù):%tj%n",date);
    // m 的使用狸演,月份
    System.out.printf("兩位數(shù)字的月份(不足兩位前面補0):%tm%n",date);
    // d 的使用,日(二位僻他,不夠補零)
    System.out.printf("兩位數(shù)字的日(不足兩位前面補0):%td%n",date);
    // e 的使用宵距,日(一位不補零)
    System.out.printf("月份的日(前面不補0):%te",date);
}

控制臺輸出結(jié)果:

英文月份簡稱:Apr
本機語言環(huán)境的月份簡稱:四月
英文月份全稱:April
本機語言環(huán)境的月份全稱:四月
英文星期的簡稱:Fri
本機語言環(huán)境的星期的簡稱:星期五
英文星期的全稱:Friday
本機語言環(huán)境的星期的全稱:星期五
年的前兩位數(shù)字(不足兩位前面補0):20
年的后兩位數(shù)字(不足兩位前面補0):17
一年中的天數(shù)(即年的第幾天):111
兩位數(shù)字的月份(不足兩位前面補0):04
兩位數(shù)字的日(不足兩位前面補0):21
月份的日(前面不補0):21

進階時間轉(zhuǎn)換符表

轉(zhuǎn)換符 說 明 示 例
%tH 2位數(shù)字24時制的小時(不足2位前面補0) 15
%tI 2位數(shù)字12時制的小時(不足2位前面補0) 03
%tk 2位數(shù)字24時制的小時(前面不補0) 15
%tl 2位數(shù)字12時制的小時(前面不補0) 3
%tM 2位數(shù)字的分鐘(不足2位前面補0) 20
%tS 2位數(shù)字的秒(不足2位前面補0) 12
%tL 3位數(shù)字的毫秒(不足3位前面補0) 381
%tN 9位數(shù)字的毫秒數(shù)(不足9位前面補0) 381000000
%tp 小寫字母的上午或下午標(biāo)記 中:下午<br />英:pm
%tz 相對于GMT的RFC822時區(qū)的偏移量 +0800
%tZ 時區(qū)縮寫字符串 CST
%ts 1970-1-1 00:00:00 到現(xiàn)在所經(jīng)過的秒數(shù) 1492759212
%tQ 1970-1-1 00:00:00 到現(xiàn)在所經(jīng)過的毫秒數(shù) 1492759212381

進階時間代碼實戰(zhàn)

@Test
public void advanceTimeFormatTest() {
    Date date = new Date();
    //H的使用
    System.out.printf("2位數(shù)字24時制的小時(不足2位前面補0):%tH%n", date);
    //I的使用
    System.out.printf("2位數(shù)字12時制的小時(不足2位前面補0):%tI%n", date);
    //k的使用
    System.out.printf("2位數(shù)字24時制的小時(前面不補0):%tk%n", date);
    //l的使用
    System.out.printf("2位數(shù)字12時制的小時(前面不補0):%tl%n", date);
    //M的使用
    System.out.printf("2位數(shù)字的分鐘(不足2位前面補0):%tM%n", date);
    //S的使用
    System.out.printf("2位數(shù)字的秒(不足2位前面補0):%tS%n", date);
    //L的使用
    System.out.printf("3位數(shù)字的毫秒(不足3位前面補0):%tL%n", date);
    //N的使用
    System.out.printf("9位數(shù)字的毫秒數(shù)(不足9位前面補0):%tN%n", date);
    //p的使用
    String str = String.format(Locale.US, "小寫字母的上午或下午標(biāo)記(英):%tp", date);
    System.out.println(str);
    System.out.printf("小寫字母的上午或下午標(biāo)記(中):%tp%n", date);
    //z的使用
    System.out.printf("相對于GMT的RFC822時區(qū)的偏移量:%tz%n", date);
    //Z的使用
    System.out.printf("時區(qū)縮寫字符串:%tZ%n", date);
    //s的使用
    System.out.printf("1970-1-1 00:00:00 到現(xiàn)在所經(jīng)過的秒數(shù):%ts%n", date);
    //Q的使用
    System.out.printf("1970-1-1 00:00:00 到現(xiàn)在所經(jīng)過的毫秒數(shù):%tQ%n", date);
}

控制臺輸出結(jié)果:

2位數(shù)字24時制的小時(不足2位前面補0):15
2位數(shù)字12時制的小時(不足2位前面補0):03
2位數(shù)字24時制的小時(前面不補0):15
2位數(shù)字12時制的小時(前面不補0):3
2位數(shù)字的分鐘(不足2位前面補0):20
2位數(shù)字的秒(不足2位前面補0):12
3位數(shù)字的毫秒(不足3位前面補0):381
9位數(shù)字的毫秒數(shù)(不足9位前面補0):381000000
小寫字母的上午或下午標(biāo)記(英):pm
小寫字母的上午或下午標(biāo)記(中):下午
相對于GMT的RFC822時區(qū)的偏移量:+0800
時區(qū)縮寫字符串:CST
1970-1-1 00:00:00 到現(xiàn)在所經(jīng)過的秒數(shù):1492759212
1970-1-1 00:00:00 到現(xiàn)在所經(jīng)過的毫秒數(shù):1492759212381

總結(jié)

字符串格式化-字符轉(zhuǎn)換符是一把利刃,用得好吨拗,可以減少大量的代碼量满哪,但是,閱讀本文并編寫測試代碼的同學(xué)肯定也發(fā)現(xiàn)了劝篷,字符轉(zhuǎn)換符實在是種類太多了哨鸭,靠死記硬背肯定是不行的,大家可以收藏這篇博文以作字典使用携龟,而個別常用的字符轉(zhuǎn)換符兔跌,大家可以牢記于心。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峡蟋,一起剝皮案震驚了整個濱河市坟桅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蕊蝗,老刑警劉巖仅乓,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蓬戚,居然都是意外死亡夸楣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門子漩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豫喧,“玉大人,你說我怎么就攤上這事幢泼〗粝裕” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵缕棵,是天一觀的道長孵班。 經(jīng)常有香客問我涉兽,道長,這世上最難降的妖魔是什么篙程? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任枷畏,我火速辦了婚禮,結(jié)果婚禮上虱饿,老公的妹妹穿的比我還像新娘拥诡。我一直安慰自己,他們只是感情好郭厌,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布袋倔。 她就那樣靜靜地躺著,像睡著了一般折柠。 火紅的嫁衣襯著肌膚如雪宾娜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天扇售,我揣著相機與錄音前塔,去河邊找鬼。 笑死承冰,一個胖子當(dāng)著我的面吹牛华弓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播困乒,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼寂屏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了娜搂?” 一聲冷哼從身側(cè)響起迁霎,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎百宇,沒想到半個月后考廉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡携御,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年昌粤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啄刹。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡涮坐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出誓军,到底是詐尸還是另有隱情膊升,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布谭企,位于F島的核電站廓译,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏债查。R本人自食惡果不足惜非区,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盹廷。 院中可真熱鬧征绸,春花似錦、人聲如沸俄占。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缸榄。三九已至渤弛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甚带,已是汗流浹背她肯。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鹰贵,地道東北人晴氨。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像碉输,于是被迫代替她去往敵國和親籽前。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理敷钾,服務(wù)發(fā)現(xiàn)枝哄,斷路器,智...
    卡卡羅2017閱讀 134,704評論 18 139
  • longaaaa =14200666; Console.WriteLine(aaaa.ToString("N0")...
    魚落于天閱讀 919評論 0 1
  • 本文轉(zhuǎn)載自:http://blog.csdn.net/lonely_fireworks/article/detai...
    NeWolf閱讀 456評論 0 1
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,238評論 0 4
  • 文/陌小念 我想尋你卻不知你在何方我踏遍了這個城市的每個角落恍惚間才發(fā)現(xiàn)我居然不知道你的模樣我想尋你我翻遍了整個字...
    陌小念閱讀 262評論 6 5