在C中可以使用类似printf(“%d %8.2fn”, 1001, 52.335)的方法实现格式化输出,可是Java中的System.out.println()并没有对应的功能。要格式化输出,必须使用java.text包中的类来实现类似的操作(要不怎么体现面向对象的优越性呢,不过据说jdk1.5准备又补上)。当然了,java.text包的功能还是很强大的,奇怪的是很多书中都没有涉及,而一般谁又有工夫整天去看API?
注意:由于这里说得很简略,因此请参照下面的Demo程序。
格式化数字
在NumberFormat类中为我们提供了格式化4种数字的方法:整数、小数、货币和百分比,通过工厂方法getNumberInstance, getNumberIntance, getCurrencyInstance, getPercentInstance方法获得相应的实例对象就行。例如我们要以字符串表示人民币88888.88元,这样来写就行:
NumberFormat nf = NumberFormat.getCurrencyInstance();
System.out.println(nf.format(88888.88));
定制格式化数字
可是对于稍微复杂一点的需求,NumberFormat就满足不了了,幸好java还提供了DecimalFormat实现定制的格式化。要使用DecimalFormat对象,必须提供给它提供一个格式化的模式(pattern):
String pattern = …
DecimalFormat df = new DecimalFormat(pattern);
或者:
DecimalFormat df = new DecimalFormat();
df. applyPattern(pattern);
然后就调用它的format方法就行了。
所以关键就是这个模式怎么定义。在DecimalFormat类的JavaDoc中有模式的语法表示,不过很难说清楚(是我说不清楚,呵呵),请看看Demo自己多试试吧。下面是模式中某些字符的含义表:
- 字符 含义
-
- 0 一位数字,这一位缺失显示为0。用来补零
-
- # 一位数字, 这一位缺失就不显示
-
- . 小数点,不用多说了吧
-
- , 千位分隔符
-
- E 科学计数法
-
- % 百分比
格式化日期
把日期转化为字符串最简单的方法就是调用Date类的toString或者toLocaleString方法:
System.out.println(new Date());
输出:2004-8-7 8:16:14。可是如果我们想把月和日补成2位不要时分秒2004-08-07,这就不灵了。
引用
java.text.DateFormat提供了大量的工厂方法:getDateInstance(int style), getTimeInstance(int style), getDateTimeInstance(int dateStyle, int timeStyle)等等。其中style必须是DateFormat.LONG, DateFormat.MEDIUM, DateFormat.SHORT之一。
Demo中的defaultDateFormat方法作了一个简单的实验。
定制格式化日期:
同样,java.text.SimpleDateFormat可以通过模式(pattern)实现定制格式化:
String pattern = …
SimpleDateFormat df = new SimpleDateFormat(pattern);
或者:
SimpleDateFormat df = new SimpleDateFormat();
df. applyPattern(pattern);
下面是SimpleDateFormat的javadoc中的一个模式符号简表:
符号 意义 合法数值 示例
- y Year Year 1996; 96
-
- M Month in year Month July; Jul; 07
-
- d Day in month Number 10
-
- a Am/pm marker Text PM
-
- H Hour in day (0-23) Number 0
-
- h Hour in am/pm (1-12) Number 12
-
- m Minute in hour Number 30
-
- s Second in minute Number 55
-
- S Millisecond Number 978
-
- z Time zone General time zone Pacific Standard Time; PST; GMT-8:00
-
- Z Time zone RFC 822 time zone -0800
注意的是,符号的大小写意义是不同的,符号的个数也会导致输出不一样。例如用MM就会把1月份显示成01,而用M则不会补零。对于年份,两个yy会只输出两位年份,yyyy则会输出4位年份。
实际上,上面的类还提供了很多其他方法,特别是用于本地化(Locale)定制格式化的方法,以及从字符串表示转化为相应对象的parse方法,还有把格式化结果附加到一个StringBuffer的方法(应该是用来提高性能)。
最后是一个小Demo和输出结果:
TestFormat.java:
import java.text.*;
import java.util.*;
public class TestFormat {
public static void main(String[] args) {
defaultNumberFormat();
System.out.println();
customNumberFormat();
System.out.println();
defaultDateFormat();
System.out.println();
customDateFormat();
System.out.println();
}
public static void defaultNumberFormat() {
int i = 123456;
double x = 882323.23523;
double p = 0.528;
double c = 52.83;
NumberFormat nf = NumberFormat.getInstance();
System.out.println("Integer " + i + " is displayed as " + nf.format(i));
System.out.println("Double " + x + " is displayed as " + nf.format(x));
NumberFormat nfInt = NumberFormat.getIntegerInstance();
System.out.println("Integer " + i + " is displayed as " + nfInt.format(i));
NumberFormat nfNumber = NumberFormat.getNumberInstance();
System.out.println("Double " + x + " is displayed as " + nfNumber.format(x));
NumberFormat nfPercent = NumberFormat.getPercentInstance();
System.out.println("Percent " + p + " is displayed as " + nfPercent.format(p));
NumberFormat nfCurrency = NumberFormat.getCurrencyInstance();
System.out.println("Currency " + p + " is displayed as " + nfCurrency.format(c));
//这里没有涉及相应的parse方法
}
public static void customNumberFormat() {
double x = 1000.0 / 3;
System.out.println("default output is " + x);
patternPrint("###,###.##", x);
patternPrint("####.##", x);
patternPrint("####.00", x);
patternPrint("####.0#", x);
patternPrint("00000.##", x);
patternPrint("$###,###.##", x);
patternPrint("0.###E0", x);
patternPrint("00.##%", x);
double y = 23.0012;
System.out.println("default output is " + y);
patternPrint("###,###.##", y);
patternPrint("####.##", y);
patternPrint("####.00", y);
patternPrint("####.0#", y);
patternPrint("00000.##", y);
patternPrint("$###,###.##", y);
patternPrint("0.###E0", y);
patternPrint("00.##%", y);
}
public static void patternPrint(String pattern, double x) {
DecimalFormat df = new DecimalFormat(pattern);
System.out.println("output for pattern " + pattern + " is " + df.format(x));
}
public static void defaultDateFormat(){
Date date = new Date();
System.out.println("simple date " + date.toLocaleString());
DateFormat df = DateFormat.getDateTimeInstance();
System.out.println(df.format(date));
DateFormat dfLong = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
System.out.println(dfLong.format(date));
DateFormat dfMedium = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
DateFormat.MEDIUM);
System.out.println(dfMedium.format(date));
DateFormat dfShort = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
System.out.println(dfShort.format(date));
}
public static void customDateFormat() {
Date date = new Date();
patternPrint("yyyy.MM.dd HH:mm:ss z", date); //两个MM, dd会导致补零
patternPrint("yy年M月d日 HH时mm分", date); //两个yy就显示为两位年份
patternPrint("EEE, MMM d, ''yy", date);
patternPrint("h:mm a", date);
patternPrint("hh 'o''clock' a, zzzz", date);
patternPrint("yyyyy.MMMMM.dd GGG hh:mm aaa", date);
patternPrint("EEE, d MMM yyyy HH:mm:ss Z", date);
patternPrint("yyMMddHHmmssZ", date);
}
public static void patternPrint(String pattern, Date date){
SimpleDateFormat df = new SimpleDateFormat(pattern);
System.out.println(df.format(date));
}
}
输出:
Integer 123456 is displayed as 123,456
Double 882323.23523 is displayed as 882,323.235
Integer 123456 is displayed as 123,456
Double 882323.23523 is displayed as 882,323.235
Percent 0.528 is displayed as 53%
Currency 0.528 is displayed as ¥52.83
default output is 333.3333333333333
output for pattern ###,###.## is 333.33
output for pattern ####.## is 333.33
output for pattern ####.00 is 333.33
output for pattern ####.0# is 333.33
output for pattern 00000.## is 00333.33
output for pattern $###,###.## is $333.33
output for pattern 0.###E0 is 3.333E2
output for pattern 00.##% is 33333.33%
default output is 23.0012
output for pattern ###,###.## is 23
output for pattern ####.## is 23
output for pattern ####.00 is 23.00
output for pattern ####.0# is 23.0
output for pattern 00000.## is 00023
output for pattern $###,###.## is $23
output for pattern 0.###E0 is 2.3E1
output for pattern 00.##% is 2300.12%
simple date 2004-8-7 8:16:14
2004-8-7 8:16:14
2004年8月7日 上午08时16分14秒
2004-8-7 8:16:14
04-8-7 上午8:16
2004.08.07 08:16:14 GMT+08:00
04年8月7日 08时16分
星期六, 八月 7, '04
8:16 上午
08 o'clock 上午, GMT+08:00
02004.八月.07 公元 08:16 上午
星期六, 7 八月 2004 08:16:14 +0800
040807081614+0800
分享到:
相关推荐
其中,`java.text`包是专门处理文本格式化、国际化和本地化的重要工具集,广泛用于日期、时间、数字、货币、数字格式化等方面。在这个包中,有许多关键的类和接口,例如`Format`、`NumberFormat`、`DateFormat`、`...
例如,以下代码展示了如何使用`DecimalFormat`格式化数字: ```java DecimalFormat df = new DecimalFormat("#,###.##"); double number = 1234567.89; String formattedNumber = df.format(number); ``` 这里,`#...
Java提供了多种处理日期和时间的方式,包括传统的`java.util.Date`和`java.text.SimpleDateFormat`等类,以及自Java 8起引入的新API如`java.time`包下的`LocalDate`、`LocalTime`和`LocalDateTime`等。 - **传统API...
### 格式化数字输出 在`java.text`包中,`NumberFormat`类提供了一种标准的方式来格式化各种类型的数字,包括整数、小数、货币和百分比。你可以通过以下工厂方法获取相应的实例: - `NumberFormat....
java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text 包中类的服务提供者类。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间...
`SimpleDateFormat`是`java.text`包中的一个具体类,它是一个强大的日期和时间格式化工具。通过提供模式字符串,你可以定制日期和时间的显示格式。例如,"yyyy-MM-dd HH:mm:ss"模式会将日期格式化为“年-月-日 时:分...
在 Java 中,我们通常使用 `java.text.SimpleDateFormat` 类来处理日期和时间字符串的格式化。 日期格式化基础 在 Java 中,我们可以使用 `java.text.SimpleDateFormat` 类的 `format` 方法将日期对象格式化为符合...
本文将详细探讨Java中的字符串、日期以及数字的格式化输出技术,特别是针对初学者如何理解和掌握这些基本操作。 #### 二、Java字符串格式化输出 在Java中,`System.out.println()` 是最常用的打印输出语句,但当...
`SimpleDateFormat`是Java `java.text`包中的一个具体类,它提供了一个用于格式化和解析日期的强类型模式系统。这个类的主要作用是将日期或时间对象转换为字符串,或者将字符串转换为日期对象。`SimpleDateFormat`的...
例如,你可以使用Java的`SimpleDateFormat`或`DecimalFormat`类对日期和数字进行处理,然后将格式化后的值返回到`ValueStack`。 在实际应用中,你可能需要处理用户输入的日期和数字。这时,你可以使用Struts2的拦截...
Java.text包支持文本的格式化、查找和操作,包括日期时间、数字和货币的格式化,是国际化和本地化的重要工具。 #### Java.util Java.util包包含了大量常用的工具类和集合框架,如List、Map、Set等,是日常开发中最...
8. **国际化与本地化**:`java.text` 和 `java.util.Locale` 提供了处理不同地区和语言的工具,支持日期、数字和字符串的格式化。 9. **事件处理**:Java AWT 和 Swing 图形用户界面库中包含了事件处理模型,允许...
7. **国际化**:`java.text`和`java.util.Locale`类支持多语言环境下的文本处理和日期时间格式化。 8. **JDBC**:Java Database Connectivity API允许Java程序与各种数据库进行交互。`java.sql`包包含了连接管理、...
java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text 包中类的服务提供者类。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间...
java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text 包中类的服务提供者类。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间...
java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text 包中类的服务提供者类。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间...
java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text 包中类的服务提供者类。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间...
java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text 包中类的服务提供者类。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间...
java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text 包中类的服务提供者类。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间...