數值格式化 NumberFormat DecimalFormat RoundingMode

NumberFormat

【簡介】
java.text.NumberFormat   extends   java.text.Format    extends    java.lang.Object
實現的接口:Serializable, Cloneable
直接子類:ChoiceFormat, DecimalFormat
NumberFormat 是全部數值格式的抽象基類。此類提供格式化和解析數值的接口。NumberFormat 還提供了一些方法來肯定哪些語言環境具備數值格式,以及它們的名稱是什麼。

NumberFormat 可用於格式化和解析任何語言環境的數值。使代碼可以徹底獨立於小數點、千位分隔符甚至所用特定小數位數的語言環境約定,並與數值格式是否爲偶小數無關。

若要格式化當前 Locale 的數值,可以使用其中一個工廠類方法:
myString = NumberFormat.getInstance().format(myNumber);
若要格式化不一樣 Locale 的日期,可在對 getInstance 的調用中指定它。
NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
還可使用 NumberFormat 來解析數值:
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();
		}
	}
}

DecimalFormat 重要

java.text.DecimalFormat extends java.text.NumberFormat extends java.text.Format extends java.lang.Object
實現的接口:Serializable, Cloneable
直接子類:ChoiceFormat, DecimalFormat
DecimalFormat 是 NumberFormat 的一個具體子類,用於格式化十進制數字 該類設計有各類功能,使其可以解析和格式化任意語言環境中的數,包括對西方語言、阿拉伯語和印度語數字的支持。它還支持不一樣類型的數,包括整數 (123)、符點數 (123.4)、科學記數法表示的數 (1.23E4)、百分數 (12%) 和金額 ($123)。全部這些內容均可以本地化。

要獲取具體語言環境的 NumberFormat,可調用 NumberFormat 的某個 get**Instance() 工廠方法 ,一般其就是  DecimalFormat 類型。
System.out.println(NumberFormat.getInstance() instanceof DecimalFormat);//true
一般不直接調用 DecimalFormat 的構造方法,由於 NumberFormat 的工廠方法可能返回不一樣於 DecimalFormat 的子類。
若是須要自定義格式對象,可執行:
NumberFormat f = NumberFormat.getInstance(loc);
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
		}
	}
}

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模式。

不一樣舍入模式下的舍入操做
  1. UP 向遠離零的方向舍入。捨棄非零部分,並將非零捨棄部分相鄰的一位數字加一。
  2. DOWN 向接近零的方向舍入。捨棄非零部分,同時不會非零捨棄部分相鄰的一位數字加一,採起截取行爲。
  3. CEILING 向正無窮的方向舍入。若是爲正數,舍入結果同ROUND_UP一致;若是爲負數,舍入結果同ROUND_DOWN一致。注意:此模式不會減小數值大小。
  4. FLOOR 向負無窮的方向舍入。若是爲正數,舍入結果同ROUND_DOWN一致;若是爲負數,舍入結果同ROUND_UP一致。注意:此模式不會增長數值大小。
  5. HALF_UP 向「最接近」的數字舍入,若是與兩個相鄰數字的距離相等,則爲向上舍入的舍入模式。若是捨棄部分>= 0.5,則舍入行爲與ROUND_UP相同;不然舍入行爲與ROUND_DOWN相同。這種模式也就是咱們常說的咱們的「四捨五入」。
  6. HALF_DOWN 向「最接近」的數字舍入,若是與兩個相鄰數字的距離相等,則爲向下舍入的舍入模式。若是捨棄部分> 0.5,則舍入行爲與ROUND_UP相同;不然舍入行爲與ROUND_DOWN相同。這種模式也就是咱們常說的咱們的「五舍六入」。
  7. HALF_EVEN 向「最接近」的數字舍入,若是與兩個相鄰數字的距離相等,則相鄰的偶數舍入。若是捨棄部分左邊的數字奇數,則舍入行爲與 ROUND_HALF_UP 相同;若是爲偶數,則舍入行爲與 ROUND_HALF_DOWN 相同。注意:在重複進行一系列計算時,此舍入模式能夠將累加錯誤減到最小。此舍入模式也稱爲「銀行家舍入法」,主要在美國使用。四捨六入,五分兩種狀況,若是前一位爲奇數,則入位,不然捨去。
  8. 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()));//可以使用的語言環境
	}
}
可以使用的語言環境
[, 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


相關文章
相關標籤/搜索