NumberFormat
【簡介】
java.text.NumberFormat extends java.text.Format extends java.lang.Object
實現的接口:Serializable, Cloneable
直接子類:ChoiceFormat, DecimalFormat
3
3
1
java.text.NumberFormat extends java.text.Format extends java.lang.Object
2
實現的接口:Serializable, Cloneable
3
直接子類:ChoiceFormat, DecimalFormat
NumberFormat 是所有數值格式的抽象基類。此類提供格式化和解析數值的接口。NumberFormat 還提供了一些方法來確定哪些語言環境具有數值格式,以及它們的名稱是什么。
NumberFormat 可用於格式化和解析任何語言環境的數值。使代碼能夠完全獨立於小數點、千位分隔符甚至所用特定小數位數的語言環境約定,並與數值格式是否為偶小數無關。
若要格式化當前 Locale 的數值,可使用其中一個工廠類方法:
myString = NumberFormat.getInstance().format(myNumber);
1
1
1
myString = NumberFormat.getInstance().format(myNumber);
若要格式化不同 Locale 的日期,可在對 getInstance 的調用中指定它。
NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
1
1
1
NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
還可以使用 NumberFormat 來解析數值:
myNumber = nf.parse(myString);
1
1
1
myNumber = nf.parse(myString);
使用 getInstance 或 get
Number
Instance 來獲取常規數值格式。使用 get
Integer
Instance 來獲取整數數值格式。使用 get
Currency
Instance 來獲取貨幣數值格式。使用 get
Percent
Instance 來獲取顯示百分比的格式。使用此格式,小數 0.53 將顯示為 53%。
使用 setMinimumFractionDigits 之類的方法還可以控制數值的顯示。如果想對格式化和解析進行更多的控制(或者給予用戶更多的控制),可以嘗試將從工廠方法獲取的 NumberFormat 強制轉換為 DecimalFormat。這適用於大多數語言環境;只是要記住將其放入一個 try 代碼塊中,以防遇到特殊情況。
【API】
- Object clone() 重寫 Cloneable
- boolean equals(Object obj) 重寫 equals
- int hashCode() 重寫 hashCode
- String format(double number) 格式規范。
- abstract StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) 格式規范。
- String format(long number) 格式規范。
- abstract StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) 格式規范。
- StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos) 格式化一個數並將所得文本添加到給定字符串緩沖區。
- Number parse(String source) 解析給定字符串開頭的文本,生成一個數值。
- abstract Number parse(String source, ParsePosition parsePosition) 如果可能則返回 Long (例如,在 [Long.MIN_VALUE, Long.MAX_VALUE] 范圍內且沒有小數),否則返回 Double。
- Object parseObject(String source, ParsePosition pos) 解析字符串中的文本,以生成一個 Number。
- int getMaximumFractionDigits() 返回數的小數部分所允許的最大位數。
- int getMaximumIntegerDigits() 返回數的整數部分所允許的最大位數。
- int getMinimumFractionDigits() 返回數的小數部分所允許的最小位數。
- int getMinimumIntegerDigits() 返回數的整數部分所允許的最小位數。
- void setMaximumFractionDigits(int newValue) 設置數的小數部分所允許的最大位數。
- void setMaximumIntegerDigits(int newValue) 設置數的整數部分所允許的最大位數。
- void setMinimumFractionDigits(int newValue) 設置數的小數部分所允許的最小位數。
- void setMinimumIntegerDigits(int newValue) 設置數的整數部分所允許的最小位數。
- static Locale[] getAvailableLocales() 返回一個數組,它包含所有此類的 get*Instance 方法可以為其返回本地化實例的語言環境。
- static NumberFormat getCurrencyInstance() 返回當前默認語言環境的【貨幣】格式。
- static NumberFormat getCurrencyInstance(Locale inLocale) 返回指定語言環境的【貨幣】格式。
- static NumberFormat getInstance() 返回當前默認語言環境的通用【數值】格式。
- static NumberFormat getInstance(Locale inLocale) 返回指定語言環境的通用【數值】格式。
- static NumberFormat getIntegerInstance() 返回當前默認語言環境的【整數】格式。
- static NumberFormat getIntegerInstance(Locale inLocale) 返回指定語言環境的【整數】格式。
- static NumberFormat getNumberInstance() 返回當前默認語言環境的【通用數值】格式。
- static NumberFormat getNumberInstance(Locale inLocale) 返回指定語言環境的【通用數值】格式。
- static NumberFormat getPercentInstance() 返回當前默認語言環境的【百分比】格式。
- static NumberFormat getPercentInstance(Locale inLocale) 返回指定語言環境的【百分比】格式。
- Currency getCurrency() 獲取格式化貨幣值時此數值格式使用的貨幣。
- RoundingMode getRoundingMode() 獲取在此 NumberFormat 中使用的 RoundingMode。
- boolean isGroupingUsed() 如果此格式中使用了分組,則返回 true。
- boolean isParseIntegerOnly() 如果此格式只將數作為整數解析,則返回 true。
- void setCurrency(Currency currency) 設置格式化貨幣值時此數值格式使用的貨幣。
- void setRoundingMode(RoundingMode roundingMode) 設置在此 NumberFormat 中使用的 RoundingMode。
- void setGroupingUsed(boolean newValue) 設置此格式中是否使用分組。
- void setParseIntegerOnly(boolean value) 設置數是否應該僅作為整數進行解析。
【測試代碼】
public class Test {
public static void main(String[] args) {
testGetInstance();
System.out.println("----------testSetDigits------------");
testSetDigits();
System.out.println("-----------testRoundingMode-----------");
testRoundingMode();
System.out.println("-----------testParse-----------");
testParse();
}
private static void testGetInstance() {
double d = 23323.3323232323;
System.out.println(NumberFormat.getInstance().format(d));//23,323.332。返回當前缺省語言環境的【缺省數值】格式
System.out.println(NumberFormat.getCurrencyInstance().format(d));//¥23,323.33。返回當前缺省語言環境的【貨幣】格式
System.out.println(NumberFormat.getNumberInstance().format(d));//23,323.332。返回當前缺省語言環境的【通用數值】格式
System.out.println(NumberFormat.getIntegerInstance().format(d));//23,323。返回當前缺省語言環境的【整數】格式
System.out.println(NumberFormat.getPercentInstance().format(d));//2,332,333%。返回當前缺省語言環境的【百分比】格式
}
private static void testSetDigits() {
NumberFormat format = NumberFormat.getInstance();
format.setParseIntegerOnly(true);//設置數是否應該僅作為整數進行解析。此方法只影響解析,與格式化無關
format.setMinimumFractionDigits(2);//設置數值的【小數部分】允許的最小位數。這幾個方法只影響格式化,與解析無關
format.setMaximumFractionDigits(3);//設置數值的【小數部分】允許的最大位數
format.setMinimumIntegerDigits(1);//設置數值的【整數部分】允許的最小位數
format.setMaximumIntegerDigits(5);//設置數值的【整數部分】允許的最大位數
System.out.println(format.format(123.1234));//123.123
System.out.println(format.format(123.1000));//123.10
System.out.println(format.format(123456789.12345));//56,789.123
}
private static void testRoundingMode() {
NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(0);//設置數值的【小數部分】允許的最大位數
System.out.println("默認模式為:" + format.getRoundingMode().name());//HALF_EVEN
System.out.println(format.format(5.6));//6。5以上不管是奇數還是偶數,5都舍入
System.out.println(format.format(5.4));//5。5以下不管是奇數還是偶數,5都舍去
System.out.println(format.format(1.5));//2。當是5時,若前一位是奇數,5就舍入
System.out.println(format.format(2.5));//2。當是5時,若前一位是偶數,5就舍去
format.setRoundingMode(RoundingMode.HALF_UP);//四舍五入。此方法只影響格式化,與解析無關
System.out.println("當前模式為:" + format.getRoundingMode().name());//HALF_UP
System.out.println(format.format(5.6));//6
System.out.println(format.format(5.4));//5
System.out.println(format.format(1.5));//2
System.out.println(format.format(2.5));//3
}
private static void testParse() {
NumberFormat format = NumberFormat.getInstance();
format.setParseIntegerOnly(false);//設置數是否應該僅作為整數進行解析。此方法只影響解析,與格式化無關
format.setMinimumFractionDigits(2);//這幾個方法只影響格式化,與解析無關
ParsePosition position = new ParsePosition(2);
try {
Number number = format.parse("00123.10050100結尾處不受影響");//如果無法解析字符串的【開頭】則拋出ParseException
Number number2 = format.parse("開頭00123.10050100結尾處不受影響", position);//解析字符串時,從position.getIndex()處開始解析
System.out.println(number.floatValue());//123.1005
System.out.println(number.intValue());//123
System.out.println(number2.doubleValue());//123.100501
System.out.println(position.getIndex());//16。解析前,代表解析開始處字符的索引;解析后,代表被解析的最后一個字符后的字符的索引
System.out.println(position.getErrorIndex());//-1。獲取出錯時的索引,如果沒有設置錯誤索引,則為 -1
position.setIndex(1);//如果重用ParsePosition,須重新設置一下Index才可以
System.out.println(format.parse("12.345678只解析", position).floatValue());//2.345678
} catch (ParseException e) {
e.printStackTrace();
}
}
}
73
73
1
public class Test {
2
public static void main(String[] args) {
3
testGetInstance();
4
System.out.println("----------testSetDigits------------");
5
testSetDigits();
6
System.out.println("-----------testRoundingMode-----------");
7
testRoundingMode();
8
System.out.println("-----------testParse-----------");
9
testParse();
10
}
11
12
private static void testGetInstance() {
13
double d = 23323.3323232323;
14
System.out.println(NumberFormat.getInstance().format(d));//23,323.332。返回當前缺省語言環境的【缺省數值】格式
15
System.out.println(NumberFormat.getCurrencyInstance().format(d));//¥23,323.33。返回當前缺省語言環境的【貨幣】格式
16
System.out.println(NumberFormat.getNumberInstance().format(d));//23,323.332。返回當前缺省語言環境的【通用數值】格式
17
System.out.println(NumberFormat.getIntegerInstance().format(d));//23,323。返回當前缺省語言環境的【整數】格式
18
System.out.println(NumberFormat.getPercentInstance().format(d));//2,332,333%。返回當前缺省語言環境的【百分比】格式
19
}
20
21
private static void testSetDigits() {
22
NumberFormat format = NumberFormat.getInstance();
23
format.setParseIntegerOnly(true);//設置數是否應該僅作為整數進行解析。此方法只影響解析,與格式化無關
24
format.setMinimumFractionDigits(2);//設置數值的【小數部分】允許的最小位數。這幾個方法只影響格式化,與解析無關
25
format.setMaximumFractionDigits(3);//設置數值的【小數部分】允許的最大位數
26
format.setMinimumIntegerDigits(1);//設置數值的【整數部分】允許的最小位數
27
format.setMaximumIntegerDigits(5);//設置數值的【整數部分】允許的最大位數
28
29
System.out.println(format.format(123.1234));//123.123
30
System.out.println(format.format(123.1000));//123.10
31
System.out.println(format.format(123456789.12345));//56,789.123
32
}
33
34
private static void testRoundingMode() {
35
NumberFormat format = NumberFormat.getInstance();
36
format.setMaximumFractionDigits(0);//設置數值的【小數部分】允許的最大位數
37
System.out.println("默認模式為:" + format.getRoundingMode().name());//HALF_EVEN
38
System.out.println(format.format(5.6));//6。5以上不管是奇數還是偶數,5都舍入
39
System.out.println(format.format(5.4));//5。5以下不管是奇數還是偶數,5都舍去
40
System.out.println(format.format(1.5));//2。當是5時,若前一位是奇數,5就舍入
41
System.out.println(format.format(2.5));//2。當是5時,若前一位是偶數,5就舍去
42
43
format.setRoundingMode(RoundingMode.HALF_UP);//四舍五入。此方法只影響格式化,與解析無關
44
System.out.println("當前模式為:" + format.getRoundingMode().name());//HALF_UP
45
System.out.println(format.format(5.6));//6
46
System.out.println(format.format(5.4));//5
47
System.out.println(format.format(1.5));//2
48
System.out.println(format.format(2.5));//3
49
}
50
51
private static void testParse() {
52
NumberFormat format = NumberFormat.getInstance();
53
format.setParseIntegerOnly(false);//設置數是否應該僅作為整數進行解析。此方法只影響解析,與格式化無關
54
format.setMinimumFractionDigits(2);//這幾個方法只影響格式化,與解析無關
55
ParsePosition position = new ParsePosition(2);
56
57
try {
58
Number number = format.parse("00123.10050100結尾處不受影響");//如果無法解析字符串的【開頭】則拋出ParseException
59
Number number2 = format.parse("開頭00123.10050100結尾處不受影響", position);//解析字符串時,從position.getIndex()處開始解析
60
61
System.out.println(number.floatValue());//123.1005
62
System.out.println(number.intValue());//123
63
System.out.println(number2.doubleValue());//123.100501
64
System.out.println(position.getIndex());//16。解析前,代表解析開始處字符的索引;解析后,代表被解析的最后一個字符后的字符的索引
65
System.out.println(position.getErrorIndex());//-1。獲取出錯時的索引,如果沒有設置錯誤索引,則為 -1
66
67
position.setIndex(1);//如果重用ParsePosition,須重新設置一下Index才可以
68
System.out.println(format.parse("12.345678只解析", position).floatValue());//2.345678
69
} catch (ParseException e) {
70
e.printStackTrace();
71
}
72
}
73
}
DecimalFormat 重要
java.text.DecimalFormat extends java.text.NumberFormat extends java.text.Format extends java.lang.Object
實現的接口:Serializable, Cloneable
直接子類:ChoiceFormat, DecimalFormat
3
3
1
java.text.DecimalFormat extends java.text.NumberFormat extends java.text.Format extends java.lang.Object
2
實現的接口:Serializable, Cloneable
3
直接子類:ChoiceFormat, DecimalFormat
DecimalFormat 是 NumberFormat 的一個具體子類,用於格式化十進制數字。
該類設計有各種功能,使其能夠解析和格式化任意語言環境中的數,包括對西方語言、阿拉伯語和印度語數字的支持。它還支持不同類型的數,包括整數 (123)、符點數 (123.4)、科學記數法表示的數 (1.23E4)、百分數 (12%) 和金額 ($123)。所有這些內容都可以本地化。
要獲取具體語言環境的 NumberFormat,可調用 NumberFormat 的某個
get**Instance()
工廠方法 ,通常其就是
DecimalFormat 類型。
System.out.println(NumberFormat.getInstance() instanceof DecimalFormat);//true
1
1
1
System.out.println(NumberFormat.getInstance() instanceof DecimalFormat);//true
通常不直接調用 DecimalFormat 的構造方法,因為 NumberFormat 的工廠方法可能返回不同於 DecimalFormat 的子類。
如果需要自定義格式對象,可執行:
NumberFormat f = NumberFormat.getInstance(loc);
if (f instanceof DecimalFormat) ((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true);
2
2
1
NumberFormat f = NumberFormat.getInstance(loc);
2
if (f instanceof DecimalFormat) ((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true);
注意:DecimalFormat 通常不是同步的。建議為每個線程創建獨立的格式實例。如果多個線程同時訪問某個格式,則必須保持外部同步。
DecimalFormat 包含一個模式 和一組符號。可直接使用 applyPattern() 或間接使用 API 方法來設置模式。符號存儲在 DecimalFormatSymbols 對象中。使用 NumberFormat 工廠方法時,可從已本地化的 ResourceBundle 中讀取模式和符號。
【特殊模式字符】
模式中的很多字符都是按字面解釋的;在解析期間對其進行匹配,在格式化期間則不經改變地輸出。另一方面,特殊字符代表了其他字符、字符串或字符類。如果要將其作為字面量出現在前綴或后綴中,那么除非另行說明,否則必須對其加引號。
下列字符用在非本地化的模式中。已本地化的模式使用從此格式器的 DecimalFormatSymbols 對象中獲得的相應字符,這些字符已失去其特殊狀態。兩種例外是貨幣符號和引號,不將其本地化。
符號 位置 本地化 含義 0
數字 是 阿拉伯數字 #
數字 是 阿拉伯數字,如果不存在則顯示為 0 .
數字 是 小數分隔符或貨幣小數分隔符 -
數字 是 減號 ,
數字 是 分組分隔符 E
數字 是 分隔科學計數法中的尾數和指數。在前綴或后綴中無需加引號。 ;
子模式邊界 是 分隔正數和負數子模式 %
前綴或后綴 是 乘以 100 並顯示為百分數 \u2030
前綴或后綴 是 乘以 1000 並顯示為千分數 ¤
(\u00A4
)前綴或后綴 否 貨幣記號,由貨幣符號替換。如果兩個同時出現,則用國際貨幣符號替換。如果出現在某個模式中,則使用貨幣小數分隔符,而不使用小數分隔符。 '
前綴或后綴 否 用於在前綴或或后綴中為特殊字符加引號,例如 "'#'#"
將 123 格式化為"#123"
。要創建單引號本身,請連續使用兩個單引號:"# o''clock"
。
符號含義:
- 0 一個數字(如果位數不足則以 0 填充)
- # 一個數字,不包括 0(只要有可能就把數字拉上這個位置)
- . 小數的分隔符的占位符
- , 分組分隔符的占位符
- ; 分隔格式。
- - 缺省負數前綴。
- % 乘以 100 和作為百分比顯示
- ? 乘以 1000 和作為千進制貨幣符顯示;用貨幣符號代替;如果雙寫,用國際貨幣符號代替。如果出現在一個模式中,用貨幣十進制分隔符代 替十進制分隔符。
- X 前綴或后綴中使用的任何其它字符,用來引用前綴或后綴中的特殊字符。
【API】
- 構造方法 DecimalFormat() 使用默認模式和默認語言環境的符號創建一個 DecimalFormat
- 構造方法 DecimalFormat(String pattern) 使用給定的模式和默認語言環境的符號創建一個 DecimalFormat
- 構造方法 DecimalFormat(String pattern, DecimalFormatSymbols symbols) 使用給定的模式和符號創建一個 DecimalFormat
- void applyLocalizedPattern(String pattern) 將給定的模式應用於此 Format 對象。
- void applyPattern(String pattern) 將給定的模式應用於此 Format 對象。
- StringBuffer format(double number, StringBuffer result, FieldPosition fieldPosition) 格式化一個 double 值,以生成一個字符串。
- StringBuffer format(long number, StringBuffer result, FieldPosition fieldPosition) 格式化一個 long 值,以生成一個字符串。
- StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos) 格式化一個數,並將所得文本追加到給定的字符串緩沖區。
- AttributedCharacterIterator formatToCharacterIterator(Object obj) 格式化一個 Object,以生成一個 AttributedCharacterIterator。
- DecimalFormatSymbols getDecimalFormatSymbols() 返回小數格式符號的一個副本,通常程序員或用戶不改變此副本。
- void setDecimalFormatSymbols(DecimalFormatSymbols newSymbols) 設置小數格式符號,通常程序員或用戶不改變此符號。
- Currency getCurrency() 獲取格式化貨幣值時,此十進制格式使用的貨幣。
- void setCurrency(Currency currency) 設置格式化貨幣值時,此數字格式使用的貨幣。
- int getMultiplier() 獲取百分數、千分數和類似格式中使用的乘數。對於百分數格式,將該乘數設置為 100 並將后綴設置為 '%'。對於千分數格式,將該乘數設置為 1000 並將后綴設置為 '\u2030'。
- void setMultiplier(int newValue) 設置百分數、千分數和類似格式中使用的乘數。
- int getGroupingSize() 返回分組大小。
- void setGroupingSize(int newValue) 設置分組大小。
- RoundingMode getRoundingMode() 獲取在此 DecimalFormat 中使用的 RoundingMode。
- void setRoundingMode(RoundingMode roundingMode) 設置在此 DecimalFormat 中使用的 RoundingMode。
- boolean isDecimalSeparatorAlwaysShown() 允許獲取整數中小數分隔符的行為。
- void setDecimalSeparatorAlwaysShown(boolean newValue) 允許設置整數中小數分隔符的行為。
- boolean isParseBigDecimal() 返回 parse(java.lang.String, java.text.ParsePosition) 方法是否返回 BigDecimal。
- void setParseBigDecimal(boolean newValue) 設置 parse(java.lang.String, java.text.ParsePosition) 方法是否返回 BigDecimal。
- int getMaximumFractionDigits() 獲取某個數的小數部分中所允許的最大數字位數。
- int getMaximumIntegerDigits() 獲取某個數的整數部分中所允許的最大數字位數。
- int getMinimumFractionDigits() 獲取某個數的小數部分中所允許的最小數字位數。
- int getMinimumIntegerDigits() 獲取某個數的整數部分中所允許的最小數字位數。
- void setMaximumFractionDigits(int newValue) 設置某個數的小數部分中所允許的最大數字位數。
- void setMaximumIntegerDigits(int newValue) 設置某個數字的整數部分中所允許的最大數字位數。
- void setMinimumFractionDigits(int newValue) 設置某個數的小數部分中所允許的最小數字位數。
- void setMinimumIntegerDigits(int newValue) 設置某個數字的整數部分中所允許的最小數字位數。
- String getNegativePrefix() 獲取負數前綴。
- String getNegativeSuffix() 獲取負數后綴。
- String getPositivePrefix() 獲取正數前綴。
- String getPositiveSuffix() 獲取正數后綴。
- void setNegativePrefix(String newValue) 設置負數前綴。
- void setNegativeSuffix(String newValue) 設置負數后綴。
- void setPositivePrefix(String newValue) 設置正數前綴。
- void setPositiveSuffix(String newValue) 設置正數后綴。
- Number parse(String text, ParsePosition pos) 解析字符串中的文本,以生成一個 Number。
- String toLocalizedPattern() 合成一個表示此 Format 對象當前狀態的、已本地化的模式字符串。
- String toPattern() 合成一個表示此 Format 對象當前狀態的模式字符串。
【測試代碼】
public class Test {
public static void main(String[] args) {
testPatterns();
testPatterns2();
testDecimalFormat();
}
public static void testPatterns() {
//DecimalFormat中,占位符 0 表示如果位數不足則以 0 填充,占位符 # 表示只要有可能就把數字拉上這個位置
double pi = 3.1415927;
System.out.println("-------------------3.1415927------------------");
System.out.println(new DecimalFormat("0").format(pi)); //3
System.out.println(new DecimalFormat("0.00").format(pi));//3.14
System.out.println(new DecimalFormat("00.000").format(pi));//03.142
System.out.println(new DecimalFormat("0.00%").format(pi));//以百分比方式計數,314.16%
System.out.println(new DecimalFormat("#").format(pi)); //3
System.out.println(new DecimalFormat("#.##").format(pi)); //3.14
System.out.println(new DecimalFormat("##.###").format(pi)); //3.142
System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%
float f = 12.34f;
System.out.println("---------------------12.34----------------");
System.out.println(new DecimalFormat("0.0").format(f));//12.3
System.out.println(new DecimalFormat("#.#").format(f));//12.3
System.out.println(new DecimalFormat("000.000").format(f));//012.340
System.out.println(new DecimalFormat("###.###").format(f));//12.34
long l = 123456789L;
System.out.println("-------------------123456789------------------");
System.out.println(new DecimalFormat("#.##############E0").format(l));//1.23456789E8
System.out.println(new DecimalFormat("00.##E00").format(l));//12.35E07
System.out.println(new DecimalFormat(",###").format(l)); //每三位以逗號進行分隔。123,456,789
System.out.println(new DecimalFormat("值為,###米/秒").format(l));//【值為123,456,789米/秒】
}
private static void testPatterns2() {
double pi = 3.1415927;
long l = 1234567890123456789L;
int i = 10086;
float f = 0.01f;
System.out.println("--------------------#,##0.00-----------------");
String pattern = "#,##0.00";//強制保留兩位小數,整數部分每三位以逗號分隔,整數部分至少一位
System.out.println(new DecimalFormat(pattern).format(pi));//3.14
System.out.println(new DecimalFormat(pattern).format(l));//1,234,567,890,123,456,789.00
System.out.println(new DecimalFormat(pattern).format(i));//10,086.00
System.out.println(new DecimalFormat(pattern).format(f));//0.01
System.out.println("--------------------NumberFormat-----------------");
NumberFormat format = NumberFormat.getNumberInstance();
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);//設置這兩個以后,效果和上面一樣,否則和【#,##0.###】一樣
System.out.println(format.format(pi));//3.14
System.out.println(format.format(l));//1,234,567,890,123,456,789.00
System.out.println(format.format(i));//10,086.00
System.out.println(format.format(f));//0.01
}
private static void testDecimalFormat() {
NumberFormat format = NumberFormat.getNumberInstance();
if (format instanceof DecimalFormat) {
DecimalFormat dFormat = (DecimalFormat) format;
System.out.println("--------------------DecimalFormat-----------------");
System.out.println(dFormat.getGroupingSize());//【3】分組大小
System.out.println(dFormat.getRoundingMode());//【HALF_EVEN】
System.out.println(dFormat.toPattern());//【#,##0.###】合成一個表示此 Format 對象當前狀態的模式字符串
System.out.println(dFormat.toLocalizedPattern());//【#,##0.###】合成一個表示此 Format 對象當前狀態的、已本地化的模式字符串
System.out.println("------------------位數-------------------");
System.out.println(dFormat.getMaximumFractionDigits());//【3】
System.out.println(dFormat.getMinimumFractionDigits());//【0】
System.out.println(dFormat.getMaximumIntegerDigits());//【2147483647】也就是int類型的最大值
System.out.println(dFormat.getMinimumFractionDigits());//【0】
System.out.println("---------------------雜項----------------");
System.out.println(dFormat.getCurrency());//【CNY】使用的貨幣符號,代碼CNY(China Yuan)是ISO分配給中國的幣種符號
System.out.println(dFormat.getMultiplier());//【1】獲取百分數、千分數等格式中使用的乘數(對於百分數格式,為100)
System.out.println(dFormat.isDecimalSeparatorAlwaysShown());//【false】允許獲取整數中小數分隔符的行為
System.out.println(dFormat.isParseBigDecimal());//【false】parse(String,ParsePosition) 方法是否返回 BigDecimal
}
}
}
82
82
1
public class Test {
2
public static void main(String[] args) {
3
testPatterns();
4
testPatterns2();
5
testDecimalFormat();
6
}
7
8
public static void testPatterns() {
9
//DecimalFormat中,占位符 0 表示如果位數不足則以 0 填充,占位符 # 表示只要有可能就把數字拉上這個位置
10
double pi = 3.1415927;
11
System.out.println("-------------------3.1415927------------------");
12
System.out.println(new DecimalFormat("0").format(pi)); //3
13
System.out.println(new DecimalFormat("0.00").format(pi));//3.14
14
System.out.println(new DecimalFormat("00.000").format(pi));//03.142
15
System.out.println(new DecimalFormat("0.00%").format(pi));//以百分比方式計數,314.16%
16
System.out.println(new DecimalFormat("#").format(pi)); //3
17
System.out.println(new DecimalFormat("#.##").format(pi)); //3.14
18
System.out.println(new DecimalFormat("##.###").format(pi)); //3.142
19
System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%
20
21
float f = 12.34f;
22
System.out.println("---------------------12.34----------------");
23
System.out.println(new DecimalFormat("0.0").format(f));//12.3
24
System.out.println(new DecimalFormat("#.#").format(f));//12.3
25
System.out.println(new DecimalFormat("000.000").format(f));//012.340
26
System.out.println(new DecimalFormat("###.###").format(f));//12.34
27
28
long l = 123456789L;
29
System.out.println("-------------------123456789------------------");
30
System.out.println(new DecimalFormat("#.##############E0").format(l));//1.23456789E8
31
System.out.println(new DecimalFormat("00.##E00").format(l));//12.35E07
32
System.out.println(new DecimalFormat(",###").format(l)); //每三位以逗號進行分隔。123,456,789
33
System.out.println(new DecimalFormat("值為,###米/秒").format(l));//【值為123,456,789米/秒】
34
}
35
36
private static void testPatterns2() {
37
double pi = 3.1415927;
38
long l = 1234567890123456789L;
39
int i = 10086;
40
float f = 0.01f;
41
42
System.out.println("--------------------#,##0.00-----------------");
43
String pattern = "#,##0.00";//強制保留兩位小數,整數部分每三位以逗號分隔,整數部分至少一位
44
System.out.println(new DecimalFormat(pattern).format(pi));//3.14
45
System.out.println(new DecimalFormat(pattern).format(l));//1,234,567,890,123,456,789.00
46
System.out.println(new DecimalFormat(pattern).format(i));//10,086.00
47
System.out.println(new DecimalFormat(pattern).format(f));//0.01
48
49
System.out.println("--------------------NumberFormat-----------------");
50
NumberFormat format = NumberFormat.getNumberInstance();
51
format.setMinimumFractionDigits(2);
52
format.setMaximumFractionDigits(2);//設置這兩個以后,效果和上面一樣,否則和【#,##0.###】一樣
53
System.out.println(format.format(pi));//3.14
54
System.out.println(format.format(l));//1,234,567,890,123,456,789.00
55
System.out.println(format.format(i));//10,086.00
56
System.out.println(format.format(f));//0.01
57
}
58
59
private static void testDecimalFormat() {
60
NumberFormat format = NumberFormat.getNumberInstance();
61
if (format instanceof DecimalFormat) {
62
DecimalFormat dFormat = (DecimalFormat) format;
63
System.out.println("--------------------DecimalFormat-----------------");
64
System.out.println(dFormat.getGroupingSize());//【3】分組大小
65
System.out.println(dFormat.getRoundingMode());//【HALF_EVEN】
66
System.out.println(dFormat.toPattern());//【#,##0.###】合成一個表示此 Format 對象當前狀態的模式字符串
67
System.out.println(dFormat.toLocalizedPattern());//【#,##0.###】合成一個表示此 Format 對象當前狀態的、已本地化的模式字符串
68
69
System.out.println("------------------位數-------------------");
70
System.out.println(dFormat.getMaximumFractionDigits());//【3】
71
System.out.println(dFormat.getMinimumFractionDigits());//【0】
72
System.out.println(dFormat.getMaximumIntegerDigits());//【2147483647】也就是int類型的最大值
73
System.out.println(dFormat.getMinimumFractionDigits());//【0】
74
75
System.out.println("---------------------雜項----------------");
76
System.out.println(dFormat.getCurrency());//【CNY】使用的貨幣符號,代碼CNY(China Yuan)是ISO分配給中國的幣種符號
77
System.out.println(dFormat.getMultiplier());//【1】獲取百分數、千分數等格式中使用的乘數(對於百分數格式,為100)
78
System.out.println(dFormat.isDecimalSeparatorAlwaysShown());//【false】允許獲取整數中小數分隔符的行為
79
System.out.println(dFormat.isParseBigDecimal());//【false】parse(String,ParsePosition) 方法是否返回 BigDecimal
80
}
81
}
82
}
ParsePosition 了解即可
ParsePosition 是 Format 及其子類所使用的簡單類,用來
在解析過程中跟蹤當前位置
。各種 Format 類中的 parseObject 方法要求將 ParsePosition 對象作為一個變量。
解析具有不同格式的字符串時,可以使用同一個 ParsePosition,因為索引參數記錄的是當前位置。
API
- 構造方法 ParsePosition(int index) 創建一個具有給定初始索引的新 ParsePosition。
- int getErrorIndex() 獲取出錯時的索引,如果沒有設置錯誤索引,則為 -1。
- void setErrorIndex(int ei) 設置解析出錯時的索引。格式器應該在從它們的 parseObject 方法返回錯誤代碼之前進行此設置。如果沒有設置,則默認值為 -1。
- int getIndex() 獲取當前的解析位置。對於解析方法的輸入,這是解析開始處字符的索引;對於輸出,這是被解析的最后一個字符后的字符索引。
- void setIndex(int index) 設置當前解析位置。
FieldPosition【沒用過】
FieldPosition 是 Format 及其子類用於在格式輸出中
標識字段
的簡單類。字段可以通過兩種方式標識:
- 通過一個其名稱通常以 _FIELD 結尾的整型常量。這些常量在 Format 的不同子類中定義。
- 通過一個 Format.Field 常量,有關例子,請參閱 DateFormat 中的 ERA_FIELD 及其同類。
FieldPosition 保持對格式輸出中字段位置的兩個索引進行跟蹤:字段的第一個字符的索引和字段的最后一個字符的索引。
不同的 Format 類中的 format 方法需要一個 FieldPosition 對象作為參數。使用此 format 方法執行部分格式化或者以獲取格式化輸出的信息(比如字段位置)。
如果對格式化字符串中所有屬性的位置感興趣,請使用 Format 的方法 formatToCharacterIterator。
API
- 構造方法 FieldPosition(Format.Field attribute) 為給定的字段常量創建一個 FieldPosition 對象。
- 構造方法 FieldPosition(Format.Field attribute, int fieldID) 為給定的字段創建一個 FieldPosition 對象。
- 構造方法 FieldPosition(int field) 為給定字段創建一個 FieldPosition 對象。
- int getBeginIndex() 獲取請求字段中第一個字符的索引。
- int getEndIndex() 獲取緊跟請求字段中最后一個字符的字符索引。
- int getField() 獲取字段的標識符。
- Format.Field getFieldAttribute() 以來自 Field 子類之一的屬性常量返回該字段的標識符。
- void setBeginIndex(int bi) 設置起始索引。
- void setEndIndex(int ei) Sets the end index.由 Format 的子類使用。
RoundingMode 重要
為可能丟棄精度的數值操作指定一種舍入行為。每種舍入模式都指示如何計算返回舍入結果位數的最低有效位。如果返回的位數比表示精確數值結果所需的位數少,則舍棄的位數稱為舍棄部分,而不管這些位數對數值的作用如何。換句話說,假設是一個數值,舍棄部分的絕對值可能大於 1。
注意:
NumberFormat默認使用的是HALF_EVEN模式,不符合"四舍五入"的模式,我們最好改為HALF_UP模式。
不同舍入模式下的舍入操作
- UP 向遠離零的方向舍入。舍棄非零部分,並將非零舍棄部分相鄰的一位數字加一。
- DOWN 向接近零的方向舍入。舍棄非零部分,同時不會非零舍棄部分相鄰的一位數字加一,采取截取行為。
- CEILING 向正無窮的方向舍入。如果為正數,舍入結果同ROUND_UP一致;如果為負數,舍入結果同ROUND_DOWN一致。注意:此模式不會減少數值大小。
- FLOOR 向負無窮的方向舍入。如果為正數,舍入結果同ROUND_DOWN一致;如果為負數,舍入結果同ROUND_UP一致。注意:此模式不會增加數值大小。
- HALF_UP 向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則為向上舍入的舍入模式。如果舍棄部分>= 0.5,則舍入行為與ROUND_UP相同;否則舍入行為與ROUND_DOWN相同。這種模式也就是我們常說的我們的“四舍五入”。
- HALF_DOWN 向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則為向下舍入的舍入模式。如果舍棄部分> 0.5,則舍入行為與ROUND_UP相同;否則舍入行為與ROUND_DOWN相同。這種模式也就是我們常說的我們的“五舍六入”。
- HALF_EVEN 向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則相鄰的偶數舍入。如果舍棄部分左邊的數字奇數,則舍入行為與 ROUND_HALF_UP 相同;如果為偶數,則舍入行為與 ROUND_HALF_DOWN 相同。注意:在重復進行一系列計算時,此舍入模式可以將累加錯誤減到最小。此舍入模式也稱為“銀行家舍入法”,主要在美國使用。四舍六入,五分兩種情況,如果前一位為奇數,則入位,否則舍去。
- UNNECESSARY 斷言請求的操作具有精確的結果,因此不需要舍入。如果對獲得精確結果的操作指定此舍入模式,則拋出ArithmeticException。
將輸入數字舍入為一位數時,
不同舍入模式格式化后
的結果
輸入 | UP | DOWN | CEILING | FLOOR | HALF_UP | HALF_DOWN | HALF_EVEN | UNNECESSARY |
---|---|---|---|---|---|---|---|---|
5.5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 | Exception |
2.5 | 3 | 2 | 3 | 2 | 3 | 2 | 2 | Exception |
1.6 | 2 | 1 | 2 | 1 | 2 | 2 | 2 | Exception |
1.1 | 2 | 1 | 2 | 1 | 1 | 1 | 1 | Exception |
1.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
-1.0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
-1.1 | -2 | -1 | -1 | -2 | -1 | -1 | -1 | Exception |
-1.6 | -2 | -1 | -1 | -2 | -2 | -2 | -2 | Exception |
-2.5 | -3 | -2 | -2 | -3 | -3 | -2 | -2 | Exception |
-5.5 | -6 | -5 | -5 | -6 | -6 | -5 | -6 | Exception |
DecimalFormatSymbols 了解即可
此類表示了 DecimalFormat 格式化數字所需的符號集(如小數點、組分隔符等等)。DecimalFormat 根據其語言環境數據為其自身創建一個 DecimalFormatSymbols 實例。如果需要更改這些符號,可從 DecimalFormat 獲得 DecimalFormatSymbols 對象並修改它。
【API】
構造方法
- DecimalFormatSymbols() 為默認的語言環境創建一個 DecimalFormatSymbols 對象。
- DecimalFormatSymbols(Locale locale) 為給定的語言環境創建一個 DecimalFormatSymbols 對象。
靜態方法
- static Locale[] getAvailableLocales() 返回一個數組,它包括所有此類的 getInstance 方法可為之返回本地化實例的語言環境。
- static DecimalFormatSymbols getInstance() 獲取默認語言環境的 DecimalFormatSymbols 實例。
- static DecimalFormatSymbols getInstance(Locale locale) 獲取指定語言環境的 DecimalFormatSymbols 實例。
get方法
- Currency getCurrency() 獲得這些 DecimalFormatSymbols 的貨幣。
- String getCurrencySymbol() 返回這些 DecimalFormatSymbols 貨幣在其語言環境中的貨幣符號。
- char getDecimalSeparator() 獲得用於十進制符號的字符。
- char getDigit() 獲得用於某種模式中數字的字符。
- String getExponentSeparator() 返回用於分隔尾數和指數的字符串。
- char getGroupingSeparator() 獲得用於千位分隔符的字符。
- String getInfinity() 獲得用於表示無窮大的字符串。
- String getInternationalCurrencySymbol() 返回這些 DecimalFormatSymbols 貨幣的 ISO 4217 貨幣代碼。
- char getMinusSign() 獲得用於表示減號的字符。
- char getMonetaryDecimalSeparator() 返回貨幣小數點分隔符。
- String getNaN() 獲得用於表示“非數字”的字符串。
- char getPatternSeparator() 獲得用於在模式中分隔正數和負數子模式的字符。
- char getPercent() 獲得用於百分數符號的字符。
- char getPerMill() 獲得用於千分數符號的字符。
- char getZeroDigit() 獲得用於零的字符。
set方法
- void setCurrency(Currency currency) 設置這些 DecimalFormatSymbols 的貨幣。
- void setCurrencySymbol(String currency) 設置這些 DecimalFormatSymbols 貨幣在其語言環境中的貨幣符號。
- void setDecimalSeparator(char decimalSeparator) 設置用於十進制符號的字符。
- void setDigit(char digit) 設置用於某種模式中數字的字符。
- void setExponentSeparator(String exp) 設置用於分隔尾數和指數的字符串。
- void setGroupingSeparator(char groupingSeparator) 設置用於千位分隔符的字符。
- void setInfinity(String infinity) 設置用於表示無窮大的字符串。
- void setInternationalCurrencySymbol(String currencyCode) 設置這些 DecimalFormatSymbols 貨幣的 ISO 4217 貨幣代碼。
- void setMinusSign(char minusSign) 設置用於表示減號的字符。
- void setMonetaryDecimalSeparator(char sep) 設置貨幣小數點分隔符。
- void setNaN(String NaN) 設置用於表示“非數字”的字符串。
- void setPatternSeparator(char patternSeparator) 設置用於在模式中分隔正數和負數子模式的字符。
- void setPercent(char percent) 設置用於百分數符號的字符。
- void setPerMill(char perMill) 設置用於千分數符號的字符。
- void setZeroDigit(char zeroDigit) 設置用於零的字符。
【測試代碼】
public class Test {
public static void main(String[] args) {
DecimalFormat format = (DecimalFormat) NumberFormat.getNumberInstance();
DecimalFormatSymbols symbols = format.getDecimalFormatSymbols();
System.out.println("---------------------DecimalFormatSymbols----------------");
System.out.println(symbols.getDecimalSeparator());//【.】用於十進制符號的字符
System.out.println(symbols.getDigit());//【#】用於某種模式中數字的字符
System.out.println(symbols.getExponentSeparator());//【E】用於分隔尾數和指數的字符串
System.out.println(symbols.getGroupingSeparator());//【,】用於千位分隔符的字符
System.out.println(symbols.getMinusSign());//【-】用於表示減號的字符
System.out.println(symbols.getMonetaryDecimalSeparator());//【.】貨幣小數點分隔符
System.out.println(symbols.getPercent());//【%】用於百分數符號的字符
System.out.println(symbols.getPerMill());//【‰】用於千分數符號的字符
System.out.println(symbols.getZeroDigit());//【0】用於零的字符
System.out.println("---------------------2----------------");
System.out.println(symbols.getCurrency());//【CNY】貨幣
System.out.println(symbols.getInternationalCurrencySymbol());//【CNY】貨幣的 ISO 4217 貨幣代碼
System.out.println(symbols.getCurrencySymbol());//【¥】貨幣在其語言環境中的貨幣符號
System.out.println(symbols.getInfinity());//【∞】獲得用於表示無窮大的字符串
System.out.println(symbols.getNaN());//【�】獲得用於表示“非數字”的字符串
System.out.println(symbols.getPatternSeparator());//【;】用於在模式中分隔正數和負數子模式的字符
System.out.println(Arrays.toString(DecimalFormatSymbols.getAvailableLocales()));//可使用的語言環境
}
}
x
26
1
public class Test {
2
public static void main(String[] args) {
3
DecimalFormat format = (DecimalFormat) NumberFormat.getNumberInstance();
4
DecimalFormatSymbols symbols = format.getDecimalFormatSymbols();
5
6
System.out.println("---------------------DecimalFormatSymbols----------------");
7
System.out.println(symbols.getDecimalSeparator());//【.】用於十進制符號的字符
8
System.out.println(symbols.getDigit());//【#】用於某種模式中數字的字符
9
System.out.println(symbols.getExponentSeparator());//【E】用於分隔尾數和指數的字符串
10
System.out.println(symbols.getGroupingSeparator());//【,】用於千位分隔符的字符
11
System.out.println(symbols.getMinusSign());//【-】用於表示減號的字符
12
System.out.println(symbols.getMonetaryDecimalSeparator());//【.】貨幣小數點分隔符
13
System.out.println(symbols.getPercent());//【%】用於百分數符號的字符
14
System.out.println(symbols.getPerMill());//【‰】用於千分數符號的字符
15
System.out.println(symbols.getZeroDigit());//【0】用於零的字符
16
17
System.out.println("---------------------2----------------");
18
System.out.println(symbols.getCurrency());//【CNY】貨幣
19
System.out.println(symbols.getInternationalCurrencySymbol());//【CNY】貨幣的 ISO 4217 貨幣代碼
20
System.out.println(symbols.getCurrencySymbol());//【¥】貨幣在其語言環境中的貨幣符號
21
System.out.println(symbols.getInfinity());//【∞】獲得用於表示無窮大的字符串
22
System.out.println(symbols.getNaN());//【�】獲得用於表示“非數字”的字符串
23
System.out.println(symbols.getPatternSeparator());//【;】用於在模式中分隔正數和負數子模式的字符
24
System.out.println(Arrays.toString(DecimalFormatSymbols.getAvailableLocales()));//可使用的語言環境
25
}
26
}
可使用的語言環境
[, ar_AE, ar_JO, ar_SY, hr_HR, fr_BE, es_PA, mt_MT, es_VE, bg, zh_TW, it, ko, uk, lv, da_DK, es_PR, vi_VN, en_US, sr_ME, sv_SE, es_BO, en_SG, ar_BH, pt, ar_SA, sk, ar_YE, hi_IN, ga, en_MT, fi_FI, et, sv, cs, sr_BA_#Latn, el, uk_UA, hu, fr_CH, in, es_AR, ar_EG, ja_JP_JP_#u-ca-japanese, es_SV, pt_BR, be, is_IS, cs_CZ, es, pl_PL, tr, ca_ES, sr_CS, ms_MY, hr, lt, es_ES, es_CO, bg_BG, sq, fr, ja, sr_BA, is, es_PY, de, es_EC, es_US, ar_SD, en, ro_RO, en_PH, ca, ar_TN, sr_ME_#Latn, es_GT, sl, ko_KR, el_CY, es_MX, ru_RU, es_HN, zh_HK, no_NO_NY, hu_HU, th_TH, ar_IQ, es_CL, fi, ar_MA, ga_IE, mk, tr_TR, et_EE, ar_QA, sr__#Latn, pt_PT, fr_LU, ar_OM, th, sq_AL, es_DO, es_CU, ar, ru, en_NZ, sr_RS, de_CH, es_UY, ms, el_GR, iw_IL, en_ZA, th_TH_TH_#u-nu-thai, hi, fr_FR, de_AT, nl, no_NO, en_AU, vi, nl_NL, fr_CA, lv_LV, de_LU, es_CR, ar_KW, sr, ar_LY, mt, it_CH, da, de_DE, ar_DZ, sk_SK, lt_LT, it_IT, en_IE, zh_SG, ro, en_CA, nl_BE, no, pl, zh_CN, ja_JP, de_GR, sr_RS_#Latn, iw, en_IN, ar_LB, es_NI, zh, mk_MK, be_BY, sl_SI, es_PE, in_ID, en_GB]
1
1
[, ar_AE, ar_JO, ar_SY, hr_HR, fr_BE, es_PA, mt_MT, es_VE, bg, zh_TW, it, ko, uk, lv, da_DK, es_PR, vi_VN, en_US, sr_ME, sv_SE, es_BO, en_SG, ar_BH, pt, ar_SA, sk, ar_YE, hi_IN, ga, en_MT, fi_FI, et, sv, cs, sr_BA_#Latn, el, uk_UA, hu, fr_CH, in, es_AR, ar_EG, ja_JP_JP_#u-ca-japanese, es_SV, pt_BR, be, is_IS, cs_CZ, es, pl_PL, tr, ca_ES, sr_CS, ms_MY, hr, lt, es_ES, es_CO, bg_BG, sq, fr, ja, sr_BA, is, es_PY, de, es_EC, es_US, ar_SD, en, ro_RO, en_PH, ca, ar_TN, sr_ME_#Latn, es_GT, sl, ko_KR, el_CY, es_MX, ru_RU, es_HN, zh_HK, no_NO_NY, hu_HU, th_TH, ar_IQ, es_CL, fi, ar_MA, ga_IE, mk, tr_TR, et_EE, ar_QA, sr__#Latn, pt_PT, fr_LU, ar_OM, th, sq_AL, es_DO, es_CU, ar, ru, en_NZ, sr_RS, de_CH, es_UY, ms, el_GR, iw_IL, en_ZA, th_TH_TH_#u-nu-thai, hi, fr_FR, de_AT, nl, no_NO, en_AU, vi, nl_NL, fr_CA, lv_LV, de_LU, es_CR, ar_KW, sr, ar_LY, mt, it_CH, da, de_DE, ar_DZ, sk_SK, lt_LT, it_IT, en_IE, zh_SG, ro, en_CA, nl_BE, no, pl, zh_CN, ja_JP, de_GR, sr_RS_#Latn, iw, en_IN, ar_LB, es_NI, zh, mk_MK, be_BY, sl_SI, es_PE, in_ID, en_GB]
2017-8-25