java格式化_Java的格式化输出

本文详细介绍了Java SE5中引入的C语言风格的格式化输出,包括System.out.format()和printf()方法的使用,以及Formatter类在格式化输出中的作用。通过实例展示了如何控制输出的对齐、宽度和精度,强调了格式化说明符的语法和常见类型转换。同时,提到了String.format()的便捷用法。
摘要由CSDN通过智能技术生成

在JavaSe5中,推出了C语言中printf()风格的格式化输出。这不仅使得控制输出的代码更加简单,同时也给与Java开发者对于输出格式与排列更大的控制能力。今天,我们开始学习Java中的格式化输出。

目录导航

System.out.format()

由于内容比较简单,我们通过实例来加以说明。项目结构如下:

vDnFvMvuIgely8S4HCiLpnzDIZ7LGIFISQ03zP2nKEfN4f5sSYv3nGErF6XCEnKt47AoCIA0oAAIRACQBAAUoAAIQQ+n9AhvESPWwwggAAAABJRU5ErkJggg==

Java Se5引入的format方法可用于PrintStream或PrintWriter对象,其中也包括System.out对象。

48304ba5e6f9fe08f3fa1abda7d326ab.png

package com.tomhu.format;

public class FormatTest1 {

public static void main(String[] args) {

int x = 5;

double y = 3.141592;

// 一般方式

System.out.println("x = " + x + ", y = " + y);

// printf()方式

System.out.printf("x = %d, y = %f\n", x, y);

// format()方式

System.out.format("x = %d, y = %f\n", x, y);

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

输出的结果如下:

x = 5, y = 3.141592

x = 5, y = 3.141592

x = 5, y = 3.141592

可以看到,format与printf是等价的,它们只需要一个简单的格式化字符串,加上一串参数即可,每个参数对应一个格式修饰符。

public PrintStream printf(String format, Object ... args) {

return format(format, args);

}

在format的具体代码中,其实就是调用Formatter的format方法:formatter.format(Locale.getDefault(), format, args);

48304ba5e6f9fe08f3fa1abda7d326ab.png

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;

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

Formatter类

在Java中,所有新的格式化功能都由Formatter类处理,上述的printf与format也是。可以将Formatter看作是一个翻译器,它将你的格式化字符串与数据翻译成需要的结果。当你创建一个Formatter对象的时候 ,需要向其构造器传递一些信息,告诉它最终的结果将向哪里输出

48304ba5e6f9fe08f3fa1abda7d326ab.png

package com.tomhu.format;

import java.util.Formatter;

public class FormatTest2 {

public static void main(String[] args) {

String name = "huhx";

int age = 22;

Formatter formatter = new Formatter(System.out);

formatter.format("My name is %s, and my age is %d ", name, age);

formatter.close();

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

它的输出结果如下:

My name is huhx, and my age is 22

格式化说明符

在插入数据时,如果想要控制空格与对齐,就需要精细复杂的格式修饰符,以下是其抽象的语法:

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

The optional argument_index is a decimal integer indicating the position of the argument in the argument list. The first argument is referenced by "1$", the second by "2$", etc.

The optional flags is a set of characters that modify the output format. The set of valid flags depends on the conversion.

The optional width is a non-negative decimal integer indicating the minimum number of characters to be written to the output.

The optional precision is a non-negative decimal integer usually used to restrict the number of characters. The specific behavior depends on the conversion.

The required conversion is a character indicating how the argument should be formatted. The set of valid conversions for a given argument depends on the argument's data type.

48304ba5e6f9fe08f3fa1abda7d326ab.png

最常见的应用是控制一个域的最小尺寸,这可以通过指定width来实现。Formatter对象通过在必要时添加空格,来确保一个域至少达到某个长度。在默认的情况下,数据是右对齐的,通过"-"标志可以改变对齐的方向。

与width相对的是precision(精确度),它用来指明最大尺寸。width可以应用各种类型的数据转换,并且其行为方式都一样。precision则不一样,不是所有类型的数据都能使用precision,而且,应用于不同的类型的数据转换时,precision的意义也不同。

precision应用于String时,它表示打印String时输出字符的最大数量

precision应用于浮点数时,它表示小数点要显示出来的位数。默认是6位小数,如果小数位数过多则舍入,过少则在尾部补零。

由于整数没有小数部分,所以precision不能应用于整数。如果你对整数应用precision,则会触发异常

48304ba5e6f9fe08f3fa1abda7d326ab.png

package com.tomhu.format;

import java.util.Formatter;

public class FormatTest3 {

static Formatter formatter = new Formatter(System.out);

public static void printTitle() {

formatter.format("%-15s %-5s %-10s\n", "huhx", "linux", "liuli");

formatter.format("%-15s %-5s %-10s\n", "zhangkun", "yanzi", "zhangcong");

formatter.format("%-15s %-5s %-10s\n", "zhangkun", "yanzhou", "zhangcong");

}

public static void print() {

formatter.format("%-15s %5d %10.2f\n", "My name is huhx", 5, 4.2);

formatter.format("%-15.4s %5d %10.2f\n", "My name is huhx", 5, 4.1);

}

public static void main(String[] args) {

printTitle();

System.out.println("----------------------------");

print();

formatter.close();

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

它的输出结果如下:

huhx linux liuli

zhangkun yanzi zhangcong

zhangkun yanzhou zhangcong

----------------------------

My name is huhx 5 4.20

My n 5 4.10

Formatter转换

下面的表格包含了最常用的类型转换:

类型转换字符

d

整数型(10进制 )

e

浮点数(科学计数)

c

Unicode字符

x

整数(16进制)

b

Boolean值

h

散列码(16进制)

s

String

%

字符"%"

f

浮点数(10进制)

String.format()是一个static方法,它接受与Formatter.format()方法一样的参数,但返回一个String对象。当你只需要用format方法一次的时候,String.format()还是很方便的。

48304ba5e6f9fe08f3fa1abda7d326ab.png

package com.tomhu.format;

public class FormatTest4 {

public static void main(String[] args) {

int age = 22;

String name = "huhx";

String info = String.format("My name is %s and my age is %d", name, age);

System.out.println(info);

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

它的输出结果如下:

My name is huhx and my age is 22

其实String.format方法的实质还是Formatter.format(),只不过是做了简单封装而已:

public static String format(String format, Object... args) {

return new Formatter().format(format, args).toString();

}

简单的十六进制转换工具

48304ba5e6f9fe08f3fa1abda7d326ab.png

package com.tomhu.format;

public class FormatTest5 {

public static String format(byte[] data) {

StringBuilder builder = new StringBuilder();

int n = 0;

for(byte b: data) {

if (n %16 == 0) {

builder.append(String.format("%05x: ", n));

}

builder.append(String.format("%02x ", b));

n ++;

if (n % 16 == 0) {

builder.append("\n");

}

}

builder.append("\n");

return builder.toString();

}

public static void main(String[] args) {

String string = "my name is huhx, welcome to my blog";

System.out.println(format(string.getBytes()));

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

输出结果如下:

00000: 6d 79 20 6e 61 6d 65 20 69 73 20 68 75 68 78 2c

00010: 20 77 65 6c 63 6f 6d 65 20 74 6f 20 6d 79 20 62

00020: 6c 6f 67

友情链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值