格式化數(shù)字打印輸出
之前你已經(jīng)看到使用print和println方法將字符串打印到標(biāo)準(zhǔn)輸出(System.out),由于所有數(shù)字都可以轉(zhuǎn)換為字符串(你將在本課后面看到),你可以使用這些方法打印出任意的字符串和數(shù)字混合,但是,Java編程語(yǔ)言還有其他方法,可以在包含數(shù)字時(shí)對(duì)打印輸出進(jìn)行更多控制。
printf和format方法java.io包中包含一個(gè)PrintStream類,它有兩種格式化方法可用于替換print和println,這些方法,format和printf,彼此相同。你一直使用的熟悉的System.out恰好是PrintStream對(duì)象,因此你可以在System.out上調(diào)用PrintStream方法,因此,你可以在以前使用print或println的代碼中的任何位置使用format或printf,例如:
System.out.format(.....);
這兩個(gè)java.io.PrintStream方法的語(yǔ)法是相同的:
public PrintStream format(String format, Object... args)
其中format是一個(gè)字符串,用于指定要使用的格式,args是要使用該格式打印的變量列表,一個(gè)簡(jiǎn)單的例子就是:
System.out.format("The value of " + "the float variable is " + "%f, while the value of the " + "integer variable is %d, " + "and the string is %s", floatVar, intVar, stringVar);
第一個(gè)參數(shù)format是一個(gè)格式字符串,指定如何格式化第二個(gè)參數(shù)args中的對(duì)象,格式字符串包含純文本和格式說(shuō)明符,它們是格式化Object... args參數(shù)的特殊字符(符號(hào)Object... args稱為可變參數(shù),這意味著參數(shù)的數(shù)量可能會(huì)有所不同)。
格式說(shuō)明符以百分號(hào)(%)開(kāi)頭,以轉(zhuǎn)換器結(jié)束,轉(zhuǎn)換器是一個(gè)字符,指示要格式化的參數(shù)類型,在百分號(hào)(%)和轉(zhuǎn)換器之間,你可以使用可選的標(biāo)志和說(shuō)明符,java.util.Formatter中記錄了許多轉(zhuǎn)換器、標(biāo)志和說(shuō)明符。
這是一個(gè)基本的例子:
int i = 461012; System.out.format("The value of i is: %d%n", i);
%d指定單個(gè)變量是十進(jìn)制整數(shù),%n是與平臺(tái)無(wú)關(guān)的換行符,輸出是:
The value of i is: 461012
printf和format方法有重載方法,每個(gè)都有一個(gè)版本,其語(yǔ)法如下:
public PrintStream format(Locale l, String format, Object... args)
例如,要在法語(yǔ)系統(tǒng)中打印數(shù)字(使用逗號(hào)代替浮點(diǎn)數(shù)的英文表示中的小數(shù)位),你將使用:
System.out.format(Locale.FRANCE, "The value of the float " + "variable is %f, while the " + "value of the integer variable " + "is %d, and the string is %s%n", floatVar, intVar, stringVar);一個(gè)例子
下表列出了表格后面的示例程序TestFormat.java中使用的一些轉(zhuǎn)換器和標(biāo)志。
轉(zhuǎn)換器 | 標(biāo)志 | 說(shuō)明 |
---|---|---|
d | 十進(jìn)制整數(shù) | |
f | 浮點(diǎn)數(shù) | |
n | 適合于運(yùn)行應(yīng)用程序的平臺(tái)的新行字符,你應(yīng)該始終使用%n,而不是 | |
tB | 日期和時(shí)間轉(zhuǎn)換 — 特定于語(yǔ)言環(huán)境的月份全名 | |
td, te | 日期和時(shí)間轉(zhuǎn)換 — 2位數(shù)的月日,td根據(jù)需要有前導(dǎo)零,te沒(méi)有 | |
ty, tY | 日期和時(shí)間轉(zhuǎn)換 — ty = 2位數(shù)年份,tY = 4位數(shù)年份 | |
tl | 日期和時(shí)間轉(zhuǎn)換 — 12小時(shí)制 | |
tM | 日期和時(shí)間轉(zhuǎn)換 — 2位數(shù)分鐘,必要時(shí)帶前導(dǎo)零 | |
tp | 日期和時(shí)間轉(zhuǎn)換 — 特定于語(yǔ)言環(huán)境的am/pm(小寫) | |
tm | 日期和時(shí)間轉(zhuǎn)換 — 2位數(shù)的月份,必要時(shí)帶有前導(dǎo)零 | |
tD | 日期和時(shí)間轉(zhuǎn)換 — 日期為%tm%td%ty | |
08 | 寬度為八個(gè)字符,必要時(shí)帶前導(dǎo)零 | |
+ | 包括正負(fù)號(hào) | |
, | 包含特定于語(yǔ)言環(huán)境的分組字符 | |
- | 左對(duì)齊.. | |
.3 | 小數(shù)點(diǎn)后三位 | |
10.3 | 寬度為十個(gè)字符,右對(duì)齊,小數(shù)點(diǎn)后三位 |
以下程序顯示了你可以使用格式進(jìn)行的一些格式化,輸出顯示在嵌入注釋中的雙引號(hào)內(nèi):
import java.util.Calendar; import java.util.Locale; public class TestFormat { public static void main(String[] args) { long n = 461012; System.out.format("%d%n", n); // --> "461012" System.out.format("%08d%n", n); // --> "00461012" System.out.format("%+8d%n", n); // --> " +461012" System.out.format("%,8d%n", n); // --> " 461,012" System.out.format("%+,8d%n%n", n); // --> "+461,012" double pi = Math.PI; System.out.format("%f%n", pi); // --> "3.141593" System.out.format("%.3f%n", pi); // --> "3.142" System.out.format("%10.3f%n", pi); // --> " 3.142" System.out.format("%-10.3f%n", pi); // --> "3.142" System.out.format(Locale.FRANCE, "%-10.4f%n%n", pi); // --> "3,1416" Calendar c = Calendar.getInstance(); System.out.format("%tB %te, %tY%n", c, c, c); // --> "May 29, 2006" System.out.format("%tl:%tM %tp%n", c, c, c); // --> "2:34 am" System.out.format("%tD%n", c); // --> "05/29/06" } }
本節(jié)中的討論僅涵蓋format和printf方法的基礎(chǔ)知識(shí)DecimalFormat類
你可以使用java.text.DecimalFormat類來(lái)控制前導(dǎo)和尾隨零、前綴和后綴、分組(千)分隔符和小數(shù)分隔符的顯示,DecimalFormat在數(shù)字格式化方面提供了極大的靈活性,但它使你的代碼更復(fù)雜。
下面的示例通過(guò)將模式字符串傳遞給DecimalFormat構(gòu)造函數(shù)來(lái)創(chuàng)建DecimalFormat對(duì)象myFormatter。然后,myFormatter會(huì)調(diào)用DecimalFormat從NumberFormat繼承的format()方法 — 它接受double值作為參數(shù),并返回字符串中的格式化數(shù)字:
這是一個(gè)示例程序,說(shuō)明了DecimalFormat的用法:
import java.text.*; public class DecimalFormatDemo { static public void customFormat(String pattern, double value ) { DecimalFormat myFormatter = new DecimalFormat(pattern); String output = myFormatter.format(value); System.out.println(value + " " + pattern + " " + output); } static public void main(String[] args) { customFormat("###,###.###", 123456.789); customFormat("###.##", 123456.789); customFormat("000000.000", 123.78); customFormat("$###,###.###", 12345.67); } }
輸出是:
123456.789 ###,###.### 123,456.789 123456.789 ###.## 123456.79 123.78 000000.000 000123.780 12345.67 $###,###.### $12,345.67
下表說(shuō)明了每行輸出。
值 | 模式 | 輸出 | 說(shuō)明 |
---|---|---|---|
123456.789 | ###,###.### | 123,456.789 | 井號(hào)(#)表示一個(gè)數(shù)字,逗號(hào)是分組分隔符的占位符,點(diǎn)是小數(shù)分隔符的占位符。 |
123456.789 | ###.## | 123456.79 | 該值在小數(shù)點(diǎn)右側(cè)有三位數(shù),但該模式只有兩位,format方法通過(guò)舍入來(lái)處理這個(gè)問(wèn)題。 |
123.78 | 000000.000 | 000123.780 | 該模式指定前導(dǎo)零和尾隨零,因?yàn)槭褂?b>0字符而不是井號(hào)(#)。 |
12345.67 | $###,###.### | $12,345.67 | 模式中的第一個(gè)字符是美元符號(hào)($),請(qǐng)注意,它緊接在格式化輸出中最左邊的數(shù)字之前。 |
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/72890.html
Java? 教程 Java教程是為JDK 8編寫的,本頁(yè)面中描述的示例和實(shí)踐沒(méi)有利用在后續(xù)版本中引入的改進(jìn)。 Java教程是希望使用Java編程語(yǔ)言創(chuàng)建應(yīng)用程序的程序員的實(shí)用指南,其中包括數(shù)百個(gè)完整的工作示例和數(shù)十個(gè)課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識(shí)的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購(gòu)買。 入門 介紹Java技術(shù)和安裝Java開(kāi)發(fā)軟件并使用...
字符串 在Java編程中廣泛使用的字符串是一系列字符,在Java編程語(yǔ)言中,字符串是對(duì)象。 Java平臺(tái)提供String類來(lái)創(chuàng)建和操作字符串。 創(chuàng)建字符串 創(chuàng)建字符串的最直接方法是編寫: String greeting = Hello world!; 在這種情況下,Hello world!是一個(gè)字符串文字 — 代碼中的一系列字符,用雙引號(hào)括起來(lái),每當(dāng)它在代碼中遇到字符串文字時(shí),編譯器就會(huì)創(chuàng)建一個(gè)帶...
數(shù)字 本節(jié)首先討論java.lang包中的Number類,它的子類,以及使用這些類的實(shí)例化而不是原始數(shù)字類型的情況。 本節(jié)還介紹了PrintStream和DecimalFormat類,它們提供了編寫格式化數(shù)字輸出的方法。 最后,討論了java.lang中的Math類,它包含數(shù)學(xué)函數(shù),以補(bǔ)充語(yǔ)言中內(nèi)置的運(yùn)算符,該類具有三角函數(shù),指數(shù)函數(shù)等方法。 數(shù)字類 使用數(shù)字時(shí),大多數(shù)時(shí)候在代碼中使用基元類型,例...
摘要:創(chuàng)建字符串教程字符串長(zhǎng)度用于獲取有關(guān)對(duì)象的信息的方法稱為訪問(wèn)器方法。類在中被提出,它和之間的最大不同在于的方法不是線程安全的不能同步訪問(wèn)。然而在應(yīng)用程序要求線程安全的情況下,則必須使用類。 一般地,當(dāng)需要使用數(shù)字的時(shí)候,我們通常使用內(nèi)置數(shù)據(jù)類型,如:byte、int、long、double 等。 在實(shí)際開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到需要使用對(duì)象,而不是內(nèi)置數(shù)據(jù)類型的情形。為了解決這個(gè)問(wèn)題,...
摘要:到目前為止,使用越來(lái)越廣泛,不光光只是它強(qiáng)大的生成技術(shù),而且它能夠與進(jìn)行很好的集成。注意使用數(shù)字范圍來(lái)定義集合時(shí)無(wú)需使用方括號(hào)數(shù)字范圍也支持反遞增的數(shù)字范圍如對(duì)象對(duì)象使用花括號(hào)包括中的對(duì)之間以英文冒號(hào)分隔,多組對(duì)之間以英文逗號(hào)分隔。 Freemarker的介紹 ??Freemarker 是一款模板引擎,是一種基于模版生成靜態(tài)文件的通用 工具,它是為程序員提供的一個(gè)開(kāi)發(fā)包,或者說(shuō)是一個(gè)類...
閱讀 3925·2021-09-27 13:56
閱讀 937·2021-09-08 09:36
閱讀 831·2019-08-30 15:54
閱讀 663·2019-08-29 17:29
閱讀 980·2019-08-29 17:21
閱讀 1752·2019-08-29 16:59
閱讀 2824·2019-08-29 13:03
閱讀 3050·2019-08-29 12:47