文档章节

Java中的格式化输出

英强
 英强
发布于 2016/04/23 15:39
字数 1171
阅读 265
收藏 7

说在前面:本文大部分内容和代码来自《Thinking in Java》。这本书真的是一本好书,强烈推荐。

在Java SE5(很久很久以前的版本)引入了format方法,这个方法跟C的printf方法很像。首先用个简单例子说明下如何使用format方法。

public static void main(String[] args) {
	int x = 5;
	double y = 5.129867;
	//旧的方式
	System.out.println("Row 1: [" + x + " " + y + "]");
	//新的方式
	System.out.format("Row 1: [%d %f]\n", x, y);
	//或
	System.out.printf("Row 1: [%d %f]\n", x, y);
}

输出结果

Row 1: [5 5.129867]
Row 1: [5 5.129867]
Row 1: [5 5.129867]

使用很简单,一个简单的格式化字符串,加上一串参数即可。formatprintf是等价的。我们可以看下printf方法的实现。

public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
再来看下 format方法的实现
private Formatter formatter;
……
public PrintStream format(String format, Object ... args) {
    try {
        synchronized (this) {
            ensureOpen();
            if ((formatter == null)
                || (formatter.locale() != Locale.getDefault()))
                formatter = new Formatter((Appendable) this);
            formatter.format(Locale.getDefault(), format, args);
        }
    } catch (InterruptedIOException x) {
        Thread.currentThread().interrupt();
    } catch (IOException x) {
        trouble = true;
    }
    return this;
}

可以看到,format是通过Formatter类来实现内容格式化的。

在Java中,所有新的格式化功能都由java.util.Formatter类处理,可以将Formatter看作一个翻译器,它将你的格式化字符串与数据翻译成需要的结果。当你创建一个Formatter 对象的时候,需要向其构造器传递一些信息,告诉它最终的结果将向哪里输出。
再看一个例子,这次我们不直接使用 System.out.format,而是使用 java.util.Formatter来实现格式化输出内容的需求:
public class Turtle {
	private String name;
	private Formatter f;
	public Turtle(String name, Formatter f){
		this.name = name;
		this.f = f;
	}
	public void move(int x, int y){
		f.format("%s The Turtle is at (%d, %d)\n", name, x, y);
	}
	public static void main(String[] args) {
		Turtle tommy = new Turtle("Tommy", new Formatter(System.out));
		tommy.move(0, 0);
		tommy.move(3, 2);
		tommy.move(7, 2);
	}
}

输出结果:

Tommy The Turtle is at (0, 0)
Tommy The Turtle is at (3, 2)
Tommy The Turtle is at (7, 2)

Formatter的构造器可以接受多种输出目的地,比如上例中的PrintStream,或者OutputStreamFile等。有兴趣的可以查看Formatter的构造器。

看到这里你可能会想:在上面的例子中,只是简单的输出字符串句子,以前常用的字符串拼接也可以做到,而且并没有多麻烦呀?

那我们现在来看下Formatter的更强大的地方:控制空格与对齐

解释再多,不如来一个实例,我们看例子:

public class Receipt {
	private double total = 0;
	private Formatter f = new Formatter(System.out);
	public void printTitle(){
		f.format("%-15s %5s %10s\n", "Item", "Qty", "Price");
		f.format("%-15s %5s %10s\n", "----", "---", "-----");
	}
	public void print(String name, int qty, double price){
		f.format("%-15.15s %5d %10.2f\n", name, qty, price);
		total = total + price;
	}
	public void printTotal(){
		f.format("%-15s %5s %10.2f\n", "Tax", "", total*0.06);
		f.format("%-15s %5s %10s\n", "", "", "-----");
		f.format("%-15s %5s %10.2f\n", "Total", "", total*1.06);
	}
	public static void main(String[] args) {
		Receipt receipt = new Receipt();
		receipt.printTitle();
		receipt.print("Jack's Magic Beans", 4, 4.25);
		receipt.print("Princess Peas", 3, 5.1);
		receipt.print("Three Bears Proridge", 1, 14.29);
		receipt.printTotal();
	}
}

输出结果:

Item              Qty      Price
----              ---      -----
Jack's Magic Be     4       4.25
Princess Peas       3       5.10
Three Bears Pro     1      14.29
Tax                         1.42
                           -----
Total                      25.06

是不是很整齐?通过简洁的语法,Formatter提供了对空格与对齐的强大控制能力。

看完例子,我们来解释下上面的格式化字符串“%-15s %5s %10.2f\n”是啥意思。以下是其抽象的语法:

%[argument_index$][flags][width][.precision]conversion
最常见的就是通过width来控制一个域的大小。比如“%-15s”中的15。默认情况下,数据是右对齐,不过可以通过使用“-”来改变对齐方向。precision则有点特别,首先该值前面必须带小数点。比如“%10.2f”;其次应用于不同类型的数据转换时,precision的意义也不同。应用于String时,它表示打印String时输出字符的最大数量。而在将precison应用于浮点数时,则表示小数部分要显示出来的位数(默认是6位小数),如果小数位数过多则舍入,太少则在尾部补零。应用于整数,触发异常,因为整数没有小数部分。

最后补充下常用的类型转换字符:

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

© 著作权归作者所有

英强

英强

粉丝 173
博文 29
码字总数 18802
作品 2
深圳
后端工程师
私信 提问
Java基础教程,第六讲,格式化输入输出

上一课我们留下一个思考题,StringBuilder效率为什么比String的效率高? 第四讲我们已经说过了,Java中没有内置String类型,而是在Java的类库中提供了一个基类,当直接使用String拼接字符串时...

程序员补给栈
02/08
19
0
扩展 JDT 实现自动代码注释与格式化

简介: 本文介绍了一个为 Eclipse 工作空间中的 Java 代码自动添加统一注释并格式化排版的工具及其具体实现。该工具扩展 Eclipse Java Development Tool(JDT)API,操作 Java 代码。通过本文...

红薯
2010/07/30
1K
1
Excel自定义格式Java类

求一个JAVA工具类 输入是字符串和参数串 输出是格式化后的字符串 要求如下 输入988046482,和类型那个字符串 输出示例中字符串 其实就是将Excel自定义格式 用JAVA解析...

Jack001
2015/11/11
301
2
Java语言学习(七):字符串的常见使用

Java中字符串的使用很是常见,也是不可避免的,比如:格式化、大小写转换等等,下面就这些常见的使用来说下字符串。 在使用前,必须要理解一点:字符串是不可变的对象,意味着每当调用字符串...

海岸线的曙光
2018/07/16
11
0
IDEA下面使用Google Java 编码规范

安装插件 google-java-formathttps://plugins.jetbrains.com/plugin/8527-google-java-format 启用插件 格式化代码 参考 google-java-formatGoogle Java Style Guidegoogle-java-format......

亚林瓜子
2018/08/11
251
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.7K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部