Format —— Java & Android

来源:互联网 发布:五行量化指标源码 编辑:程序博客网 时间:2024/05/20 07:34
1. ParsePosition
Format的子类用来记录当前的解析位置,当要分段解析一个字符串时


如:
        NumberFormat format = NumberFormat.getInstance();
        ParsePosition pp = new ParsePosition(0);
        String target = "1'12'123'1234";
        while (pp.getIndex() < target.length()){
            System.out.println(format.parse(target, pp));
            pp.setIndex(pp.getIndex() + 1);
        }
        输出:
        1
        12
        123
        1234


2. FieldPosition
Format的子类用来记录特定Field在格式化后的字符串中的起始位置,其中endIndex是所占最后一个位置+1


如:
        NumberFormat numForm = NumberFormat.getInstance();
        StringBuffer sb = new StringBuffer();
        FieldPosition pos = new FieldPosition(NumberFormat.FRACTION_FIELD);
        numForm.format(123.45, sb, pos);
        System.out.println(sb);
        System.out.println("FRACTION portion is at: " + pos.getBeginIndex() +
                ", " + pos.getEndIndex());
        输出:
        beginIndex:4,endIndex:6




3. NumberFormat
简单地将进行数字和字符串的转换,包括普通数字、货币和百分数,非线程安全的


a. setMaximumFractionDigits——fMax和setMinimumFractionDigits——fMin
设置转换后的字符串中小数位数
如果fMin大于实际的小数位数,会使用padding字符填充,默认为0;
如果fMax小于实际的小数位数,会圆整到fMax位小数;
如果实际的小数位数在fMin和fMax之间,且这部分小数位0,则这部分0不会显示
如12.1000004, fMin=2, fMax=5,则输出为‘12.10’


设置fMin时,如果fMin > fMax,则fMax = fMin
设置fMax时,如果fMax < fMin,则fMin = fMax


如12.1234:
setMaximumFractionDigits(3),则输出为‘12.123’
setMinimumFractionDigits(5),则输出为‘12.12340’


b. setParseIntegerOnly是否只解析整数部分
如12.1234
setParseIntegerOnly(true),则输出为‘12’


c. setMinimumIntegerDigits——IMin和setMaximumIntegerDigits——IMAX
设置最大和最小整数位数


设置IMin时,如果IMin > IMax,则IMax = IMin
设置IMax时,如果IMax < IMin,则IMin = IMax


如果IMAX小于数字的自然整数位数则会被截断;如果IMin大于数字的自然整数位数,则会使用padding字符填充,默认为0
如1234.5
setMaximumIntegerDigits(2),则输出为‘34.5’
setMinimumIntegerDigits(5),则输出为‘01234.5’


d. 圆整模式
CEILING     :向正无穷
DOWN        :向0
FLOOR       :向负无穷
HALF_DOWN   :向最近的
HALF_EVEN   :向最近的
HALF_UP     :向最近的
UNNECESSARY :若需要圆整操作,则抛出异常
UP          :正数向正无穷,负数向负无穷


4. DecimalFormatSymbols
DecimalFormat用来记录特殊符号的,例如在解析时什么符号被当作NaN,在格式化时NaN以什么形式输出
可以设置的符号有:
货币符号
小数和整数之间的分隔符
千分位分隔符
无穷大
NaN
科学计数法中指数和非指数之间的分隔符
负数签名的负号
0
百分号
模式分隔符
货币中小数和整数之间的分隔符




4. DecimalFormat
提供复杂强大的字符串和数字之间的转换功能,包括普通数字、货币和百分数,非线程安全的
可以设置数字的格式,以供解析和格式化时使用,可以为特殊意义的字符或字符串设置格式化或解析表示


a. setDecimalSeparatorAlwaysShown是否显示小数点,false则表示不需要显示时不显示,而true却相反
如1234,false时‘1234’,true时‘1234.’


b. 模式
0和#都表示数字,但是#表示如果0可以省去则省去,0正好相反
0和.之间只能是0,不能有其他字符


模式中的小数模式确定FMax和FMin
如#.##,FMax=2,FMin=0
#.0#,FMax=2,FMin=1
模式中的整数模式确定IMin,IMAX默认为Integer.MAX_VALUE除非显示设定


c. grouping
指定整数部分如何分组显示,各个分组之间使用grouping seperator
在模式中使用,表示分组分隔符,最后一个分组分隔符到模式尾部(如果没有小数模式部分)或者.之间的#或0的数目即为分组的长度
在普通java平台上,就只有这一个长度
在Android中这个长度称为primary grouping size(PGS),还有一个secondary grouping size(SGS),如果在模式中分组分隔符数目为1则两个长度一致
如果PGS和SGS不一致,则PGS只应用于包含最低有效位的分组
SGS的大小确定方式:最后两个分组分隔符之间的#或0的数目
PGS用于整数的最低有效位的显示,SGS与其他有效位的显示
如12345678,PGS=4,SGS=3,则输出为‘1,234,5678’


d. padding (only in Android)
*作为padding转移符号,其后的任何字符(16位长度)作为填充字符
填充宽度:*和填充符号之外的字符数目
如:“*#,##,####”,长度8
“*####”,长度3


e. 科学计数法
指数模式是指指数字符(通常为E或e)后的模式部分,非指数模式指的是指数字符前面的模式部分
指数部分数字长度由指数模式的长度决定
指数模式的第一个数字字符必须是0,而不能是#


f. significant digits
显示出来的数字的数目可以使用两种方式来确定:
一种是:设定(通过模式或APIs)小数和整数的位数来共同确定
还有就是:通过有效数字位数来确定,就是通过模式中的@和#确定最小——MinSD和最大——MaxSD有效数字的数目,模式是否包含@表示是否启用该方式
如:“@@##”,MinSD=2,MaxSD=4


MinSD和MaxSD对解析没有影响


模式中在第一个@之前的#不作为有效数字的计数,但是可以用于表示分组大小
如“#,#@#”,MinSD=1,MaxSD=2,PGS=3


若使用本方法,则不能有.和0


使用该方式,则使用APIs设置的小数和整数的位数被忽略,小数和整数的位数就由MinSD、MaxSD确定
如对于“@@##”,“3.14159”输出为“3.142”,“12.3004”输出为“12.3”


5. ChoiceFormat
基于一个数字返回一个固定的字符串,对于像英语这样有单数和复数之分的比较有用
使用前需要制定一个数字数组Na(必须是升序的长度L)和字符串数组Sa
返回字符串的规则是:
    对于给的数字a,在数字数组中找到一个索引j,使得Na[j]<= a < Na[j+1];
    若没有这样的j,若a < Na[0]则j=0,若a > Na[L-1]则j=L-1
    最后返回Sa[j]
如果通过模式字符串指定,则在比较时Na[j]<= a < Na[j+1]对应的Na[j]使用<连接字符串,则要变成Na[j]< a < Na[j+1]
如“1#Sun|2#Mon|3#Tue|4#Wed|5#Thur|6#Fri|7#Sat”,则“8”输出为Sat,“1.1”输出为Sun
“0#are no files|1#is one file|1<are many files”,则“1.1”输出为“are many files”


6. MessageFormat
其他Formatters的集合体


a. 获取一组对象,格式化这些对象,然后将格式化后的字符串插入到模式中的适当位置
每个对象的插入位置的模式决定了如何格式化其本身


每个插入位置的格式化模式,可以通过APIs设置,也可以通过在构造MessageFormat时在模式中指定


b. 从字符串中解析出一组对象,可以是Number,Date


详细用法见API文档


7. DateFormat
简单地解析和格式化日期时间


8. SimpleDateFormat
提供强大的解析和格式化日期时间的功能


a. set2DigitYearStart
设置解析时两位年的起始年(SY)
年份的确定规则:(year为解析的两位年份)
year += SY / 100 * 100; //确保和起始年在同一个世纪
if (year < SY) year += 100;
默认情况下,SY为SimpleDateFormat创建时时间的年份-80
0 0