您的位置:首页 > 移动开发 > Android开发

Format —— Java & Android

2016-06-24 18:02 288 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android java