• java基础---->Java的格式化输出


      在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
    ", x, y);
            // format()方式
            System.out.format("x = %d, y = %f
    ", 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]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.

     最常见的应用是控制一个域的最小尺寸,这可以通过指定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
    ", "huhx", "linux", "liuli");
            formatter.format("%-15s %-5s %-10s
    ", "zhangkun", "yanzi", "zhangcong");
            formatter.format("%-15s %-5s %-10s
    ", "zhangkun", "yanzhou", "zhangcong");
        }
    
        public static void print() {
            formatter.format("%-15s %5d %10.2f
    ", "My name is huhx", 5, 4.2);
            formatter.format("%-15.4s %5d %10.2f
    ", "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("
    ");
                }
            }
            builder.append("
    ");
            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 

    友情链接

  • 相关阅读:
    51nod 1574 排列转换(猜结论)
    百度之星资格赛 1005 寻找母串(分块打表+组合数计算)
    百度之星资格赛 1004 度度熊的午饭时光(01背包+最小序号和+字典序+有bug)
    百度之星资格赛 1003 度度熊与邪恶大魔王(二维dp)
    HDU 4542 小明系列故事——未知剩余系 (数论|反素数)
    51nod 1060 最复杂的数(反素数)
    eclipse hadoop环境搭建 查看HDFS文件内容
    Windows jdk安装以及版本切换
    WIN10配置MongoDB
    Oracle 11g R2 for Win10(64位)的安装步骤
  • 原文地址:https://www.cnblogs.com/huhx/p/javaFormatter.html
Copyright © 2020-2023  润新知