如何在StringBuilder中添加换行符?%n不生效原因及解决办法
问题原因
%n是Java格式化输出相关方法(比如System.out.printf()、String.format())专属的平台无关换行占位符,只有被这些方法处理时才会被替换为对应系统的换行符,直接拼接进字符串或StringBuilder时只会被当成普通的%和n两个字符输出,不会实现换行效果。
可行解决方案(无正则,符合要求)
方案1:直接使用系统换行符拼接
通过System.lineSeparator()可以获取当前平台适配的换行符,直接拼接进StringBuilder即可:
StringBuilder menuText = new StringBuilder(" 0: " + menu[0] + System.lineSeparator() + " 1: " + menu[1] + System.lineSeparator() + " 2: " + menu[2] + System.lineSeparator() + " 3: " + menu[3] + System.lineSeparator() + " 4: " + menu[4] + System.lineSeparator() + " 5: " + menu[5]);
如果不需要跨平台兼容,也可以直接写\n作为换行符,绝大多数运行场景都能正常生效。
方案2:结合String.format处理(可保留原有%n写法)
如果不想改动原有写了%n的代码结构,可以把整个字符串模板交给String.format()处理后再传给StringBuilder,%n会被自动解析为换行符:
String menuStr = String.format(" 0: %s%n 1: %s%n 2: %s%n 3: %s%n 4: %s%n 5: %s", menu[0], menu[1], menu[2], menu[3], menu[4], menu[5]); StringBuilder menuText = new StringBuilder(menuStr);
方案3:循环拼接(更易扩展,适合菜单选项较多的场景)
如果后续菜单选项会增减,用循环拼接更简洁,避免硬编码下标:
StringBuilder menuText = new StringBuilder(); for (int i = 0; i < menu.length; i++) { // 写法1:用format格式化输出 menuText.append(String.format(" %d: %s%n", i, menu[i])); // 写法2:完全不用格式化方法,纯拼接 // menuText.append(" ").append(i).append(": ").append(menu[i]).append(System.lineSeparator()); }
如果不需要保留最后一行的末尾换行,拼接完成后可以删除末尾多余的换行符:
if (menuText.length() > 0) { menuText.setLength(menuText.length() - System.lineSeparator().length()); }
内容的提问来源于stack exchange,提问作者Ryan Holmes
相关产品推荐
相关产品推荐

