You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何按出现顺序将字符串内%d替换为对应数值

问题根因

你之前的代码运行失败的核心原因非常明确:String.format() 不会修改传入的原始字符串,Java中String是不可变对象,该方法执行后会将格式化完成的结果作为全新的字符串返回。你之前的写法调用方法后没有接收返回值,打印的始终是列表里存的原始模板字符串,自然看不到占位符替换的效果。

正确实现代码

你只需要接收String.format()的返回值即可完成需求,推荐动态获取年份避免硬编码,示例如下:

import java.util.ArrayList;
import java.util.List;
import java.time.Year;

public class StringFormatTest {
    public static void main(String[] args) {
        List<String> templateList = new ArrayList<>();
        templateList.add("Hello this is %d next year is %d");
        templateList.add("I am in %d and we will be in %d");

        // 动态获取当前年份,若需要固定输出2021、2022直接给currentYear赋值2021即可
        int currentYear = Year.now().getValue();
        int nextYear = currentYear + 1;

        for (String template : templateList) {
            // 接收格式化后返回的新字符串
            String result = String.format(template, currentYear, nextYear);
            System.out.println(result);
        }
    }
}

运行后输出结果:

Hello this is 2024 next year is 2025
I am in 2024 and we will be in 2025

如果你需要用Stream方式实现,可以参考如下写法:

int currentYear = 2021;
int nextYear = currentYear + 1;
templateList.stream()
        .map(template -> String.format(template, currentYear, nextYear))
        .forEach(System.out::println);

执行后将输出你预期的固定结果:

Hello this is 2021 next year is 2022
I am in 2021 and we will be in 2022
注意事项
  • %d 是整数类型占位符,传入的参数必须是整数类型,否则会抛出类型匹配异常
  • 模板字符串中的占位符数量需要和传入的参数数量一致,缺省会抛出MissingFormatArgumentException
  • 所有针对String的修改、替换、格式化操作都不会改变原始字符串,必须接收方法返回值才能拿到处理后的结果

内容的提问来源于stack exchange,提问作者Satya ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 00:57:26