【譯】Java8官方教程:格式化輸出數值型別

import.發表於2019-05-14

格式化輸出數值型別

前面介紹瞭如何使用print和println方法將字串列印到標準輸出(System.out)。由於所有數字都可以轉換為字串(您將在本課的後面看到),所以可以使用這些方法列印出字串和數字的任意組合。但是,Java程式語言還有其他方法,可以在包含數字時對列印輸出進行更多的控制。

printf和format方法

java.io包包含一個PrintStream類,它有兩種格式化方法(format、printf),可以用來替換print和println,這兩個方法作用等效。你使用過的System.out恰好是一個PrintStream物件,所以你可以通過System.out呼叫PrintStream的方法。因此,您可以在以前使用print或println的任意位置使用format或printf。 對於java.io.PrintStream的方法:

public PrintStream format(String format, Object... args)
複製程式碼

其中format是指定要使用的格式的字串,args是使用該格式列印的變數列表。一個例子:

System.out.format("The value of " + "the float variable is " +
     "%f, while the value of the " + "integer variable is %d, " +
     "and the string is %s", floatVar, intVar, stringVar)
複製程式碼

第一個引數format是一個格式字串,它指定如何格式化第二個引數args中的物件。格式字串包含純文字和格式說明符(格式化引數的特殊字元)。

Object... args稱為可變長變數,表明引數的個數是不固定的

格式說明符以百分號(%)開始,以轉換器結束。轉換器是一個字元,指示要格式化的引數的型別。在百分號(%)和轉換器之間可以有可選的標誌和描述符。有許多轉換器、標誌和描述符,它們都在java.util.Formatter中有說明。

下面是一個基本的例子:

int i = 461012;    
System.out.format("The value of i is: %d%n", i);
複製程式碼

%d指定十進位制整數變數,%n是一個獨立於平臺的換行符,輸出是:

The value of i is: 461012
複製程式碼

printf和format方法被過載。都有一個具有以下語法的版本:

public PrintStream format(Locale l, String format, Object... args)
複製程式碼

例如,要在法語系統中列印數字(在浮點數表示中使用逗號代替小數點),可以使用

System.out.format(Locale.FRANCE,
    "The value of the float " + "variable is %f, while the " +
    "value of the integer variable " + "is %d, and the string is %s%n", 
    floatVar, intVar, stringVar); 
複製程式碼

下表列出了樣例程式TestFormat.java中使用的一些轉換器和標誌

【譯】Java8官方教程:格式化輸出數值型別

import java.util.Calendar;
import java.util.Locale;

public class TestFormat {
    
    public static void main(String[] args) {
      long n = 461012;
      System.out.format("%d%n", n);      //  -->  "461012"
      System.out.format("%08d%n", n);    //  -->  "00461012"
      System.out.format("%+8d%n", n);    //  -->  " +461012"
      System.out.format("%,8d%n", n);    // -->  " 461,012"
      System.out.format("%+,8d%n%n", n); //  -->  "+461,012"
      
      double pi = Math.PI;

      System.out.format("%f%n", pi);       // -->  "3.141593"
      System.out.format("%.3f%n", pi);     // -->  "3.142"
      System.out.format("%10.3f%n", pi);   // -->  "     3.142"
      System.out.format("%-10.3f%n", pi);  // -->  "3.142"
      System.out.format(Locale.FRANCE,
                        "%-10.4f%n%n", pi); // -->  "3,1416"

      Calendar c = Calendar.getInstance();
      System.out.format("%tB %te, %tY%n", c, c, c); // -->  "May 29, 2006"

      System.out.format("%tl:%tM %tp%n", c, c, c);  // -->  "2:34 am"

      System.out.format("%tD%n", c);    // -->  "05/29/06"
    }
}
複製程式碼

DecimalFormat類

您可以使用java.text.DecimalFormat類來控制前置和後置零、字首和字尾、分組(千)分隔符和小數分隔符的顯示。DecimalFormat在數字格式化方面提供了很大的靈活性,但是它會使程式碼更加複雜 下面的例子中通過將格式字串傳遞給DecimalFormat建構函式,建立了一個DecimalFormat物件myFormatter。format()方法是從NumberFormat繼承而來,由myformatter呼叫——它接受double型別的值作為引數並返回格式化後的字串。

譯者注:這個類和BigDecimal沒有半點關係 ,他們都不在一個包內

下面是一個示例程式,演示DecimalFormat的使用:

import java.text.*;
public class DecimalFormatDemo {

   static public void customFormat(String pattern, double value ) {
      DecimalFormat myFormatter = new DecimalFormat(pattern);
      String output = myFormatter.format(value);
      System.out.println(value + "  " + pattern + "  " + output);
   }

   static public void main(String[] args) {

      customFormat("###,###.###", 123456.789);
      customFormat("###.##", 123456.789);
      customFormat("000000.000", 123.78);
      customFormat("$###,###.###", 12345.67);  
   }
}
複製程式碼

輸出為:

123456.789  ###,###.###  123,456.789
123456.789  ###.##  123456.79
123.78  000000.000  000123.780
12345.67  $###,###.###  $12,345.67
複製程式碼

下表解釋了每一行輸出:

【譯】Java8官方教程:格式化輸出數值型別

相關文章