一、基本语法与结构
1.1 核心语法
// 基础语法
string formatted = string.format("格式字符串", 参数1, 参数2, ...);
// 等价写法(推荐)
string formatted = "格式字符串".formatted(参数1, 参数2, ...); // java 15+
system.out.printf("格式字符串", 参数1, 参数2, ...); // 直接打印1.2 你的示例解析
double i = 3.1415926;
system.out.println(string.format("%.3f", i)); // 输出: 3.142
%:格式说明符开始标记.3:精度控制,保留3位小数f:格式类型,表示浮点数i:要格式化的值
二、格式说明符详解
格式说明符的完整结构:
%[参数索引$][标志][宽度][.精度]转换类型
2.1 转换类型(必需)
| 转换符 | 适用类型 | 说明 | 示例 |
|---|---|---|---|
%d | 整数类型 | 十进制整数 | "%d", 42 → "42" |
%f | 浮点类型 | 十进制浮点数 | "%.2f", 3.14159 → "3.14" |
%s | 任意对象 | 字符串 | "%s", "hello" → "hello" |
%c | 字符 | unicode字符 | "%c", 65 → "a" |
%b | 布尔值 | true/false | "%b", true → "true" |
%x | 整数 | 十六进制 | "%x", 255 → "ff" |
%o | 整数 | 八进制 | "%o", 8 → "10" |
%e | 浮点数 | 科学计数法 | "%e", 1000.0 → "1.000000e+03" |
%% | - | 百分号本身 | "折扣: %d%%", 20 → "折扣: 20%" |
2.2 宽度与精度
// 宽度:最小字符数(右对齐)
string.format("%5d", 42); // " 42" (前面3个空格)
string.format("%-5d", 42); // "42 " (左对齐,后面3个空格)
// 精度:对于浮点数控制小数位
string.format("%.2f", 3.14159); // "3.14"
string.format("%.3f", 1.5); // "1.500" (补零)
// 宽度和精度组合
string.format("%8.2f", 123.456); // " 123.46" (总宽8,2位小数)2.3 标志(flags)
| 标志 | 作用 | 示例 |
|---|---|---|
- | 左对齐 | "%-10s", "hi" → "hi " |
+ | 显示正负号 | "%+d", 42 → "+42" |
0 | 用零填充 | "%05d", 42 → "00042" |
, | 千位分隔符 | "%,d", 1000000 → "1,000,000" |
| 正数前加空格 | "% d", 42 → " 42" | |
( | 负数用括号 | "% (d", -42 → "(42)" |
三、实际应用示例
3.1 数字格式化
// 金融金额格式化
double price = 2999.99;
string.format("价格: ¥%,.2f", price); // "价格: ¥2,999.99"
// 百分比显示
double rate = 0.856;
string.format("成功率: %.1f%%", rate * 100); // "成功率: 85.6%"
// 固定宽度表格数据
system.out.printf("%-10s %8s %8s%n", "商品", "单价", "数量");
system.out.printf("%-10s %8.2f %8d%n", "手机", 2999.99, 3);
system.out.printf("%-10s %8.2f %8d%n", "电脑", 5999.50, 1);输出:
商品 单价 数量
手机 2999.99 3
电脑 5999.50 1
3.2 字符串格式化
// 固定宽度对齐
string.format("|%-20s|", "左对齐"); // "|左对齐 |"
string.format("|%20s|", "右对齐"); // "| 右对齐|"
// 截断字符串
string.format("%.5s", "hello world"); // "hello"
// 多参数格式化
string name = "张三";
int age = 25;
double score = 89.5;
string.format("学生: %s, 年龄: %d, 分数: %.1f", name, age, score);
// "学生: 张三, 年龄: 25, 分数: 89.5"3.3 日期时间格式化
import java.time.localdatetime;
import java.time.format.datetimeformatter;
localdatetime now = localdatetime.now();
// 方式1:使用datetimeformatter(推荐)
string formatted1 = now.format(datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss"));
// 方式2:使用string.format
string formatted2 = string.format("%tf %tt", now, now); // "2024-01-15 14:30:25"常用日期格式符:
date date = new date();
string.format("%ty-%tm-%td", date, date, date); // "2024-01-15"
string.format("%th:%tm:%ts", date, date, date); // "14:30:25"
string.format("%ta", date); // "星期一" (中文环境)四、参数索引与重用
4.1 参数索引(1$表示第一个参数)
// 重用参数
string.format("%1$s的分数是%2$d,%1$s的年龄是%3$d",
"张三", 95, 20);
// "张三的分数是95,张三的年龄是20"
// 改变参数顺序
string.format("%3$s %2$s %1$s", "a", "b", "c"); // "c b a"4.2 复杂示例:格式化表格
public class tableformatter {
public static void main(string[] args) {
object[][] data = {
{"商品a", 29.99, 150},
{"商品b", 159.50, 42},
{"商品c", 9.99, 1000}
};
system.out.println("=".repeat(40));
system.out.printf("%-15s %10s %10s%n", "商品名称", "单价", "库存");
system.out.println("-".repeat(40));
for (object[] row : data) {
system.out.printf("%-15s %10.2f %10d%n",
row[0], row[1], row[2]);
}
system.out.println("=".repeat(40));
}
}输出:
========================================
商品名称 单价 库存
----------------------------------------
商品a 29.99 150
商品b 159.50 42
商品c 9.99 1000
========================================
五、常见问题与解决方案
5.1 精度问题(浮点数)
// 问题:浮点数精度误差
double d = 0.1 + 0.2; // 实际上是 0.30000000000000004
string.format("%f", d); // "0.300000"
// 解决方案1:使用bigdecimal
import java.math.bigdecimal;
bigdecimal bd = new bigdecimal("0.1").add(new bigdecimal("0.2"));
string.format("%.2f", bd); // "0.30"
// 解决方案2:使用decimalformat
import java.text.decimalformat;
decimalformat df = new decimalformat("#.##");
df.format(d); // "0.3"5.2 本地化支持
import java.util.locale; // 默认本地化 string.format(locale.getdefault(), "%,.2f", 1234.56); // 特定本地化(如美国) string us = string.format(locale.us, "%,.2f", 1234.56); // "1,234.56" // 特定本地化(如德国) string de = string.format(locale.germany, "%,.2f", 1234.56); // "1.234,56" // 货币格式化 import java.text.numberformat; numberformat nf = numberformat.getcurrencyinstance(locale.china); nf.format(1234.56); // "¥1,234.56"
5.3 性能优化
// 大量格式化时重用formatter
import java.util.formatter;
stringbuilder sb = new stringbuilder();
try (formatter formatter = new formatter(sb)) {
for (int i = 0; i < 10000; i++) {
formatter.format("第%d行: %.2f%n", i, math.random());
}
}
string result = sb.tostring();六、实用技巧汇总
6.1 快速格式化方法
// java 15+ 的便捷方法
string result = "姓名: %s, 分数: %.1f".formatted("李四", 95.5);
// 链式调用
string message = string.format("%s%n%s%n", "标题", "-".repeat(20))
+ string.format("值: %.2f", 123.456);6.2 自定义格式化
// 自定义对象格式化
class product {
string name;
double price;
@override
public string tostring() {
return string.format("商品[%s] 价格:¥%.2f", name, price);
}
}
product p = new product();
p.name = "手机"; p.price = 2999.99;
string.format("%s", p); // "商品[手机] 价格:¥2999.99"6.3 常见模式模板
public class formatpatterns {
// 文件名序号格式化
public static string formatfileindex(int index) {
return string.format("file_%04d.txt", index); // file_0001.txt
}
// 时间间隔格式化
public static string formatduration(long millis) {
long hours = millis / 3600000;
long minutes = (millis % 3600000) / 60000;
long seconds = (millis % 60000) / 1000;
return string.format("%02d:%02d:%02d", hours, minutes, seconds);
}
// 进度条显示
public static string formatprogress(double current, double total) {
double percent = (current / total) * 100;
return string.format("[%-50s] %.1f%%",
"=".repeat((int)(percent / 2)), percent);
}
}七、总结速查表
| 需求 | 格式字符串 | 示例 |
|---|---|---|
| 保留2位小数 | "%.2f" | 3.14159 → "3.14" |
| 宽度10,右对齐 | "%10s" | "test" → " test" |
| 宽度10,左对齐 | "%-10s" | "test" → "test " |
| 补零到5位 | "%05d" | 42 → "00042" |
| 千位分隔符 | "%,d" | 1000000 → "1,000,000" |
| 十六进制 | "%x" | 255 → "ff" |
| 科学计数法 | "%e" | 1000 → "1.000000e+03" |
| 多参数重用 | "%1$s %1$s" | "a", "b" → "a a" |
| 日期时间 | "%tf %tt" | → "2024-01-15 14:30:25" |
最佳实践建议:
- 明确需求:先确定需要什么格式(小数位、对齐、千分位等)
- 测试边界:测试0、负数、大数值等特殊情况
- 考虑本地化:如果是国际化应用,使用locale参数
- 性能考虑:大量格式化时考虑使用stringbuilder或formatter
- 可读性优先:复杂的格式化考虑拆分成多行
string.format() 是java中非常强大的工具,掌握它可以让你在处理字符串输出时事半功倍。从简单的数字格式化到复杂的报表生成,这个工具都能胜任。
到此这篇关于java 格式化输出string.format() 详解的文章就介绍到这了,更多相关java string.format() 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论