了解Java格式化輸出printf,一篇就夠了



了解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
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM