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

目录导航

  1. System.out.format()
  2. Formatter类
  3. 格式化说明符
  4. Formatter转换
  5. 简单的十六进制转换工具
  6. 友情链接

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转换

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

类型转换字符
d 整数型(10进制 ) e 浮点数(科学计数)
c Unicode字符 x 整数(16进制)
b Boolean值 h 散列码(16进制)
s String % 字符"%"
f 浮点数(10进制)    

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 
作者: huhx 出处: www.cnblogs.com/huhx

java基础----Java的格式化输出相关推荐

  1. Java基础【之】输出一个菱形(详解)

    Java基础[之]输出一个菱形(详解) 代码示例 <目录:Java渐进式学习> <目录:Java设计模式> <目录:从零手写Tomcat> 代码示例 public ...

  2. Java基础——Java多继承的三种实现方式

    Java基础--Java"多继承"的三种实现方式 Java语言本身只支持单继承(每个类只能有一个父类),但单继承的局限性很大,因此,可以通过以下的方式实现"多继承&quo ...

  3. JAVA基础--JAVA SE(知识点总结 Ⅴ )

    前面内容请见: JAVA基础–JAVA SE(知识点总结 Ⅰ ) JAVA基础–JAVA SE(知识点总结 Ⅱ ) JAVA基础–JAVA SE(知识点总结 Ⅲ ) JAVA基础–JAVA SE(知识 ...

  4. Java基础-Java中常用的锁机制与使用

    Java基础-Java中常用的锁机制与使用 锁lock或互斥mutex是一种同步机制,主要用于在存在多线程的环境中强制对资源进行访问限制.锁的主要作用为强制实施互斥排他以及并发控制策略.锁一般需要硬件 ...

  5. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnblogs.com/yinzhengjie/p/9 ...

  6. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  7. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二. 转载于:https://www.cnblogs.com/yinzhengji ...

  8. [重学Java基础][Java IO流][Exter.2]IO流中几种不同的读写方法的区别

    [重学Java基础][Java IO流][Exter.2]IO流中几种不同的读写方法的区别 Read 读入方法 read(): 一般是这种形式 public int read() 1.从流数据中读取的 ...

  9. Java基础----Java编程语言概述

    Java基础----Java编程语言概述 文章目录 Java基础----Java编程语言概述 Java编程语言概述 1-1 软件开发介绍 1.1软件开发介绍 1.2 常用命令 1-2 计算机编程语言介 ...

最新文章

  1. ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API
  2. java工程打包时进行签名_使用Java SDK实现离线签名
  3. 实现人脸识别性别之路---open CV将图片显示出来
  4. Socket 学习(三).1 tcp 通讯
  5. 计算机组成原理第4章-指令系统
  6. 替换a链接的href和title
  7. 脚本语言php是什么意思,php是什么脚本语言
  8. 50张图片做出李飞飞数万张的效果,类脑AI竟然这样玩?
  9. 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记
  10. STM8L超低功耗程序编写教学,简单易懂
  11. 教你用python爬虫下载1w+『ppt模板』,再也不用付费去购买啦!
  12. Java如何实现代理服务器?
  13. java新闻发布系统
  14. dB、dBm、dBw、dBμV、dBmV、dBV、dBv等单位介绍
  15. Unity - Projector - 实时[假]阴影
  16. 计算机重启 ie 被改,ie被修改怎么办 ie被修改的解决方法【详解】
  17. 【不知出处】危险的迷宫 网络流 费用流
  18. 计算机维修工初级题库网盘,初级计算机维修工技能试卷.pdf
  19. 机械转行前端,半年零基础自学的心路历程
  20. mac版本Beyond Compare如何一直试用

热门文章

  1. RuoYi-Vue————权限管理
  2. rust 面向对象之Struct、impl、trait关键字使用
  3. VC,Windbg,gdb执行到指定代码行方法
  4. android 验证输入,最佳实践:输入验证(Android)
  5. cad插入块_CAD中怎么创建多重插入块?
  6. python命令式编程的概念,【Python】十分钟学会函数式编程
  7. 显示部分数据标签_长春市农贸市场监测数据显示:粮油和水果价格平稳,部分副食品价格小幅波动...
  8. 微信小程序购物车 数量加减功能
  9. linux time shell统计脚本运行时间
  10. ajax 更新页面变量,[Django 1.5] jQuery/Ajax 在Django使用 ,如何更新模板里里变量