JavaRush /Java Blog /Random-TW /在 Java 中格式化數字的輸出

在 Java 中格式化數字的輸出

在 Random-TW 群組發布
大家好!通常我們的方法帶有需要以某種特殊格式顯示的數字。這看起來是一件小事,但是你會如何實現這個任務呢? 在 Java 中格式化數字的輸出 - 1今天我們邀請您思考這個問題。首先,為了深入了解 Java 中的數字格式化,讓我們記住String類別的format方法: public static String format(String format, Object... args) -使用剩餘的args參數傳回從格式字串格式化的字串。只是一個例子:
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 任何將被轉換為字串的類型
String.format("Hi %s!","world")
結果:
你好世界!
%b 將轉換為boolean 的任何類型: true - 如果值不為 null, false - 如果為 null
String.format("Hi %b!",null)
結果:
你好假
%H 您可以傳遞任何對象,該物件將從hashCode()方法轉換為十六進位值字串
String.format("Hi %h!","world")
結果:
你好106c44!
%C 用於指定 Unicode 字元 ( char )
String.format("Hello m%cr!",'And')
結果:
你好世界!
%d 指定一個整數(int.byte、short、int、long、BigInteger
String.format("I'm already %d!",20)
結果:
我已經20歲了!
%F 用於指定浮點數
String.format("PI is - %f!", 3.14159)
結果:
PI 號是 - 3.141590!
%e 科學計數法中的浮點數
String.format("PI is - %e!", 3.14159);
結果:
PI 號是 - 3.141590e+00!
%A 浮點數將以十六進位表示
String.format("PI is - %a!", 3.14159)
結果:
PI 號是 - 0x1.921f9f01b866ep1!
%X 傳遞一個整數(int.byte、short、int、long、BigInteger),格式化結果將是ASCII表中給定數字的字符
String.format("I'm already %x!",25)
結果:
我已經19歲了!
%o 接受整數(int.byte、short、int、long、BigInteger)並將其表示為八進位數
String.format("I already %o!",25);
結果:
我已經31歲了!
%t 日期和時間轉換的前綴。格式化需要額外的標誌
String.format("Today is %tA",new Date())
結果:
今天是星期六
%n 特定於平台的行分隔符號。模擬\n
String.format("Hello %n Hello")
結果:
嗨嗨
讓我們為double使用更合適的格式 :
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 中的doublefloat等資料類型。使用這個說明符,我們可以格式化浮點數:
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
.2插入此說明符會將小數位數截斷為兩位,從而得到輸出:
基輔 到 敖德薩 的距離是 475.40。沒那麼少吧?
.2並不是說明符的唯一調整。這些子集的組合稱為指令指令的在 Java 中格式化數字的輸出 - 2一般形式如下:
%[argument_index][flags][width][. precision]類型說明符
現在讓我們按順序破解一切:
  • [argument_index]是一個整數,指示參數清單中的位置。例如,第一個參數的連結是 $1,第二個參數的連結是 $2,等等。如果未指定位置,則參數的順序必須與格式字串中引用的順序相同。
  • [flags]是用於格式化的特殊字元。例如:
    • +標誌,指示如果數值為正,則必須包含 + 符號
    • -表示結果左對齊
    • ,設定整數的千位分隔符
  • [width]是一個十進制正整數,指定將輸出的最小字元數。如果這個數字前面有0,那麼缺少的字元將會用0填充,如果沒有0,則用空格填充。
  • [.accuracy]是一個非負整數,前面有一個點。通常用於限製字元數。具體行為取決於說明符的具體類型。
我還想指出,說明中的所有上述元素都是可選的,沒有它們一切都會工作。作為使用子集的範例,假設我們需要數字 Pi 的特定輸出:
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物件來定義新範本。使用其applyPatternapplyLocalizedPattern方法就足夠了:
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
當我們談論格式化浮點數時,我們對舍入非常感興趣,不是嗎?因此,當修剪小數位數超出指定模式的數字時,如果最後修剪的數字大於 5,DecimalFormat會將數字向上捨入。如果最後修剪的數字是 5,該怎麼辦?事實上,在這種情況下,這個數字恰好位於最接近的整數之間的中間。在 Java 中格式化數字的輸出 - 3在這種情況下,會考慮先前的數字。如果前一個數字是偶數,則進行舍入:
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。您可以在本文中閱讀有關BigDecimalBigInteger的更多資訊。

設定日期和時間格式

上面只提到使用String類別的format()也可以格式化時間和日期。好吧,讓我們看看它是如何完成的。首先,我們想提醒您,%t格式說明符用於日期。其次,在格式化範本時,每個日期格式說明符都需要附加格式化標誌。以下是日期可能的格式標誌:在 Java 中格式化數字的輸出 - 4
旗幟 描述
%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 等。
這是可能的日期格式標誌的簡短清單 - 其中有很多,適合各種口味。可以在此連結中找到它們和可能的說明符的完整列表。讓我們看看如何使用它。這次我們不使用String.format(),而是立即使用System.out.printf()

實施例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 時間和日期的更多資訊。今天就到這裡,感謝大家的關注!在 Java 中格式化數字的輸出 - 5
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION