Java String.format()方法详解:30个实用示例

好的,我们来详细讲解 Java 中 String.format() 方法的完整用法。这是一个非常强大的工具,用于创建格式化的字符串,其功能类似于 C 语言中的 printf 函数。

String.format() 方法的基本语法是:

String formattedString = String.format(String format, Object... args);

  • format:这是一个包含格式说明符的字符串。
  • args:这是一个可变参数列表,包含零个或多个对象,这些对象将被插入到格式字符串中。

核心:格式说明符

格式说明符决定了如何格式化参数。其一般语法如下:

%[argument_index$][flags][width][.precision]conversion

  1. %:必需,表示格式说明符的开始。
  2. argument_index$ (可选):指定使用参数列表中的第几个参数(索引从 1 开始)。例如 1$ 表示第一个参数,2$ 表示第二个参数。如果不指定,则按顺序使用参数。
  3. flags (可选):提供额外的格式化选项。常见的标志有:
    • -:在指定的宽度内左对齐(默认是右对齐)。
    • +:为数值输出符号(+-)。
    • 0:用零填充数值以达到指定宽度。
    • ,:使用特定于语言环境的千位分隔符(例如 1,234)。
    • (:将负数括在括号内。
    • (空格):在正数前加空格,负数前加负号(-)。
  4. width (可选):一个整数,指定输出字段的最小宽度。如果输出的内容比宽度短,则用空格(或 0,如果指定了 0 标志)填充以达到该宽度。
  5. .precision (可选):对于浮点数,指定小数点后的精度位数。对于字符串,指定输出的最大字符数。以 . 开头后跟一个整数。
  6. conversion (必需):指定参数应如何格式化。这是一个字符,告诉方法参数是什么类型以及如何显示它。常见的转换字符有:
    • s:字符串(或任何对象,调用其 toString() 方法)。
    • d:十进制整数。
    • f:十进制浮点数。
    • e, E:科学计数法表示的浮点数。
    • g, G:根据精度和值,可能使用 fe/E 格式。
    • c:字符。
    • b, B:布尔值(truefalse)。
    • h, H:参数的哈希码(十六进制字符串)。
    • %:输出一个百分号 %
    • n:特定于平台的换行符(相当于 System.lineSeparator())。
    • t, T:日期/时间转换(需要额外的后缀字符,如 tA 表示星期几的全名)。

详细用法与示例

  1. 基本格式化(字符串、整数、浮点数)

    String name = "Alice";
    int age = 30;
    double height = 1.75;
    
    String str1 = String.format("Name: %s, Age: %d, Height: %.2f meters", name, age, height);
    // 结果: "Name: Alice, Age: 30, Height: 1.75 meters"
    

  2. 指定宽度和填充

    int num = 42;
    String str2 = String.format("|%5d|", num);    // 右对齐,宽度5: "|   42|"
    String str3 = String.format("|%-5d|", num);   // 左对齐,宽度5: "|42   |"
    String str4 = String.format("|%05d|", num);   // 右对齐,宽度5,用0填充: "|00042|"
    

  3. 精度控制(浮点数、字符串)

    double pi = Math.PI;
    String str5 = String.format("Pi: %.4f", pi); // "Pi: 3.1416"
    String str6 = String.format("Pi: %10.4f", pi); // 宽度10,精度4: "Pi:     3.1416"
    
    String longStr = "HelloWorld";
    String str7 = String.format("First 5 chars: %.5s", longStr); // "First 5 chars: Hello"
    

  4. 标志(逗号分隔、符号)

    int bigNumber = 1234567;
    double negative = -123.456;
    
    String str8 = String.format("With commas: %,d", bigNumber); // "With commas: 1,234,567"
    String str9 = String.format("Always show sign: %+d", 10); // "Always show sign: +10"
    String str10 = String.format("Negative in paren: %(d", negative); // "Negative in paren: (123)"
    

  5. 参数索引(重用参数、改变顺序)

    String str11 = String.format("Name: %1$s, Age: %2$d. Again, Name: %1$s", name, age);
    // 结果: "Name: Alice, Age: 30. Again, Name: Alice"
    
    String str12 = String.format("Age: %2$d, Name: %1$s", name, age);
    // 结果: "Age: 30, Name: Alice"
    

  6. 布尔值、字符、哈希码

    boolean flag = true;
    char ch = 'X';
    
    String str13 = String.format("Flag: %b", flag); // "Flag: true"
    String str14 = String.format("Character: %c", ch); // "Character: X"
    String str15 = String.format("Hash of 'Hello': %h", "Hello"); // "Hash of 'Hello': 42628b2"
    

  7. 格式化日期和时间 (使用 tT 转换)

    日期时间格式化需要额外的后缀字符。通常结合 java.util.Datejava.time 类使用。

    import java.util.Date;
    Date now = new Date();
    
    String str16 = String.format("Current date: %tF", now); // "Current date: 2023-10-27" (ISO 8601)
    String str17 = String.format("Time: %tT", now); // "Time: 14:30:15" (HH:MM:SS)
    String str18 = String.format("Day of week: %tA", now); // "Day of week: Friday"
    

    注意:对于新的日期时间 API (java.time),通常使用其自带的格式化方法(如 DateTimeFormatter),但 String.format 也能处理 LocalDateTime 等类型。

  8. 科学计数法

    double avogadro = 6.02214076e23;
    String str19 = String.format("Avogadro's number: %e", avogadro); // "Avogadro's number: 6.022141e+23"
    String str20 = String.format("Avogadro's number: %E", avogadro); // "Avogadro's number: 6.022141E+23"
    String str21 = String.format("Avogadro's number: %g", avogadro); // "Avogadro's number: 6.02214e+23" (更紧凑)
    

  9. 货币格式化 (结合 Locale%f / %,.2f)

    要格式化货币,通常需要指定 Locale 并使用 %,.2f 来获得千位分隔符和两位小数,然后手动添加货币符号,或者使用 NumberFormat 类。

    double amount = 1234.56;
    String str22 = String.format("Amount: $%,.2f", amount); // US: "Amount: $1,234.56"
    String str23 = String.format(Locale.GERMANY, "Amount: %,.2f €", amount); // Germany: "Amount: 1.234,56 €"
    

  10. 换行符和字面量 %

    String str24 = String.format("Line 1%nLine 2"); // 跨平台换行
    String str25 = String.format("Discount: 20%% off!"); // "Discount: 20% off!"
    

注意事项

  • 类型匹配:确保传递给格式说明符的参数类型与该说明符的转换字符兼容(例如,%d 对应整数,%f 对应浮点数)。类型不匹配会导致 IllegalFormatException
  • 参数数量:提供的参数数量必须满足格式字符串中所有非忽略的格式说明符(除了 %%%n)的需求。否则会导致 MissingFormatArgumentException
  • printf 方法System.out.printf(String format, Object... args) 方法的功能与 String.format() 完全相同,只是它直接将结果打印到标准输出流,而不是返回一个字符串。
  • 性能:对于简单的字符串连接(如 "Name: " + name),使用 + 操作符通常更高效。String.format() 在需要复杂格式化时非常有用。
  • 国际化:格式化数字(千位分隔符、小数点)和日期时,String.format() 的行为依赖于 JVM 的默认 Locale。你可以通过 String.format(Locale locale, String format, Object... args) 指定特定的语言环境。

总结

String.format() 是 Java 中构建格式良好字符串的利器。通过熟练掌握格式说明符的各个组成部分(%、索引、标志、宽度、精度、转换字符),你可以精确控制数字、字符串、日期等各种类型数据的输出格式,满足日志记录、报表生成、用户界面显示等多种需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值