Java 字符串format()方法

原文:https://www.studytonight.com/java-examples/java-string-format-method

String 类的 format()方法使用区域设置、格式化字符串和参数来格式化字符串。这是一个静态方法,返回一个字符串。String类包含两个重载的 format()方法。

public static String format(String formatString, Object... args)
public static String format(Locale locale, String formatString, Object... args)

这两种重载方法都采用可变的对象类型参数。让我们进一步了解这个方法以及如何使用它来格式化字符串。

格式化字符串

格式化字符串格式化给定的参数,并使用它们生成一个字符串。格式化字符串包含参数索引、标志、宽度定义、精度修饰符和转换字符。

它可能包括我们想要添加到最终格式化字符串中的附加字符串。下面显示了格式化字符串的一般结构。

%[argument-index$][flags][width][.precision][conversion-character]

转换字符

转换字符是格式化字符串的强制部分。数据类型存在不同的转换字符。

让我们尝试使用 String.format()方法格式化字符串。在下面的代码中, %s 格式化String类型, %d 格式化Integer类型, %f 格式化浮动数据类型。 %n 字符新增一行。

public class Demo
{    
    public static void main(String[] args)
    {
        String name = "Justin";
        int regno = 1001;
        double marks = 15.21;
        String summary = String.format("Student Name: %s %nReg.No: %d %nMarks: %f", name, regno, marks);
        System.out.print(summary);
    }
}

学生姓名:贾斯汀 Reg。编号:1001 商标:15.21 万

使用参数索引

传递给 format()方法的每个参数都可以通过使用索引来访问。指数从 1 开始,后面跟着一个美元符号($) 。这个索引帮助我们在格式化字符串中多次访问同一个参数。

在下面的代码中,我们两次访问第二个参数(名称)。然后,我们访问第一个参数(标记)。

public class Demo
{    
    public static void main(String[] args)
    {
        String name = "Justin";
        double marks = 15.21;
        String s = String.format("Name: %2$s Name: %2$s Marks: %1$f", marks, name);
        System.out.print(s);
    }
}

姓名:贾斯汀姓名:贾斯丁·马科斯 15.21 万

Precision 编辑

我们可以使用精度修饰符来舍入浮点数。一点(。)后面跟着的精确位数就是用于此的。让我们把圆周率的值四舍五入到小数点后四位。

public class Demo
{    
    public static void main(String[] args)
    {
        double pi = 3.14159265359;
        String s = String.format("PI: %.4f", pi);
        System.out.print(s);
    }
}

PI: 3.1416

对于其他数据类型,它限制最终字符串中包含的字符数。

public class Demo
{
    public static void main(String[] args)
    {
        String str1 = String.format("Precision with Strings Number: %.5s", "Hello World");
        String str2 = String.format("Precision with Boolean: %.3b", false);

        System.out.println(str1);
        System.out.println(str2);
    }
}

带字符串数字的精度:您好 带布尔值的精度:fal

宽度

Width 表示参数应该采用的最小空格数。如果一个参数占用的空间较少,则添加空格。

我们可以通过在格式化字符串中使用整数值来添加填充。

例如,在下面的代码中,整数 13 表示返回字符串的总长度。如果原始参数占用的空间较少,则在左侧添加额外的填充。

public class Demo
{    
    public static void main(String[] args)
    {
        String name = "Justin";
        String s = String.format("%13s", name);//A padding of 7(13 - name.length()) is added
        System.out.print("||" + s + "||");
    }
}

||贾斯汀||

旗帜

标志是用于修改和格式化输出的字符。我们可以使用减号(-) 来左对齐文本。一个逗号(,可以作为添加千位分隔符的标志。

public class Demo
{
    public static void main(String[] args)
    {
        String str1 = String.format("Left Justify:%-15d", 1000000000);
        String str2 = String.format("Thousands-separator: %,d", 1000000000);

        System.out.println("||" + str1 + "||");
        System.out.println(str2);
    }
}

| |左对齐:100000000 | | 千位分隔符:1,000,000,000

使用区域设置

如果没有提到 Locale,format()方法通过调用 Locale.getDefault() 方法使用默认的 Locale。让我们尝试使用其他语言环境来格式化带有千位分隔符的整数。

import java.util.Locale;

public class Demo
{    
    public static void main(String[] args)
    {
        int million = 1000000;
        String s1 = String.format(Locale.GERMAN, "%,d", million);
        System.out.println(s1);

        String s2 = String.format(Locale.US, "%,d", million);
        System.out.print(s2);
    }
}

1,000,000 1,000,000

格式化日期和时间

LocalDateLocalTime 这样的日期和时间类也可以使用 format()方法格式化并转换为字符串。

格式化日期和时间的所有转换字符包括。我们可以使用 %tD 来格式化本地日期。同样,我们可以使用 %tr 来格式化 LocalTime。**

import java.time.*;

public class Demo
{
    public static void main(String[] args)
    {
        LocalDate date = LocalDate.now();
        String strDate = String.format("The Date is: %tD", date);

        LocalTime time = LocalTime.now();
        String strTime = String.format("The Time is: %tr", time);

        System.out.println(strDate);
        System.out.print(strTime);
    }
}

日期为:08/20/21 时间为:上午 09:19:39

我们还可以从本地日期中提取不同的组件。我们可以用 %tA 取日名, %tB 取月名, %tC 取一年中的世纪部分。

import java.time.*;

public class Demo
{
    public static void main(String[] args)
    {
        LocalDate date = LocalDate.now();

        String day = String.format("The Day is: %tA", date);
        String month = String.format("The Month is: %tB", date);
        String century  = String.format("The Century part of year is: %tC", date);

        System.out.println(day);
        System.out.println(month);
        System.out.print(century);
    }
}

日为:星期五 月为:八月 一年中的世纪部分为:20

同样,我们可以使用 %tI 从 LocalTime 实例中获取小时部分。使用 %tM 获取分钟,使用 %tS 获取秒钟。

import java.time.*;

public class Demo
{
    public static void main(String[] args)
    {
        LocalTime time = LocalTime.now();

        String hour = String.format("The Hour is: %tI", time);
        String minute = String.format("The Month is: %tM", time);
        String seconds  = String.format("The Century part of year is: %tS", time);

        System.out.println("Time is: " + time);
        System.out.println(hour);
        System.out.println(minute);
        System.out.print(seconds);
    }
}

时间为:11:34:22.275791700 小时为:11 月为:34 年的世纪部分为:22

格式化大写和小写

我们可以格式化某些数据类型,如字符串、字符、大写或小写的布尔值。对于大写,我们可以使用大写转换字符。例如, %S 将字符串转换为大写, %C 将字符转换为大写。

public class Demo
{
    public static void main(String[] args)
    {
        String str1 = String.format("Boolean Uppercase: %B", false);
        String str2 = String.format("String Uppercase: %S", "Hello World");
        String str3 = String.format("String Uppercase: %C", 'c');

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }
}

布尔大写:FALSE 字符串大写:HELLO WORLD 字符串大写:C

没有转换字符可以将大写转换为小写。例如,%s 不会将“HELLO WORLD”转换为小写。

public class Demo
{
    public static void main(String[] args)
    {
        String str1 = String.format("String: %s", "HELLO WORLD");
        String str2 = String.format("Character: %c", 'C');

        System.out.println(str1);
        System.out.println(str2);
    }
}

字符串:HELLO WORLD 字符:C

格式化数字和浮点

我们可以使用数字转换字符来格式化数据类型,如 int、short、byte 和 long。

  • %d 格式为十进制数(以 10 为基数)
  • %o 转换为八进制表示(基数 8)
  • %x 转换为十六进制数(基数 16) 。%X 会将字符改为大写。
public class Demo
{
    public static void main(String[] args)
    {
        String decimal = String.format("Decimal: %d", 43);
        String octal = String.format("Octal: %o", 43);
        String hexaUppercase = String.format("Hexadecimal(Uppercase): %X", 43);
        String hexaLowercase = String.format("Hexadecimal(Lowercase): %x", 43);

        System.out.println(decimal);
        System.out.println(octal);
        System.out.println(hexaUppercase);
        System.out.println(hexaLowercase);
    }
}

十进制:43 八进制:53 十六进制(大写):2B 十六进制(小写):2B

%f 转换字符用于双精度或浮点等浮点数据类型。我们也可以使用 %e%E (大写的“E”字符)来格式化科学符号。

public class Demo
{
    public static void main(String[] args)
    {
        String str1 = String.format("Floating Point: %f", 102301.12022);
        String str2 = String.format("Scientific Notation: %e", 102301.12022);
        String str3 = String.format("Scientific Notation(Uppercase): %E", 102301.12022);

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }
}

浮点:102301.120220 科学记数法:1.023011e+05 科学记数法(大写):1.023011e+05

抛出异常

当格式化字符串为空时,String.format()方法抛出空指针异常

public class Demo
{    
    public static void main(String[] args)
    {
        double marks = 15.21;
        String s = String.format(null, marks);
        System.out.print(s);
    }
}

在 Java . base/Java . util . regex . matcher . gettextlength(matcher . Java:1770) 处的线程“main”Java . lang . nullpointerexception 在 Java . base/Java . util . regex . matcher . reset(matcher . Java:416) 在 Java . base/Java . util . regex . pattern . matcher(pattern . Java:1133)处的 init>(Matcher.java:253)

该方法还抛出illegalformateexception或该异常的子类。当格式字符串的语法无效时,会出现此异常。下面的代码演示了这一点。

public class Demo
{    
    public static void main(String[] args)
    {
        double marks = 15.21;
        try {
        String s = String.format("%y", marks);
        }
        catch(Exception e){
            System.out.print(e.getClass().getSuperclass().getName());
        }
    }
}

Java . util . illegal format exception

上面代码抛出的实际异常是未知格式转换异常。它是 IllegalFormatException 的子类。

public class Demo
{    
    public static void main(String[] args)
    {
        double marks = 15.21;
        String s = String.format("%y", marks);
    }
}

线程“main”中出现异常 Java . util . unknowntformaconversionexception:Conversion = ' y ' 在 Java . base/Java . util . formatter $ format 说明符. Conversion(formatter . Java:2839) 在 java.base/java.util.Formatter$FormatSpecifier.(Formatter.java:2865) 在 Java . base/Java . util . formatter . parse(formatter . Java:2713) 在 Java . base/Java . util . formatter . format(formatter . Java:2655)【异常

摘要

String.format()是将不同的参数连接成一个字符串的方便方法。它采用一个格式化字符串和一个变量对象作为参数和一个可选的区域设置。如果未提供明确的区域设置,则使用默认区域设置。请确保格式字符串的语法正确,以避免出现 IllegalFormatException。如果格式化字符串为空,则会出现空指针异常。