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

System.out.format()

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

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

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);}
}

输出的结果如下:

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);

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;
}

Formatter类

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

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();}
}

它的输出结果如下:

My name is huhx, and my age is 22 

格式化说明符

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

%[argument_index$][flags][width][.precision]conversionThe 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.

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

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

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

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

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

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();}
}

它的输出结果如下:

huhx            linux liuli
zhangkun        yanzi zhangcong
zhangkun        yanzhou zhangcong
----------------------------
My name is huhx     5       4.20
My n                5       4.10

Formatter转换

下图包含了最常用的类型转换:

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

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);}
}

它的输出结果如下:

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();
}

简单的十六进制转换工具

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()));}
}

输出结果如下:

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 

Java学习视频

Java基础:

Java300集,Java必备优质视频_手把手图解学习Java,让学习成为一种享受

Java项目:

【Java游戏项目】1小时教你用Java语言做经典扫雷游戏_手把手教你开发游戏

【Java毕业设计】OA办公系统项目实战_OA员工管理系统项目_java开发

Java如何格式化输出?相关推荐

  1. java基础----Java的格式化输出

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

  2. 输出java_java基础----Java的格式化输出

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

  3. java print 格式化输出_java 格式化输出方法

    在javaSE5中推出了printf方法来输出文本到控制台,在java中现在有如下方法可以输出文本: 1.System.out.println(....) //输出并换行 2.System.out.f ...

  4. java date格式化输出_Java Date类以及日期的格式化输出

    Java中的Date类用于表示日期时间,在java.util包中.虽然Date类在设计之初没有考虑到国际化,很多方法都已经被定义为过时,但是Date却是程序设计过程中经常用到的一个类.本文将说说Dat ...

  5. Java中格式化输出

    文章目录 一.要点提示 二.常用的格式标识符 三.格式标识符的解释 四.指定宽度和精度的例子 五.格式化输出语法 六.注意的问题 七.应用 一.要点提示 在控制台上显示格式化输出:System.out ...

  6. java中格式化输出大神Formatter简历

    一.干嘛的?(作用) 在java中,所有新的格式化功能都有formatter类处理.可以将formatter看作一个翻译器,它将你的格式化字符串与数据翻译成需要的结果.比如很多地方格式输出都有用到,像 ...

  7. (JAVA)格式化输出日期

    1.使用子类SimpleDateFormet() 2.使用父类DateFormet package com.book.lite;import javafx.scene.input.DataFormat ...

  8. java货币格式化输出 ¥乱码问题

    问题 方法 结果

  9. java规定日期格式输出_Java格式化输出日期百分比时间等

    Java格式化输出 Java的格式化输出等同于String.Format,与C有很大的相似,比如 System.out.printf("%8.2f", x); 在printf中,可 ...

最新文章

  1. 北大数学天才毕业后坚持出家:理想现实间的挣扎
  2. 发明 AI 吵架神器?程序员对象这么厉害的吗?
  3. springcloud配置文件上传大小_SpringCloud实战二-Nacos
  4. python2和python3如何共存,如何安装多版本python python2和python3共存以及pip共存
  5. LeetCode 1186. 删除一次得到子数组最大和(DP)
  6. greenplum配置高可用_高可用hadoop集群配置就收藏这一篇,动手搭建Hadoop(5)
  7. Android开发中关于Fragments的内涵
  8. 中国民生银行借助Kubernetes的转型 | 凌云时刻
  9. 各种PLC和触摸屏解密软件大全
  10. android金山清理扫描文件动画,[Android开发实战]金山清理大师(猎豹清理大师)一键加速快捷方式动画实现...
  11. css border实现渐变
  12. STM32内部Flash使用磨损均衡算法(Erase Leveling)
  13. python大写金额算法
  14. iphone4s安装linux,苹果4s降级教程【图解】
  15. JMockit、Mockito和Powermock介绍
  16. web自动化笔记九:验证码的处理方式
  17. 三招让windows硬盘资料隐身
  18. 第07课:技术精进之道
  19. opencv1.0 + vc++1.0数米粒 (基于c++)
  20. 质因数分解求给定正整数的因数个数

热门文章

  1. ShaderWeaver使用教程-使用马赛克
  2. DUKPT IPEK KSNPOS机的加密传输过程
  3. Babylongjs-创建三棱柱
  4. 联想最轻便便携式计算机,超轻薄 超时尚 超便携 联想首款便携本S10详细评测
  5. 龙珠机器学习训练营-LightGBM笔记
  6. 软件测试之——性能测试
  7. RSS 简易信息聚合
  8. vue中删除数组元素
  9. scala--嵌套函数
  10. 教你学会虚幻引擎中的光线追踪功能使用,此教程必看