数字格式

数字

数字和货币的格式是高度依赖于locale的,java类库提供了一个格式器对象的集合,可以对java.text包中的数字值进行格式化和解析。步骤如下

  1. 使用上一节的方法获得一个locale对象
  2. 使用一个工厂方法得到一个格式器对象
  3. 使用这个格式器对象来完成格式化和解析工作

工厂方法共有三个:getNumberInstance、getCurrencyInstance和getPercentInstance。他们分别返回可以关于数字、货币和百分比进行格式化和解析的对象

相反的,如果想读取一个按照某个locale规定而输入的数字,那么就需要使用parse方法,parse方法能够处理小数点和分隔符以及其他语言中的数字。

parse返回类型是抽象的Number。这是一个Double或Long的包装器,这取决于被解析的数字是否是浮点数,如果两者都可以接受,可以使用Number类中的doubleValue方法来读取被包装的数字

请注意,由getXxxInstance工厂方法返回的类只是抽象类NumberFormat类的一个子类,工厂方法知道如何定位属于特定的locale对象。

可以用静态的getAvailableLocales方法得到一个当前所支持的locale的对象列表。这个方法返回一个locale对象数组,从中可以获得针对它们的数字格式器对象。

示例程序如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void testNumberFormat()throws Exception{
/*for( Locale locale : NumberFormat.getAvailableLocales()){
System.out.println(locale.getDisplayName(locale));
}
//遍历可用locale,并用其专属locale输出*/
Locale loc=new Locale("de","DE");
NumberFormat currFmt=NumberFormat.getCurrencyInstance(loc);
//用给定的locale实例化转换器
double amt=123456.78;
String result=currFmt.format(amt);
System.out.println(result);
NumberFormat fmt=NumberFormat.getNumberInstance(loc);
//用给定的locale实例化解析器,从字符串中用特定的loc提取数字
Number input = fmt.parse(result);
double x=input.doubleValue();
System.out.println(x);
}

运行结果:

货币

虽然我们可以使用NumberFormat.getCurrencyInstance方法格式化货币,可是在有些时候它不太灵活,只能针对一种locale进行格式化。假设你为一个美国客户准备了一张货物单,上面的货物金额有的是用美元表示的,有的是用欧元。

1
2
3
NumberFormat format1 = NumberFormat.getCurrencyInstance(Locale.US); 
NumberFormat format2 = NumberFormat.getCurrencyInstance(Locale.GERMANY);
//这样一来,发票会很奇怪。 有些金额的格式是 $100,而另一些如 €100.00

这时,可以使用Currency类

可以通过将一个货币标识符传给静态的Currency.getInstance方法来得到一个Currency对象,然后对每个格式器都调用setCurrency方法

1
2
NumberFormat euroFormatter = NumberFormat.getCurrencyInstance(Locale.US); 
euroFormatter.setCurrency(Currency.getInstance(“EUR”));

日期和时间

当格式化日期和时间时,需要考虑4个与locale相关的问题

  • 月份和星期应该用本地语言来表示
  • 年月日的顺序要符合本地习惯
  • 公历可能不是本地首选的日期表示方法
  • 必须要考虑本地的时区

java的DateFormat类可以用来处理这些问题。它和NumberFormat很类似

首先要得到一个locale,也可以使用默认的locale或者调用静态的getAvailableLocales方法来查看都是那些locale支持日期格式化。

lenient标志用于对日期进行宽松的解释

看个荔枝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Test
public void testDateFormat()throws Exception{
Locale loc=new Locale("zh","CN");
DateFormat fmt=DateFormat.getDateInstance(DateFormat.MEDIUM, loc);
/*
* 与此类似的还有几个工厂方法,
* getTimeInstance(timestyle,loc);
* getDateTimeInstance(dateStyle,timeStyle,loc);
* getDateInstance(dateStyle);使用默认locale
* 为了设定想要的风格,这些工厂方法的style参数可以是以下的值
* 1.DateFormat.DEFAULT
* 2.DateFormat.FULL
* 3.DateFormat.LONG
* 4.DateFormat.MEDIUM
* 5.DateFormat.SHORT
*/
Date now = new Date();
String s=fmt.format(now);
System.out.println(s);
Date input=fmt.parse("2015-1-2");
//字符串必须按预定格式输入,否则解析错误,会抛异常
System.out.println(input);
}

运行结果

Donate comment here