Java笔记 – Java中的格式化输出,Formatter类的介绍
本文由发表于4年前 | J2EE | 评论数 1 |  被围观 12,700 views+
1、Java中也提供了类似的格式化方法:System.out.format();2、Formatter类:格式化说明符:3、String.format();
本文主要内容
1、System.out.format()格式化方法的介绍();
2、Formatter类的介绍和使用:初始化需要传入用于输出的介质,如System.out;
3、格式化说明符:format字符串格式化参数语法和使用例子;
4、String.format()的介绍,内部也是基于Formatter的;
5、使用提示:如果只需要使用format()方法一次,String.format()方法使用起来会很方便。

我们知道C语言中有printf()这样的格式化函数,类似这样的:

printf("data: [%d %f]\n", x, y);
1、Java中也提供了类似的格式化方法:System.out.format();

Java SE5引入的format方法可以用于PrintStream或PrintWriter对象(这里不介绍了),其中也包括System.out,下面就是一个使用例子:

int x = 1;
double y = 3.1415926;
System.out.format("data: [%d %f]\n", x, y);

得到如下结果:

data: [1 3.141593]
2、Formatter类:

在Java中所有新的格式化功能都由java.util.Formatter类处理。可将Formatter看做一个翻译器,将你的字符串翻译成需要的结果。

构造Formatter的时候,需要向其构造器传递一些信息,告诉最终的结果将向哪里输出:

public class Message{
    private String username;
    private Formatter f;
    public Message(String username, Formatter f){
        this.username = username;
        this.f = f;
    }
    public void publishMsg(int hour, int minute){
        f.format("%s says it is %d:%d\n", username, hour, minute);
    }
    public static void main(String[] args){
        Message msg1 = new Message("Jason",
                new Formatter(System.out)); // 传入System.out,信息输出到此
        msg1.publishMsg(10, 12);

        Message msg2 = new Message("Jason",
                new Formatter(System.err)); // 当然,也可以传入System.err
        msg2.publishMsg(10, 13);

    }
}

得到如下结果:

Jason says it is 10:12
Jason says it is 10:13

上例是向Formatter传入了PrintStream,Formatter的构造器经过重载可以接受多种输出目的地,如OutputStream和File(这里不作介绍)。

格式化说明符:

format字符串的格式化参数语法如下:

%[argument_index$][flags][width][.precision]conversion

argument_index$:argument_index 是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由 "1$" 引用,第二个参数由 "2$" 引用,依此类推。

flags:可选 flags 是修改输出格式的字符集。有效标志集取决于转换类型。

width:控制一个域的最小值,默认情况下下是右对齐的,可以通过使用“-”标志来改变对其方向。

precision:精度,用于String时,表示输出字符的最大数量,用于浮点数时,表示小数部分要显示出来的 位数(默认是6位),多则舍入,少则补0,用于整数会触发异常。

conversion:转换格式,可选的格式有:

d 整数型(十进制)
c Unicode字符
b Boolean值
s String
f 浮点数(十进制)
e 浮点数(科学计数)
x 整数(十六进制)
h 散列码
% 字符串“%”

注意当使用b作为转换格式时,即Boolean,对于boolean基本类型或者Boolean对象,其转换结果是对应的true或false。但是对于其他类型的参数,只要该参数不为null,那么该转换的结果就永远都是true。0也会转换为true的,跟其他语言有所区别。所以将b运用于非布尔类型要注意。

下面是一个使用例子:

public class TableData {

    // 格式化说明符的使用例子
    private Formatter f = new Formatter(System.out);
    public void printHead(){
        f.format("%-10s %5s %5s\n", "username", "level", "score");
        f.format("%-10s %5s %5s\n", "---", "---", "---");
    }
    public void printData(){
        f.format("%-10s %5d %5.2f\n", "Jason", 1, 9.87654321);
        f.format("%-10s %5d %5.2f\n", "arthinking", 2, 9.6512);
    }

    public static void main(String[] args){
        TableData tb = new TableData();
        tb.printHead();
        tb.printData();
    }
}

输出如下内容:

username   level score
---          ---   ---
Jason          1  9.88
arthinking     2  9.65

下面的boolean转换都输出为true:

Formatter f = new Formatter(System.out);
f.format("boolean %b: ", "false");
f.format("boolean %b: ", 0);
3、String.format();

String.format()的内部,也是创建了一个Formatter对象,然后将你传入的参数转给该Formatter。是一个static方法,接受的参数和Formatter.format()一样,但是返回了一个String对象,如果你只需要使用format()方法一次时,String.format()方法使用起来很方便。

String formatStr = String.format("%#4X", 12);
System.out.println(formatStr);

上面的输出为:

0XC

4表示域的长度,#是flags,具体参考这里:

标志

下表总结了受支持的标志。y 表示该标志受指示参数类型支持。

标志 常规 字符 整数 浮点 日期/时间 说明
'-' y y y y y 结果将是左对齐的。
'#' y1 - y3 y - 结果应该使用依赖于转换类型的替换形式
'+' - - y4 y - 结果总是包括一个符号
'  ' - - y4 y - 对于正值,结果中将包括一个前导空格
'0' - - y y - 结果将用零来填充
',' - - y2 y5 - 结果将包括特定于语言环境的组分隔符
'(' - - y4 y5 - 结果将是用圆括号括起来的负数

1 取决于 Formattable 的定义。

2 只适用于 'd' 转换。

3 只适用于 'o''x' 和 'X' 转换。

4 对 BigInteger 应用 'd''o''x' 和 'X' 转换时,或者对 byte 及 Byteshort 及 Shortint 及 Integerlong 及 Long 分别应用 'd' 转换时适用。

5 只适用于 'e''E''f''g' 和 'G' 转换。

任何未显式定义为标志的字符都是非法字符,并且都被保留,以供扩展使用。

更多说明参考JDK文档。
除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/java-notes-java-in-the-formatted-output-formatter-class-presentation.html
关键字: ,
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2013 12/14
如果您有更好的原创技术博文或者观点,欢迎投稿:admin@itzhai.com,或者关注订阅左侧浮动面板的微信号订阅IT宅itread)发送消息。
文章评论
    一条评论
给我留言

有人回复时邮件通知我
J2EE的相关文章
随机文章 本月热门 热评
1 Struts2的一个和多个文件上传的实现 2011/5/8
2 基于分享式的试题库系统 | Project 2011/11/14
3 J2EE分层架构中的参数和异常处理 2012/9/15
4 JVM笔记 – 虚拟机执行子系统(虚拟机类加载机制) 2014/12/8
5 Java中内存泄露的分析 2014/11/10
6 Java Web笔记 – JSP中常用内置对象的介绍与分析 2011/11/9
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.