zoukankan      html  css  js  c++  java
  • 数值格式化 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 或 getNumberInstance 来获取常规数值格式。使用 getIntegerInstance 来获取整数数值格式。使用 getCurrencyInstance 来获取货币数值格式。使用 getPercentInstance 来获取显示百分比的格式。使用此格式,小数 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。

    将输入数字舍入为一位数时,不同舍入模式格式化后的结果
    输入UPDOWNCEILINGFLOORHALF_UPHALF_DOWNHALF_EVENUNNECESSARY
    5.56565656Exception
    2.53232322Exception
    1.62121222Exception
    1.12121111Exception
    1.011111111
    -1.0-1-1-1-1-1-1-1-1
    -1.1-2-1-1-2-1-1-1Exception
    -1.6-2-1-1-2-2-2-2Exception
    -2.5-3-2-2-3-3-2-2Exception
    -5.5-6-5-5-6-6-5-6Exception

    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




  • 相关阅读:
    SQLServer中通过脚本内容查找存储过程
    TensorFlow学习笔记——节点(constant、placeholder、Variable)
    解决方案:System.InvalidOperationException: 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。
    通过网页或Serverice远程系统网站(服务)所在服务器本地的应用程序(未成功)
    (MSSQL)sp_refreshview刷新视图失败及更新Table字段失败的问题解决
    创建自己的代码片段(CodeSnippet)
    vue 创建监听,和销毁监听(addEventListener, removeEventListener)
    vue 运行时报 dependency was not found:错误
    Git 本地创建分支并提交远程分支
    vue自定义组件(通过Vue.use()来使用)即install的使用
  • 原文地址:https://www.cnblogs.com/baiqiantao/p/6738842.html
Copyright © 2011-2022 走看看