Java格式化類Format解讀
Format介紹
java.text.Format是Java格式化的抽象基類。主要用于將對(duì)象格式化為指定模式的字符串,或者將指定模式的字符串解析為對(duì)象。
Format方法
- format(格式化)
格式化:對(duì)象格式化為字符串。
public final String format (Object obj)
public final String format (Object obj) {
return format(obj, new StringBuffer(), new FieldPosition(0)).toString();
}一般使用此方法來(lái)將對(duì)象格式化為字符串,該方法為不可變方法,方法內(nèi)部調(diào)用抽象方法的具體子類實(shí)現(xiàn)。
public abstract StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos)
抽象方法,子類必須實(shí)現(xiàn)該方法,定義子類自己具體的對(duì)象格式化為字符串的邏輯。
- parseObject(解析)
解析:字符串解析為對(duì)象。
public Object parseObject(String source) throws ParseException
public Object parseObject(String source) throws ParseException {
ParsePosition pos = new ParsePosition(0);
Object result = parseObject(source, pos);
if (pos.index == 0) {
throw new ParseException("Format.parseObject(String) failed",
pos.errorIndex);
}
return result;
}一般使用此方法來(lái)將字符串解析為對(duì)象,該方法為不可變方法,方法內(nèi)部調(diào)用抽象方法的具體子類實(shí)現(xiàn)。
public abstract Object parseObject (String source, ParsePosition pos)
抽象方法,子類必須實(shí)現(xiàn)該方法,定義子類自己具體的字符串解析為對(duì)象的邏輯。
格式化分類

| 格式化分類 | 格式化類 | 描述 |
|---|---|---|
| 日期時(shí)間格式化 | DateFormat | 格式化日期時(shí)間的抽象類 |
| SimpleDateFormat | DateFormat的實(shí)現(xiàn)類,用于格式化和解析日期時(shí)間,非線程安全 | |
| ClassicFormat | DateTimeFormatter的內(nèi)部類,提供日期時(shí)間的格式化和解析 | |
| 數(shù)字格式化 | NumberFormat | 格式化數(shù)字的抽象類 |
| DecimalFormat | NumberFormat的實(shí)現(xiàn)類,提供數(shù)字格式化和解析 | |
| ChoiceFormat | NumberFormat的實(shí)現(xiàn)類,可以根據(jù)特定的值范圍來(lái)選擇相應(yīng)的格式 | |
| 字符串格式化 | MessageFormat | 用于字符串格式化的類。它可以將帶有占位符的模板字符串和對(duì)應(yīng)的參數(shù)值進(jìn)行格式化 |
| String | String類的format方法用于字符串的格式化 |
日期時(shí)間格式化
1. DateFormat
日期格式化抽象類,根據(jù)當(dāng)前語(yǔ)言環(huán)境格式化日期和時(shí)間。
因?yàn)镈ateFormat是一個(gè)抽象類,所以不能直接new創(chuàng)建實(shí)例對(duì)象。但DateFormat提供了一些靜態(tài)方法便于我們構(gòu)建DateFormat子類的實(shí)例。
常用方法
getInstance
獲取格式化的日期時(shí)間
- getInstance():輸出樣式:22-8-30 下午4:14
getDateInstance
獲取格式化的日期
| 方法 | 描述 |
|---|---|
| getDateInstance() | 輸出樣式:2022-8-30 |
| getDateInstance(int style) | 指定樣式 |
| getDateInstance(int style, Locale aLocale) | 指定樣式和語(yǔ)言環(huán)境 |
getTimeInstance
獲取格式化的時(shí)間
| 方法 | 描述 |
|---|---|
| getTimeInstance() | 輸出樣式:16:14:32 |
| getTimeInstance(int style) | 指定樣式 |
| getTimeInstance(int style, Locale aLocale) | 指定樣式和語(yǔ)言環(huán)境 |
getDateTimeInstance
獲取格式化的日期時(shí)間
| 方法 | 描述 |
|---|---|
| getDateTimeInstance() | 輸出樣式:2022-8-30 16:14:32 |
| getDateTimeInstance(int dateStyle, int timeStyle) | 指定樣式 |
| getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale) | 指定樣式和語(yǔ)言環(huán)境 |
方法入?yún)?/h5>
style
設(shè)置輸出樣式。
DateFormat提供了多種輸出樣式:
/**
* 完整樣式
*/
public static final int FULL = 0;
/**
* 長(zhǎng)樣式
*/
public static final int LONG = 1;
/**
* 中等樣式
*/
public static final int MEDIUM = 2;
/**
* 短樣式
*/
public static final int SHORT = 3;
/**
* 默認(rèn)樣式:中等樣式
*/
public static final int DEFAULT = MEDIUM;| 樣式 | 輸出格式(日期Date) | 輸出格式(時(shí)間Time) |
|---|---|---|
| SHORT | 22-8-30 | 下午4:03 |
| MEDIUM DEFAULT | 2022-8-30 | 16:03:06 |
| LONG | 2022年8月30日 | 下午04時(shí)03分06秒 |
| FULL | 2022年8月30日 星期二 | 下午04時(shí)03分06秒 CST |
Locale
設(shè)置語(yǔ)言環(huán)境。

- language:語(yǔ)言(zh:中文)
- region:地區(qū)(CN:China)
2. SimpleDateFormat
SimpleDateFormat是DateFormat的一個(gè)具體實(shí)現(xiàn)類,是非線程安全的。
因?yàn)镈ateFormat直接支持的樣式比較少,經(jīng)常滿足不了實(shí)際需求,于是SimpleDateFormat就來(lái)了,SimpleDateFormat提供了豐富的樣式且可自定義樣式。
在使用SimpleDateFormat的時(shí)候,需要通過(guò)字母來(lái)描述時(shí)間元素,并組裝成想要的日期和時(shí)間模式。
常用模式元素
常用的日期時(shí)間元素和字母的對(duì)應(yīng)表如下:
| 字母 | 描述 | 實(shí)例 |
|---|---|---|
| G | 年代標(biāo)志符(公元、公元前) | AD、BC |
| y | 年 | 2015 |
| Y | 周年 | 2016 |
| M | 年中的月份 | 12 |
| w | 年中的周數(shù) | 50 |
| W | 月份中的周數(shù) | 02 |
| D | 年中的天數(shù) | 344 |
| d | 月份中的天數(shù) | 10 |
| F | 月份中的星期 | 02 |
| E | 周中的天數(shù)(星期幾) | Thu |
| u | 周中的天數(shù)(第幾天,星期一=1,星期日=7) | 1 |
| a | AM/PM標(biāo)記 | AM、PM、上午、下午 |
| H | 一天中的小時(shí)數(shù)(0~23) | 21 |
| k | 一天中的小時(shí)數(shù)(1~24) | 21 |
| K | AM/PM中的小時(shí)數(shù)(0~11) | 09 |
| h | AM/PM中的小時(shí)數(shù)(1~12) | 09 |
| m | 小時(shí)中的分鐘數(shù) | 31 |
| s | 分鐘中的秒數(shù) | 08 |
| S | 毫秒數(shù) | 716 |
| z | 時(shí)區(qū) | CST |
| Z | 時(shí)區(qū)(RFC 822標(biāo)準(zhǔn)時(shí)區(qū)) | +0800 |
| X | 時(shí)區(qū)(ISO 8601標(biāo)準(zhǔn)時(shí)區(qū)) | +08 |
y與Y的區(qū)別:
- YY是周年
- yy是日歷年,推薦使用y
舉例:今天是2019年12月30日,日歷年是 2019,但周年是 2020,因?yàn)楸局苁?2020 年的第 1 周。所以yy是19,而YY是20。
使用方法
格式化
public static void main(String[] args) throws ParseException {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("G yyyy-MM-dd HH:mm:ss S E z");
String format = simpleDateFormat.format(date);
}debug:

解析
public static void main(String[] args) throws ParseException {
String str = "公元 2022-08-30 22:10:03 530 星期二 CST";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("G yyyy-MM-dd HH:mm:ss S E z");
Date date1 = (Date) simpleDateFormat.parseObject(str);
}debug:

3. ClassicFormat
暫不分析。
數(shù)字格式化
1. NumberFormat
數(shù)字格式化抽象類,根據(jù)當(dāng)前語(yǔ)言環(huán)境格式化數(shù)字。
NumberFormat是一個(gè)抽象類,不能直接new創(chuàng)建實(shí)例對(duì)象。NumberFormat提供了一些靜態(tài)方法便于我們構(gòu)建NumberFormat子類的實(shí)例。
常用方法
getInstance
獲取格式化的常規(guī)數(shù)值
- getInstance()
- getInstance(Locale inLocale)
getNumberInstance
獲取格式化的常規(guī)數(shù)值
- getNumberInstance()
- getNumberInstance(Locale inLocale)
getIntegerInstance
獲取格式化的整型數(shù)值
- getIntegerInstance()
- getIntegerInstance(Locale inLocale)
getPercentInstance
獲取格式化的百分比數(shù)值
- getPercentInstance()
- getPercentInstance(Locale inLocale)
getCurrencyInstance
獲取格式化的指定語(yǔ)言環(huán)境的貨幣數(shù)值
- getCurrencyInstance()
- getCurrencyInstance(Locale inLocale)
方法示例
public static void main(String[] args) throws ParseException {
NumberFormat instance = NumberFormat.getInstance();
String format = instance.format(2.3);
System.out.println("getInstance=====================" + format);
NumberFormat integerInstance = NumberFormat.getIntegerInstance();
String format1 = integerInstance.format(2.3);
System.out.println("getIntegerInstance==============" + format1);
NumberFormat percentInstance = NumberFormat.getPercentInstance();
String format2 = percentInstance.format(2.3);
System.out.println("getPercentInstance==============" + format2);
NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();
String format3 = currencyInstance.format(2.3);
System.out.println("getCurrencyInstance=============" + format3);
NumberFormat currencyInstance1 = NumberFormat.getCurrencyInstance(Locale.US);
String format4 = currencyInstance1.format(2.3);
System.out.println("getCurrencyInstance(Locale.US)==" + format4);
}控制臺(tái)日志:
getInstance=====================2.3
getIntegerInstance==============2
getPercentInstance==============230%
getCurrencyInstance=============¥2.30
getCurrencyInstance(Locale.US)==$2.30
2. DecimalFormat
DecimalFormat是NumberFormat的一個(gè)具體子類,用于格式化十進(jìn)制數(shù)字。
DecimalFormat能夠分析和格式化任意語(yǔ)言環(huán)境中的數(shù)字:
- 包括對(duì)西方語(yǔ)言、阿拉伯語(yǔ)和印度語(yǔ)數(shù)字的支持。
- 支持整數(shù) (123)、定點(diǎn)數(shù) (123.4)、科學(xué)記數(shù)法表示的數(shù) (1.23E4)、百分?jǐn)?shù) (12%) 和金額 ($123)等。
- 所有的內(nèi)容都可以本地化(本地化:使用本地的語(yǔ)言環(huán)境)。
需要注意的是:DecimalFormat是非線程安全的。
DecimalFormat支持手動(dòng)配置模式和使用模式符號(hào)。
手動(dòng)設(shè)置模式
- setMaximumFractionDigits(int newValue):設(shè)置小數(shù)部分中允許的最大數(shù)字位數(shù)
- setMinimumFractionDigits(int newValue):設(shè)置小數(shù)部分中允許的最小數(shù)字位數(shù),如果原數(shù)小數(shù)位數(shù)不夠的話,會(huì)補(bǔ)零。
- setGroupingSize(int i):設(shè)置分組中一組的位數(shù)(整數(shù)部分,默認(rèn)3個(gè)數(shù)字為一組)。
- setGroupingUsed(boolean value):設(shè)置是否使用分組,true表示使用,false表示取消分組
- setMaximumIntegerDigits(int newValue):設(shè)置整數(shù)部分允許的最大數(shù)字位數(shù)
- setMinimumIntegerDigits(int newValue):設(shè)置整數(shù)部分允許的最小數(shù)字位數(shù)
使用模式符號(hào)串
| 符號(hào) | 位置 | 是否本地化 | 含義 |
|---|---|---|---|
| 0 | 數(shù)字 | 是 | 阿拉伯?dāng)?shù)字,位數(shù)不足時(shí)補(bǔ)0 |
| # | 數(shù)字 | 是 | 阿拉伯?dāng)?shù)字,位數(shù)不足時(shí)不管 |
| . | 數(shù)字 | 是 | 小數(shù)分隔符或貨幣小數(shù)分隔符 |
| - | 數(shù)字 | 是 | 減號(hào) |
| , | 數(shù)字 | 是 | 分組分隔符 |
| E | 數(shù)字 | 是 | 分隔科學(xué)計(jì)數(shù)法中的尾數(shù)和指數(shù) |
| ; | 子模式邊界 | 是 | 分隔正數(shù)和負(fù)數(shù)子模式 分號(hào)前是正常模式,分號(hào)后是負(fù)數(shù)輸入的的輸出前綴 - 如果輸入為正數(shù),輸出:正常模式的結(jié)果 - 如果輸入為正數(shù),輸出:負(fù)數(shù)的前綴+正常模式的結(jié)果的絕對(duì)值 |
| % | 前綴或后綴 | 是 | 乘以100并顯示為百分?jǐn)?shù) |
| \u2030 | 前綴或后綴 | 是 | 乘以1000并顯示為千分?jǐn)?shù) |
| ¤(\u00A4) | 前綴或后綴 | 否 | 貨幣記號(hào),由貨幣符號(hào)替換。 如果同時(shí)出現(xiàn)兩個(gè)該符號(hào),則用國(guó)際貨幣符號(hào)替換。 如果出現(xiàn)在某個(gè)模式中,則使用貨幣小數(shù)分隔符,而不使用小數(shù)分隔符。 |
| ' | 前綴或后綴 | 否 | 用于在前綴或后綴中為特殊字符加引號(hào),使特殊符號(hào)變?yōu)槠胀ㄗ址ㄈ缫獎(jiǎng)?chuàng)建單引號(hào)本身,請(qǐng)連續(xù)使用兩個(gè)單引號(hào))。 例如:"'#'#" 將123格式化為 "#123" |
使用方法
格式化
① 手動(dòng)配置模式
public static void main(String[] args) throws ParseException {
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setGroupingUsed(true);// 使用分組
decimalFormat.setGroupingSize(4);// 分組中一組的位數(shù)
decimalFormat.setMinimumIntegerDigits(2);// 整數(shù)部分最小位數(shù)
decimalFormat.setMaximumIntegerDigits(8);// 整數(shù)部分最大位數(shù)
decimalFormat.setMinimumFractionDigits(2);// 小數(shù)部分最小位數(shù)
decimalFormat.setMaximumFractionDigits(4);// 小數(shù)部分最大位數(shù)
System.out.println(decimalFormat.format(1.11));// 01.11
System.out.println(decimalFormat.format(11111.222));// 1,1111.222
System.out.println(decimalFormat.format(11111111111.222222222222));// 1111,1111.2222
}② 使用模式符號(hào)串
public static void main(String[] args){
double pi = 3.1415926;
// 取整數(shù)部分,整數(shù)部分不足2位補(bǔ)0
System.out.println(new DecimalFormat("00").format(pi));// 03
// 取整數(shù)部分和10位小數(shù),整數(shù)部分不足2位補(bǔ)0,小數(shù)部分不足10位補(bǔ)0
System.out.println(new DecimalFormat("00.0000000000").format(pi));// 03.1415926000
// 取整數(shù)部分,整數(shù)部分不足2位不管
System.out.println(new DecimalFormat("##").format(pi));// 3
// ###和上面的##沒(méi)區(qū)別
System.out.println(new DecimalFormat("###").format(pi));// 3
// 取整數(shù)部分和10位小數(shù),整數(shù)部分不足2位不管,小數(shù)部分不足10位不管
System.out.println(new DecimalFormat("##.##########").format(pi));// 3.1415926
// 若輸入為非負(fù)數(shù),按;前面的正常模式輸出
// 若輸入為負(fù)數(shù),按;后面的(負(fù)數(shù)輸入的輸出前綴+正常模式輸出的絕對(duì)值)輸出
System.out.println(new DecimalFormat("#.##;前綴").format(3.1415926));// 3.14
System.out.println(new DecimalFormat("#.##;前綴").format(-3.1415926));// 前綴3.14
// 百分比方式計(jì)數(shù)(百分號(hào)在末位),取整數(shù)部分和2位小數(shù),小數(shù)部分不足2位不管
System.out.println(new DecimalFormat("#.##%").format(pi));// 314.16%
// 百分比方式計(jì)數(shù)(百分號(hào)在首位),取整數(shù)部分和2位小數(shù),小數(shù)部分不足2位不管
System.out.println(new DecimalFormat("%#.##").format(pi));// %314.16
// 千分比方式計(jì)數(shù)(千分號(hào)在末位),取整數(shù)部分和2位小數(shù),小數(shù)部分不足2位不管
System.out.println(new DecimalFormat("#.##\u2030").format(pi));// 3141.59‰
// 千分比方式計(jì)數(shù)(千分號(hào)在首位),取整數(shù)部分和2位小數(shù),小數(shù)部分不足2位不管
System.out.println(new DecimalFormat("\u2030#.##").format(pi));// ‰3141.59
//顯示為科學(xué)計(jì)數(shù)法,并取五位小數(shù)
System.out.println(new DecimalFormat("#.#####E0").format(pi));// 3.14159E0
//顯示為兩位整數(shù)的科學(xué)計(jì)數(shù)法,并取四位小數(shù)
System.out.println(new DecimalFormat("00.####E0").format(pi));// 31.4159E-1
//取整數(shù)部分,每三位以逗號(hào)進(jìn)行分隔。
System.out.println(new DecimalFormat(",###").format(pi));// 3
// 添加貨幣符號(hào)在首位,如果同時(shí)出現(xiàn)兩個(gè)該符號(hào),則用國(guó)際貨幣符號(hào)
System.out.println(new DecimalFormat("¤#.##").format(pi));// ¥3.14
System.out.println(new DecimalFormat("\u00A4#.##").format(pi));// ¥3.14
System.out.println(new DecimalFormat("¤¤#.##").format(pi));// CNY3.14
// 添加貨幣符號(hào)在末位,如果同時(shí)出現(xiàn)兩個(gè)該符號(hào),則用國(guó)際貨幣符號(hào)
System.out.println(new DecimalFormat("#.##¤").format(pi));// 3.14¥
System.out.println(new DecimalFormat("#.##\u00A4").format(pi));// 3.14¥
System.out.println(new DecimalFormat("#.##¤¤").format(pi));// 3.14CNY
// 將特殊字符變?yōu)槠胀ㄗ址?
System.out.println(new DecimalFormat("''#.##").format(pi));// '3.14
System.out.println(new DecimalFormat("#.##''").format(pi));// 3.14'
System.out.println(new DecimalFormat("'#'#.##").format(pi));// #3.14
System.out.println(new DecimalFormat("#.##'#'").format(pi));// 3.14#
//將格式嵌入文本
System.out.println(new DecimalFormat("圓周率π:#.##").format(pi));// 圓周率π:3.14
}解析
解析也可以手動(dòng)配置模式或者使用模式符號(hào)串,這里只以使用模式符號(hào)串方式舉例。
public static void main(String[] args) throws ParseException {
System.out.println(new DecimalFormat("圓周率π:#.##").parseObject("圓周率π:3.14"));// 3.14
System.out.println(new DecimalFormat("#.##;前綴").parseObject("前綴3.14"));// -3.14
System.out.println(new DecimalFormat("00.####E0").parseObject("31.4159E-1"));// 3.14159
}3. ChoiceFormat
ChoiceFormat將格式化運(yùn)用到某個(gè)范圍的數(shù)。
ChoiceFormat與其他Format類的不同之處在于,它使用構(gòu)造函數(shù)放入方式(而不是使用getInstance樣式工廠方法)創(chuàng)建ChoiceFormat對(duì)象。
注意:limits數(shù)組需要升序排列(否則結(jié)果會(huì)出錯(cuò))
常用方法
nextDouble(double d)
查找大于d的最小double值,一般用在limits數(shù)組中,從而使limits數(shù)組形成一個(gè)右開(kāi)區(qū)間數(shù)組
例如:limits = {0,1,ChoiceFormat.nextDouble(1)}
nextDouble(double d, boolean positive)
- positive=true,表示查找大于d的最小double值,一般用在limits數(shù)組中,從而使limits數(shù)組形成一個(gè)右開(kāi)區(qū)間數(shù)組
- positive=false,表示查找小于d的最大double值,一般用在limits數(shù)組中,從而使limits數(shù)組形成一個(gè)左開(kāi)區(qū)間數(shù)組
previousDouble(double d)
查找小于d的最大double值,一般用在limits數(shù)組中,從而使limits數(shù)組形成一個(gè)左開(kāi)區(qū)間數(shù)組
public static void main(String[] args) {
System.out.println(ChoiceFormat.nextDouble(1));// 1.0000000000000002
System.out.println(ChoiceFormat.nextDouble(1,true));// 1.0000000000000002
System.out.println(ChoiceFormat.nextDouble(1,false));// 0.9999999999999999
System.out.println(ChoiceFormat.previousDouble(1));// 0.9999999999999999
}上面三個(gè)方法的使用場(chǎng)景:
如果有個(gè)這樣的需求:
- 當(dāng)number < 1時(shí),取值0
- 當(dāng)1 <= number <= 2時(shí),取值1
- 當(dāng)2 < number <= 3時(shí),取值2
- 當(dāng)number > 3時(shí),取值3
代碼實(shí)現(xiàn):
double[] limits = {0, 1, 2, 3};
String[] formats = {"0","1","2","3"};
ChoiceFormat format = new ChoiceFormat(limits, formats);如果這樣的寫(xiě)法,顯然不能滿足:
- number = 2時(shí),取值1
- number = 3時(shí),取值2
我們可以這么寫(xiě)
public static void main(String[] args) {
double[] limits = {0, 1, ChoiceFormat.nextDouble(2), ChoiceFormat.nextDouble(3)};
String[] formats = {"0","1","2","3"};
ChoiceFormat format = new ChoiceFormat(limits, formats);
System.out.println(format.format(0));
System.out.println(format.format(1));
System.out.println(format.format(2));
System.out.println(format.format(3));
System.out.println(format.format(4));
}
能完全滿足上面的需求(number = 2時(shí),取值1;number = 3時(shí),取值2)。
ChoiceFormat(double[] limits, String[] formats)
構(gòu)造函數(shù)中接收一個(gè)formats數(shù)組和一個(gè)limits數(shù)組,這兩個(gè)數(shù)組必須具有相同數(shù)量的元素。
- 第一個(gè)數(shù)組是原始雙精度數(shù)組,表示每個(gè)間隔的最小值(起始值)。
- 第二個(gè)數(shù)組是一個(gè)字符串?dāng)?shù)組,代表與每個(gè)間隔關(guān)聯(lián)的名稱。
limits數(shù)組實(shí)際上是個(gè)區(qū)間,可開(kāi)可閉,并且必須按升序排列,如果不按升序排列,格式化結(jié)果將會(huì)不正確,還可以使用\u221E(表示無(wú)窮大)。
匹配規(guī)則:limits[i] <= number <limits[i+1]
number表示使用format方法傳入的值,i表示limit數(shù)組中的索引。當(dāng)且僅當(dāng)上述公式成立時(shí),number匹配i,如果不能匹配,則會(huì)根據(jù)number是太小還是太大,匹配limits數(shù)組的第一個(gè)索引或最后一個(gè)索引,然后使用匹配的limits數(shù)組中的索引,去formats數(shù)組中尋找相同索引的值。
public static void main(String[] args) {
double[] limits = {0, 1, 2, 3, 4, 5, 6};
String[] formats = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
ChoiceFormat format = new ChoiceFormat(limits, formats);
System.out.println(format.format(-1));// 星期一
System.out.println(format.format(0));// 星期一
System.out.println(format.format(1));// 星期二
System.out.println(format.format(2.5));// 星期三
System.out.println(format.format(6.6));// 星期日
System.out.println(format.format(7));// 星期日
System.out.println(format.format(8));// 星期日
}| namber取值范圍 | 匹配formats索引位置 | 匹配值 |
|---|---|---|
| number < 0 | 匹配formats[0] | 星期一 |
| 0 <= number < 1 | 匹配formats[0] | 星期一 |
| 1 <= number < 2 | 匹配formats[1] | 星期二 |
| 2 <= number < 3 | 匹配formats[2] | 星期三 |
| 3 <= number < 4 | 匹配formats[3] | 星期四 |
| 4 <= number < 5 | 匹配formats[4] | 星期五 |
| 5 <= number < 6 | 匹配formats[5] | 星期六 |
| numbe >= 6 | 匹配formats[6] | 星期日 |
ChoiceFormat(String newPattern)
ChoiceFormat類的構(gòu)造方法也允許我們傳入一個(gè)模式字符串,format方法會(huì)根據(jù)這個(gè)模式字符串執(zhí)行格式化操作。
模式元素的格式:doubleNum [占位符] formatStr
占位符
| 占位符 | 描述 |
|---|---|
| # | 等于 |
| < | 大于 |
| \u2264(<=) | 大于等于 |
注意:比較運(yùn)算符和平時(shí)實(shí)現(xiàn)相反的,因?yàn)樵摰胤筋愃朴谧兞吭诒容^運(yùn)算符的右邊(平時(shí)是在左邊)
模式字符串中的每個(gè)模式元素之間使用 | 分割,| 前后可以添加空格以美化代碼。
其實(shí)在ChoiceFormat(String newPattern)構(gòu)造方法的內(nèi)部,模式字符串還是被轉(zhuǎn)換為limits和formats兩個(gè)數(shù)組。
public static void main(String[] args) {
ChoiceFormat choice=new ChoiceFormat("1 # A | 2 < B | 3 \u2264 C | 5 # D");
System.out.println(choice.format(0));
System.out.println(choice.format(1));
System.out.println(choice.format(2));
System.out.println(choice.format(3));
System.out.println(choice.format(4));
System.out.println(choice.format(5));
System.out.println(choice.format(6));
}
字符串格式化
1. MessageFormat
MessageFormat提供與語(yǔ)言環(huán)境無(wú)關(guān)的生成連接消息的方式。
通常用MessageFormat的靜態(tài)方法format,該方法接收一個(gè)字符串的模式和一組對(duì)象(對(duì)象數(shù)組),按照模式形式將格式化的對(duì)象插入到模式中,然后返回字符串結(jié)果。
static String format(String pattern, Object … arguments)
- pattern:字符串模式
- arguments:對(duì)象數(shù)組
模式元素
模式元素格式:ArgumentIndex[,FormatType[,FormatStyle]]
- ArgumentIndex:入?yún)⑺饕恢茫◤?開(kāi)始)
- FormatType:格式化類型
- FormatStyle:格式化樣式
格式化類型
- date:調(diào)用DateFormat進(jìn)行格式化
- time:調(diào)用DateFormat進(jìn)行格式化
- number:調(diào)用NumberFormat進(jìn)行格式化
- choice:調(diào)用ChoiceFormat進(jìn)行格式化
格式化樣式
- short
- medium
- long
- full
- integer
- currency
- percent
- SubformatPattern(子模式)
使用示例
public static void main(String[] args) {
Date date = new Date();
System.out.println(MessageFormat.format("{0},{1},{2}", date, date, 1.11));
System.out.println(MessageFormat.format("{0,date},{1,time},{2,number}", date, date, 1.11));
System.out.println(MessageFormat.format("{0,date,MEDIUM},{1,time,MEDIUM},{2,number,integer},{3,number,#.#}", date, date, 1.11, 2.22));
}輸出:
22-9-5 下午10:47,22-9-5 下午10:47,1.11
2022-9-5,22:47:39,1.11
2022-9-5,22:47:39,1,2.2
2. String.format
String有兩個(gè)格式化方法
- format(String format, Object… args)
- format(Locale l, String format, Object… args)
format參數(shù)
format參數(shù)格式:%[index$][flags][width][.precision]conversion
模塊
| 模塊 | 是否必須 | 描述 |
|---|---|---|
| index$ | 否 | 參數(shù)在參數(shù)列表中的位置,十進(jìn)制整數(shù)。 第一個(gè)參數(shù)由 "1$" 引用,第二個(gè)參數(shù)由 "2$"引用 |
| flags | 否 | 標(biāo)識(shí),用來(lái)控制輸出格式 |
| width | 否 | 輸出的最小長(zhǎng)度,正整數(shù) |
| .precision | 否 | 精度,限定輸出字符數(shù) |
| conversion | 是 | 轉(zhuǎn)換符,指定如何格式化參數(shù) |
標(biāo)識(shí)
| 標(biāo)識(shí) | 描述 |
|---|---|
| - | 在最小寬度內(nèi)左對(duì)齊,不可與0標(biāo)識(shí)一起使用 |
| 0 | 若內(nèi)容長(zhǎng)度不足最小寬度,則在左邊用0來(lái)填充 |
| # | 對(duì)8進(jìn)制和16進(jìn)制,8進(jìn)制前添加一個(gè)0,16進(jìn)制前添加0x |
| + | 結(jié)果總包含一個(gè)+或-號(hào) |
| 空格 | 正數(shù)前加空格,負(fù)數(shù)前加-號(hào) |
| , | 只用與十進(jìn)制,每3位數(shù)字間用,分隔 |
| ( | 若結(jié)果為負(fù)數(shù),則用括號(hào)括住,且不顯示符號(hào) |
轉(zhuǎn)換符
| s | 字符串類型 |
| c | 字符類型 |
| b | 布爾類型,只要實(shí)參為非false的布爾類型,均格式化為字符串true,否則為字符串false |
| d | 整數(shù)類型(十進(jìn)制) |
| x | 整數(shù)類型(八進(jìn)制) |
| o | 整數(shù)類型(十六進(jìn)制) |
| f | 浮點(diǎn)數(shù)型(十進(jìn)制)。顯示9位有效數(shù)字,且會(huì)進(jìn)行四舍五入。如99.99 |
| a | 浮點(diǎn)數(shù)型(十六進(jìn)制) |
| g | 浮點(diǎn)數(shù)型(比%f,%a長(zhǎng)度短些,顯示6位有效數(shù)字,且會(huì)進(jìn)行四舍五入) |
| e | 指數(shù)類型。如9.38e+5 |
| h | 散列碼 |
| % | 百分比 |
| tx | 日期與時(shí)間類型(x代表不同的日期與時(shí)間轉(zhuǎn)換符) |
| n | 換行符 |
舉例:
public static void main(String[] args) {
System.out.println(String.format("%2$06.2f======%1$d", 2, 11.1111));// 011.11======2
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
三分鐘帶你掌握J(rèn)ava開(kāi)發(fā)圖片驗(yàn)證碼功能方法
這篇文章主要來(lái)為大家詳細(xì)介紹Java實(shí)現(xiàn)開(kāi)發(fā)圖片驗(yàn)證碼的具體方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-02-02
SpringBoot使用hutool操作FTP的詳細(xì)過(guò)程
在使用SpringBoot結(jié)合hutool操作FTP時(shí),遇到防火墻導(dǎo)致上傳文件大小為0kb的問(wèn)題,通過(guò)設(shè)置FTP為被動(dòng)模式解決,本文詳細(xì)解析了FTP的主動(dòng)模式和被動(dòng)模式的工作原理、安全性及適用場(chǎng)景,幫助理解FTP的連接方式和解決網(wǎng)絡(luò)限制問(wèn)題2024-09-09
Java用POI解析excel并獲取所有單元格數(shù)據(jù)的實(shí)例
下面小編就為大家?guī)?lái)一篇Java用POI解析excel并獲取所有單元格數(shù)據(jù)的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
MyBatisPlus自定義SQL的實(shí)現(xiàn)
MyBatisPlus提供了自定義SQL功能,允許開(kāi)發(fā)者在Mapper接口中定義方法,并通過(guò)XML文件或注解編寫(xiě)SQL語(yǔ)句,本文詳解了如何在MP中使用自定義SQL,感興趣的可以了解一下2024-09-09
SpringBoot種如何使用?EasyExcel?實(shí)現(xiàn)自定義表頭導(dǎo)出并實(shí)現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換
本文詳細(xì)介紹了如何使用EasyExcel工具類實(shí)現(xiàn)自定義表頭導(dǎo)出,并實(shí)現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換與添加下拉框操作,通過(guò)示例和代碼,展示了如何處理不同數(shù)據(jù)結(jié)構(gòu)和注解,確保數(shù)據(jù)在導(dǎo)出時(shí)能夠正確顯示和格式化,此外,還介紹了如何解決特定數(shù)據(jù)類型的轉(zhuǎn)換問(wèn)題,并提供了解決方案2024-11-11
Spring Boot統(tǒng)一異常攔截實(shí)踐指南(最新推薦)
本文介紹了Spring Boot中統(tǒng)一異常處理的重要性及實(shí)現(xiàn)方案,包括使用`@ControllerAdvice`和`@ExceptionHandler`注解,實(shí)現(xiàn)全局異常處理和統(tǒng)一響應(yīng)格式,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-02-02

