大家好!通常我們的方法帶有需要以某種特殊格式顯示的數字。這看起來是一件小事,但是你會如何實現這個任務呢? 今天我們邀請您思考這個問題。首先,為了深入了解 Java 中的數字格式化,讓我們記住String類別的format方法: public static String format(String format, Object... args) -使用剩餘的args參數傳回從格式字串格式化的字串。只是一個例子:
讓我們為double使用更合適的格式 :
這是可能的日期格式標誌的簡短清單 - 其中有很多,適合各種口味。可以在此連結中找到它們和可能的說明符的完整列表。讓我們看看如何使用它。這次我們不使用String.format(),而是立即使用System.out.printf()。
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
結果,我們將在控制台中得到輸出:
你好薩莎!工作進度如何?
printf 和 format 方法
String.format()不是格式化字串的唯一方法。它的類似物是System.out.printf()和System.out.format();。因此,我們可以將先前的程式碼替換為:System.out.printf("Hi - %s! How are you %s?", "Sasha", "At work");
或者
System.out.format("Hi - %s! How are you %s?", "Sasha", "At work");
控制台中的輸出將保持不變。唯一的區別是這些方法會立即在控制台中顯示值,這與String.format()不同。但我更喜歡String.format(),因為我們並不總是需要在控制台中顯示結果,所以我們將進一步使用這個方法。讓我們回到我們的例子。我們看到了什麼?事實上,在有字元- %s的地方,插入了行- “Sasha”和“at work”。這對我們的發展有何幫助?想像一下,您有一個很大的模板文本,但在某些地方您需要插入可能不同並作為來自外部的參數的值。這就是這種格式可以派上用場的地方。格式說明符以百分號 % 開頭,以指示要格式化的參數類型的字元結尾。而且,正如您可能了解的那樣,%s用於插入物件 - 字串。但是,如果我們嘗試將例如雙精度數插入到註冊字串物件的位置:
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
這也行。double將被轉換為字串,我們將得到:
你好 - 55.6!工作進度如何?
Java中除了字串和浮點數之外,還有其他型別吧?那麼讓我們來看看整個武器庫:
要格式化的值的類型 | 例子 | |
---|---|---|
%s | 任何將被轉換為字串的類型 |
結果:
你好世界!
|
%b | 將轉換為boolean 的任何類型: true - 如果值不為 null, false - 如果為 null |
結果:
你好假
|
%H | 您可以傳遞任何對象,該物件將從hashCode()方法轉換為十六進位值字串 |
結果:
你好106c44!
|
%C | 用於指定 Unicode 字元 ( char ) |
結果:
你好世界!
|
%d | 指定一個整數(int.byte、short、int、long、BigInteger) |
結果:
我已經20歲了!
|
%F | 用於指定浮點數 |
結果:
PI 號是 - 3.141590!
|
%e | 科學計數法中的浮點數 |
結果:
PI 號是 - 3.141590e+00!
|
%A | 浮點數將以十六進位表示 |
結果:
PI 號是 - 0x1.921f9f01b866ep1!
|
%X | 傳遞一個整數(int.byte、short、int、long、BigInteger),格式化結果將是ASCII表中給定數字的字符 |
結果:
我已經19歲了!
|
%o | 接受整數(int.byte、short、int、long、BigInteger)並將其表示為八進位數 |
結果:
我已經31歲了!
|
%t | 日期和時間轉換的前綴。格式化需要額外的標誌 |
結果:
今天是星期六
|
%n | 特定於平台的行分隔符號。模擬\n |
結果:
嗨嗨
|
String str = String.format("The distance from Kyiv to Odessa is %f. Not so short, is it?", 475.4d);
System.out.println(str);
控制台輸出:
基輔 到 敖德薩 的距離是 475.400000。沒那麼少吧?
您可能已經意識到,%f對於浮點數來說是更合適的說明符,其中包括Java 中的double和float等資料類型。使用這個說明符,我們可以格式化浮點數:
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
將.2插入此說明符會將小數位數截斷為兩位,從而得到輸出:
基輔 到 敖德薩 的距離是 475.40。沒那麼少吧?
.2並不是說明符的唯一調整。這些子集的組合稱為指令。指令的一般形式如下:
%[argument_index][flags][width][. precision]類型說明符
現在讓我們按順序破解一切:
- [argument_index]是一個整數,指示參數清單中的位置。例如,第一個參數的連結是 $1,第二個參數的連結是 $2,等等。如果未指定位置,則參數的順序必須與格式字串中引用的順序相同。
- [flags]是用於格式化的特殊字元。例如:
- +標誌,指示如果數值為正,則必須包含 + 符號
- -表示結果左對齊
- ,設定整數的千位分隔符
- [width]是一個十進制正整數,指定將輸出的最小字元數。如果這個數字前面有0,那麼缺少的字元將會用0填充,如果沒有0,則用空格填充。
- [.accuracy]是一個非負整數,前面有一個點。通常用於限製字元數。具體行為取決於說明符的具體類型。
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
相應地,控制台中的輸出:
+03.14159
看起來很容易,對吧?但是當涉及格式化數字時,你不能忽視DecimalFormat。讓我們弄清楚這意味著什麼。
十進位格式
DecimalFormat是一個用於格式化 Java 中任何數字的類,無論是整數還是浮點數。建立DecimalFormat物件後,您可以直接在建構函式中指定用於格式化傳入數字的範本。這就是我們使用DecimalFormat 的範例:DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
控制台輸出:
72,224
#.### 行是一種模式,指示我們將傳遞的值格式化為小數點後 3 位。還有哪些符號可用於圖案?這裡是其中的一些:
- # — 數字,省略前導零;
- 0 — 始終顯示該數字,即使該數字的位數較少(在這種情況下,顯示 0);
- 。——小數點分隔符號;
- , — 分隔符號分組符號(例如,千位分隔符號);
- ; — 分隔格式;
- -——標記負數的前綴;
- % - 乘以 100 並將數字顯示為百分比;
- ?— 乘以 1000,並顯示以 ppm 為單位的數字;
- E - 分隔科學記數法的尾數和指數。
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
控制台輸出:
74,554,542.22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
控制台輸出:
%72.35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
控制台輸出:
042.224
不必每次都建立新的DecimalFormat物件來定義新範本。使用其applyPattern和applyLocalizedPattern方法就足夠了:
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
當我們談論格式化浮點數時,我們對舍入非常感興趣,不是嗎?因此,當修剪小數位數超出指定模式的數字時,如果最後修剪的數字大於 5,DecimalFormat會將數字向上捨入。如果最後修剪的數字是 5,該怎麼辦?事實上,在這種情況下,這個數字恰好位於最接近的整數之間的中間。在這種情況下,會考慮先前的數字。如果前一個數字是偶數,則進行舍入:
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
控制台輸出:
56,459
如果是奇數,則不執行:
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
控制台輸出:
56,459
使用String.format()和DecimalFormat.format() 格式化浮點數的差異在於,在第一種情況下,即使沒有小數部分,也會有尾隨零。例如:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
控制台輸出:
9.0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
控制台輸出:
9
如您所見,當以四位小數的精度格式化數字9.00001273時, String類別的format()方法將輸出值9.0000,而DecimalFormat的類似format()方法將輸出9。
BigDecimal 和 BigInteger
既然我們已經接觸到了Java中的捨入數字的話題,那麼我們就來談談如何使用BigDecimal類別來進行這樣的操作。這個類別的重點是處理非常大的數字:對於它來說,最大雙精確度和浮點值太小。此類別有許多不同的浮點舍入設置,以及許多算術運算方法。它有一個類似的類,但專注於處理大整數 - BigInteger。您可以在本文中閱讀有關BigDecimal和BigInteger的更多資訊。設定日期和時間格式
上面只提到使用String類別的format()也可以格式化時間和日期。好吧,讓我們看看它是如何完成的。首先,我們想提醒您,%t格式說明符用於日期。其次,在格式化範本時,每個日期格式說明符都需要附加格式化標誌。以下是日期可能的格式標誌:旗幟 | 描述 |
---|---|
%tB | 月份的全名,例如,一月、二月等。 |
%tb | 月份的縮寫名稱,如 Jan、Feb 等。 |
%tA | 一週某一天的全名,例如星期日、星期一 |
%ta | 星期幾的縮寫名稱,例如 Sun、Mon 等。 |
%tY | 4 位數字格式的年份,例如 0000 到 9999 |
%ty | 兩位數格式的年份,例如從 00 到 99 |
%Tm值 | 月份格式以零開頭,例如 01 到 12 |
%tc | 日期和時間,格式為 %ta %tb %td %tT %tZ %tY,例如 Mon Feb 17 03:56:12 PST 2020 |
%tD | %tm/%td/%ty 格式的日期 |
%td | 兩位數格式的月份中的第幾天,例如 01 到 31 |
%te | 月中的第幾天,格式不含前導 0,例如從 1 到 31 |
%tT | 24 小時格式的時間,例如 %tH:%tM:%tS |
%tH | 24 小時格式的一天中的小時,從 00 到 23 |
%tI | 12 小時格式的一天中的小時,例如 01 到 12 |
%Tm值 | 小時中的分鐘採用前導零格式化,例如 00 到 59 |
%tS | 一分鐘中的秒數,由兩位數字組成,例如從 00 到 59 |
%tZ | 時區縮寫,例如 PST、UTC 等。 |
實施例1
此外,我們將透過將結果語言作為第一個參數傳遞給該方法來設定它:Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
控制台輸出:
2020 年 10 月 11 日
如果不指定語言,將使用預設語言(例如,我有俄語)。
實施例2
讓我們顯示更完整的日期:Date date = new Date();
System.out.printf("%td %tB %tY of %n%tH:%tM:%tS",date,date,date,date,date,date,date);
以及控制台中的輸出:
2020 年 10 月 11 日 13:43:22
多次傳遞同一個 Date 物件作為參數...看起來不太好,不是嗎?讓我們使用$內部子集來指定我們要使用的參數:
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
我們控制台中的輸出不會改變。還有其他同樣有趣的日期格式設定方法。您可以在本資料中了解它們以及有關 Java 時間和日期的更多資訊。今天就到這裡,感謝大家的關注!
GO TO FULL VERSION