了解C語言的都知道,C語言的輸出語句printf();可以對里面的內容格式化然后輸出。那么在Java中也給我們提供了相關的方法。兩者十分相似。注意Java中的格式化輸出語句是 System.out.printf();
那么格式化的優點是什么,我認為最重要的一點就是方便,以及增加代碼可讀性。例如下面這兩段代碼:
package day_11_23;
/** * @author soberw */
public class Exer {
public static void main(String[] args) {
String name = "張三";
char sex = '男';
int age = 18;
System.out.println("姓名:" + name + ",年齡:" + age + ",性別:" + sex + "。");
// 姓名:張三,年齡:18,性別:男。
System.out.printf("姓名:%s,年齡:%d,性別:%c。", name, age, sex);
// 姓名:張三,年齡:18,性別:男。
}
}
顯然第二段更加美觀,第一段頻繁使用字符串拼接,如果數據過多,一會自己就迷了。還有就是我們在對一些特定數據進行操作時,格式化也給我們提供了很多便利。
格式化輸出
其中日期轉化的%tx中的x表示另外的處理日期和時間格式的轉換符,它們的組合能夠將日期和時間格式化成多種格式。包括如下
在Java中格式化需要用到轉化符 % ,格式化以%符號開頭,用相應的參數搭配替換內容。(%符號可根據\理解,要想輸出%符號,格式需要寫成這樣%%
轉換符
常用轉換符
常用轉換符實例說明:
package day_11_23;
/** * @author soberw */
public class Printf {
public static void main(String[] args) {
//格式化輸出實例
System.out.printf("我是%s,性別%c,今年%d歲%n", "張三", '男', 18);
//我是張三,性別男,今年18歲
//%n 換行類同 \n
//%s 格式化字符串
System.out.printf("我的名字是:%s\n", "張三");
//我的名字是:張三
//%d 格式化數字(十進制)
System.out.printf("張三今年%d歲%n", 18);
//張三今年18歲
//%o 格式化數字(八進制)
System.out.printf("%o%n", 63);
//77
//%x 格式化數字(十六進制)
System.out.printf("%x%n", 255);
//ff
//%c 格式化字符型j (可用字符對應的ASCII碼替換)
System.out.printf("%c%n", 97);
//a
System.out.printf("%c%n", 'a');
//a
//%b 格式化布爾值
System.out.printf("%b%n", true);
//true
//%f 格式化浮點型
//%.xf x為數字,表示要保留幾位小數,如%.2f為保留兩位小數(會四舍五入)
System.out.printf("%f%n", 1.555);
//1.555000
System.out.printf("%.2f",1.2555);
//1.26 }
}
日期轉換
在格式化日期之前,我們必須要先獲取到當前日期,或者手動設置一個日期。
package day_11_23;
import java.util.Calendar;
import java.util.Date;
/** * @author soberw */
public class PrintfDate {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
Date date = c.getTime();
//%tc 包括全部日期信息
System.out.printf("%tc%n", date);
//周二 11月 23 13:39:27 CST 2021
//%tF "年-月-日"格式
System.out.printf("%tF%n", date);
//2021-11-23
//%tD "月/日/年"格式
System.out.printf("%tD%n", date);
//11/23/21
//%tr "HH:MM:SS PM"格式(12小時制)
System.out.printf("%tr%n", date);
//01:43:04 下午
//%tT "HH:MM:SS"格式(24小時制)
System.out.printf("%tT%n", date);
//13:43:04
//%tR "HH:MM"格式 (24小時制)
System.out.printf("%tR%n", date);
//13:44
//%tH 小時(2位數字24小時制,不足補零)
System.out.printf("%tH%n", date);
//13
//%tI 小時(2位數字12小時制,不足補零)
System.out.printf("%tI%n", date);
//01
//%tk 小時(2位數字24小時制,不補零)
System.out.printf("%tk%n", date);
//13
//%tl 小時(2位數字12小時制,不補零)
System.out.printf("%tl%n", date);
//1
//%tM 分鍾(2位數字分鍾,不足補零)
System.out.printf("%tM%n", date);
//53
//%tS 秒(2位數字秒,不足補零)
System.out.printf("%tS%n", date);
//14
//%tL 毫秒(3位數字毫秒,不足補零)
System.out.printf("%tL%n", date);
//699
//%tN 毫秒(9位數字毫秒,不足補零)
System.out.printf("%tN%n", date);
//699000000
//%tp 上午或者下午
System.out.printf("%tp%n",date);
//下午
//%ts 1970-1-1 00:00:00到現在經過的秒數
System.out.printf("%ts%n",date);
//1637646987
//%tQ 1970-1-1 00:00:00到現在經過的毫秒數
System.out.printf("%tQ%n",date);
//1637646987635
//%tA 星期
System.out.printf("%tA%n",date);
//星期二
}
}
搭配標志
有了上面的演示,我們發現原來格式化輸出如此好用。本來很難實現的效果比如格式化日期時間,現在只需要格式化一下就OK了,但是其實還可以更簡單一下,比如下面的代碼:
package day_11_23;
/** * @author soberw */
public class PrintDateTime {
public static void main(String[] args) {
//舉例輸出:當前日期,格式為 "2021年11月23日 14:04:03 星期二"
long d = System.currentTimeMillis();
System.out.printf("%tY年%tm月%td日 %tT %tA ",d,d,d,d,d);
// 2021年11月23日 14:33:27 星期二
System.out.println();
System.out.printf("%1$tY年%1$tm月%1$td日 %1$tT %1$tA",d);
// 2021年11月23日 14:33:27 星期二
}
}
如果存在同一個數據同時格式化了好幾次的情況,我們不必再重復去寫好幾遍,比如下面的寫法。那么如何實現呢,Java給我們提供了相關的標志符,可以搭配轉換符來使用:
代碼演示:
package day_11_23;
/** * @author soberw */
public class PrintfIdentifier {
public static void main(String[] args) {
//+ 為正數或者負數添加符號
System.out.printf("%+d,%+d\n",15,-3);
//+15,-3
//- 左對齊,后跟數字控制長度
System.out.printf("|%-5d|\n",123);
//|123 |
//0 數字前面補零,后跟數字控制長度
System.out.printf("%02d\n",3);
//03
System.out.printf("%06.2f\n",1.2555);
//001.26
//空格 在整數之前添加指定數量的空格,后跟數字控制長度(空格也可省略)
System.out.printf("|% 5d|\n",99);
//| 99|
System.out.printf("|%5d|\n",99);
//| 99|
//, 對數字分組,一般千位分組
System.out.printf("%,d\n",1000000);
//1,000,000
System.out.printf("%,.2f\n",1000000.00000);
//1,000,000.00
//( 用括號括住負數
System.out.printf("%(.2f\n",-33.333);
//(33.33)
//# 如果是浮點數則包括小數點,如果是16進制或者8進制則添加0x或者0
System.out.printf("%#x\n",99);
System.out.printf("%#o\n",99);
System.out.printf("%#.2f\n",.233);
//< 格式化前一個轉換符所描述的參數,可以連寫,可實現共用參數
System.out.printf("%f和%<3.2f和%<3.3f\n",99.45);
//99.450000和99.45和99.450
//$ 通過索引號獲取參數,索引號從1開始,可實現共用參數(第一個可省略不寫)
System.out.printf("%1$d,%1$d,%1$d\n",11);
//11,11,11
System.out.printf("%1$d,%2$d,%1$d\n",11,222);
//11,222,11
}
}