如何使用Freemarker工具将长字符串分割为指定大小的块?
在FreeMarker中分割字符串为指定大小的块
嘿,这个需求其实有两种靠谱的实现方式,取决于你是否能修改后端Java代码,我都给你捋清楚:
方案一:Java端自定义扩展函数(灵活可控)
如果你的项目是Java+FreeMarker的架构,推荐在Java里实现一个自定义方法,然后注册到FreeMarker的配置中,这样模板里直接调用就行。
步骤1:实现自定义方法
写一个类继承TemplateMethodModelEx,实现分割逻辑:
import freemarker.template.TemplateMethodModelEx; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; import java.util.ArrayList; import java.util.List; public class SplitStringIntoChunks implements TemplateMethodModelEx { @Override public Object exec(List args) throws TemplateModelException { // 校验参数:第一个是字符串,第二个是块大小(整数) if (args.size() != 2) { throw new TemplateModelException("需要传入两个参数:字符串和块大小"); } String input = args.get(0).toString(); int chunkSize; try { chunkSize = Integer.parseInt(args.get(1).toString()); } catch (NumberFormatException e) { throw new TemplateModelException("块大小必须是整数"); } if (chunkSize <= 0) { throw new TemplateModelException("块大小必须大于0"); } // 分割逻辑 List<String> chunks = new ArrayList<>(); int length = input.length(); for (int i = 0; i < length; i += chunkSize) { int end = Math.min(i + chunkSize, length); chunks.add(input.substring(i, end)); } return chunks; } }
步骤2:注册到FreeMarker配置
在初始化FreeMarker配置的时候,把这个方法注册为模板可用的函数:
Configuration cfg = new Configuration(Configuration.VERSION_2_3_32); // ... 其他配置(加载模板路径等) cfg.setSharedVariable("splitIntoChunks", new SplitStringIntoChunks());
步骤3:模板中调用
现在在模板里就可以直接用这个函数了:
<#assign inputStr = "1234567890"> <#assign chunkSize = 3> <#assign result = splitIntoChunks(inputStr, chunkSize)> 分割结果:${result}
输出结果就是:分割结果:["123", "456", "789", "0"]
方案二:纯FreeMarker模板实现(无需改Java)
如果不想动后端代码,也可以直接在模板里用内置指令和函数实现,虽然代码稍长,但胜在无需后端改动:
<#assign inputStr = "1234567890"> <#assign chunkSize = 3> <#assign result = []> <#assign strLength = inputStr?length> <#list 0..<(strLength + chunkSize - 1)?intdiv(chunkSize) as index> <#assign start = index * chunkSize> <#assign end = (index + 1) * chunkSize> <#if end > strLength> <#assign end = strLength> </#if> <#assign result = result + [inputStr?substring(start, end)]> </#list> 分割结果:${result}
代码解释:
- 先计算需要循环的次数:
(strLength + chunkSize - 1)?intdiv(chunkSize)这是向上取整的写法,确保最后不足一块的部分也能被处理 - 每次循环计算当前块的起始和结束索引,结束索引超过字符串长度时就取字符串长度
- 把每个子串添加到结果列表中
运行这段模板,同样会得到你想要的结果:分割结果:["123", "456", "789", "0"]
内容的提问来源于stack exchange,提问作者San
相关产品推荐
相关产品推荐

