前言
本文內容選自Java核心技術卷1 第10版,感興趣的小伙伴可以自行閱讀原書,以下內容為本人學習后摘取的片段與大家分享。
正文
3.7.2 格式化輸出
可以使用 SyStem.0Ut.print(x) 將數值 x 輸出到控制臺上。這條命令將以 x 對應的數據類型
所允許的最大非 0 數字位數打印輸出 X。
例如:
double x = 10000.0 / 3.0;
System.out.print(x);
打印
3333.3333333333335
如果希望顯示美元、美分等符號, 則有可能會出現問題。
在早期的 Java 版本中,格式化數值曾引起過一些爭議。慶幸的是,Java SE 5.0 沿用了 C語言庫函數中的 printf方法。例如,調用
System.out.printf("8.2f", x);
可以用 8 個字符的寬度和小數點后兩個字符的精度打印 x。也就是說,打印輸出一個空格和7 個字符, 如下所示:
3333.33
在 printf中,可以使用多個參數, 例如:
System.out.printf("Hello, %s. Next year, you'll be SSd", name, age);
每一個以 % 字符開始的格式說明符都用相應的參數替換。 格式說明符尾部的轉換符將指示被格式化的數值類型:f 表示浮點數,s 表示字符串,d 表示十進制整數。下表列出了所有轉換符。
| 轉換符 | 類型 | 舉例 |
|---|---|---|
| d | 十進制整數 | 159 |
| x | 十六進制整數 | 9f |
| o | 八進制整數 | 237 |
| f | 定點浮點數 | 15.9 |
| e | 指數浮點數 | 1.59e+01 |
| g | 通用浮點數 | —— |
| a | 十六進制浮點數 | 0x1.fccdp3 |
| s | 字符串 | Hello |
| c | 字符 | H |
| b | 布爾 | True |
| h | 散列碼 | 42628b2 |
| tx或Tx | 日期時間(T 強制大寫) | 已經過時,應當改為使用java.time類 |
| % | 百分號 | % |
| n | 與平臺有關的行分隔符 | —— |
筆者使用Java 8進行舉例演示
System.out.printf("%d",159);// 159
System.out.println();
System.out.printf("%x",159);// 9f
System.out.println();
System.out.printf("%o",159);// 237
System.out.println();
System.out.printf("%f",15.9);// 15.900000
System.out.println();
System.out.printf("%e",15.9);// 1.590000e+01
System.out.println();
System.out.printf("%a",15.9);// 0x1.fcccccccccccdp3
System.out.println();
System.out.printf("%s","Hello");// Hello
System.out.println();
System.out.printf("%c",'H');// H
System.out.println();
System.out.printf("%b",true);// true
System.out.println();
System.out.printf("%h","159");// be95
System.out.println();
System.out.printf("%td",new Date());// 17,當前日期的“日”
System.out.printf("%n");// 輸出空行即一個行分隔符
另外,還可以給出控制格式化輸出的各種標志。下表列出了所有的標志。例如,逗號
標志增加了分組的分隔符。 即
Systen.out.printf("%,.2f", 10000.0 / 3.0);
打印
3,333.33
可以使用多個標志,例如,"%,(.2f" 使用分組的分隔符并將負數括在括號內。
System.out.printf("%,(.2f", -10000.0 / 3.0);// (3,333.33)
| 標志 | 目的 | 舉例 |
|---|---|---|
| + | 打印正數和負數的符號 | +3333.33 |
| 空格 | 在正數之前添加空格 | | 3333.33| |
| 0 | 數字前面補0 | 003333.33 |
| - | 左對齊 | |3333.33 | |
| ( | 將負數括在括號內 | (3333.33) |
| , | 添加分組分隔符 | 3,333.33 |
| #(對于f格式) | 包含小數點 | 3,333. |
| #(對于x或0格式) | 添加前綴0x或0 | 0xcafe |
| $ | 給定被格式化的參數索引。例如,%1$d,%1$x將以十進制和十六進制格式打印第一個參數 | 159 9F |
| < | 格式化前面說明的數值。例如,%d%<x以十進制和十六進制打印同一個數值 | 159 9F |
筆者使用Java 8舉例演示
System.out.printf("%+.2f", 3333.33);// +3333.330000
System.out.println();
System.out.printf("|% .2f|", 3333.33);// | 3333.33|
System.out.println();
System.out.printf("%09.2f", 3333.33);// 003333.33
System.out.println();
System.out.printf("|%-9.2f|", 3333.33);// |3333.33 |
System.out.println();
System.out.printf("%(.2f", -3333.33);// (3333.33)
System.out.println();
System.out.printf("%,.2f", 3333.33);// 3,333.33
System.out.println();
System.out.printf("%#f", 3333f);// 3333.000000
System.out.println();
System.out.printf("%#x", 0xcafe);// 0xcafe
System.out.println();
System.out.printf("%1$d,%1$x", 159);// 159,9f
System.out.println();
System.out.printf("%d,%<x", 159);// 159,9f
可以使用靜態的 String.format 方法創建一個格式化的字符串, 而不打印輸出:
String message = String.format("Hello, %s. Next year, you'll be %d", name , age);
基于完整性的考慮,下面簡略地介紹 printf方法中日期與時間的格式化選項。在新代碼中,應當使用卷 II 第 6 章中介紹的java.time 包的方法。不過你可能會在遺留代碼中看到 Date 類和相關的格式化選項。格式包括兩個字母,以 t 開始,以表 3-7 中的任意字母結束。
例如,
System.out.printf("%tc", new Date());
這條語句將用下面的格式打印當前的日期和時間:
Mon Feb 09 18:05:19 PST 2015
| 轉換符 | 類型 | 舉例 |
|---|---|---|
| c | 完整的日期和時間 | Mon Feb 09 18:05:19 PST 2015 |
| F | ISO 8601日期 | 2015-02-09 |
| D | 美國格式的日期(月/日/年) | 02/09/2015 |
| T | 24小時時間 | 18:05:19 |
| r | 12小時時間 | 06:05:19 pm |
| R | 24小時時間沒有秒 | 18:05 |
| Y | 4位數字的年(前面補0) | 2015 |
| y | 年的后兩位數字(前面補0) | 15 |
| C | 年的前兩位數字(前面補0) | 20 |
| B | 月的完整拼寫 | February |
| b或h | 月的縮寫 | Feb |
| m | 兩位數字的月(前面補0) | 02 |
| d | 兩位數字的日(前面補0) | 09 |
| e | 兩位數字的日(前面不補0) | 9 |
| A | 星期幾的完整拼寫 | Monday |
| a | 星期幾的縮寫 | Mon |
| j | 三位數的年中的日子(前面補0),在 001 到 366 之間 | 069 |
| H | 兩位數字的小時(前面補0),在 0 到 23 之間 | 18 |
| k | 兩位數字的小時(前面不補0),在 0 到 23 之間 | 18 |
| I | 兩位數字的小時(前面補0),在 0 到 12 之間 | 06 |
| l | 兩位數字的小時(前面不補0),在 0 到 12 之間 | 6 |
| M | 兩位數字的分鐘(前面補0) | 05 |
| S | 兩位數字的秒(前面補0) | 19 |
| L | 三位數字的毫秒(前面補0) | 047 |
| N | 九位數字的毫微秒(前面補0) | 047000000 |
| p | 上午或下午的標志 | pm |
| z | 從GMT起,RFC822 數字位移 | -0800 |
| Z | 時區 | PST |
| s | 從格林威治時間 1970-01-01 00:00:00 起的秒數 | 1078884319 |
| Q | 從格林威治時間 1970-01-01 00:00:00 起的毫秒數 | 1078884319047 |
從表 3-7 可以看到, 某些格式只給出了指定 丨期的部分信息 t 。例如, 只有 FI 期 或 月 份 如
果需要多次對口期操作才能實現對每一部分進行格式化的 Q 的就太笨拙了為此, 可以采用一
個格式化的字符串指出要被格式化的參數索引。索引必須緊跟在 % 后面, 并以 $ 終止。 例如,
System.out.printf("%1$s %2$tB %2$te, %2$tY", "Due date:", new Date());
打印
Due date: February 9, 2015
還可以選擇使用 < 標志它指示前而格式說明中的參數將被再次使用。也就是說,下列語句將產生與前面語句同樣的輸出結果:
System.out.printf("%s %tB %<te, %<tY", "Due date:", new Date());
提示:參教索引值從 1 開始,而不是從 0 開始,對第 1 個參數格式化這就避免了與 0 標志混淆
現在,已經了解了 printf 方法的所有特性。圖 3-6 給出了格式說明符的語法圖。

浙公網安備 33010602011771號