Java 如何计算列中的结果列表编号?
我正在使用SpreadsheetMapper工具,我想计算列中列出的数字的结果 当我使用结果列表时,此代码不起作用Java 如何计算列中的结果列表编号?,java,freemarker,Java,Freemarker,我正在使用SpreadsheetMapper工具,我想计算列中列出的数字的结果 当我使用结果列表时,此代码不起作用 <#function TW nums...> <#local sum = 0> <#list nums as num> <#local sum += num> </#list> <#if nums?size != 0> <#return sum > </#i
<#function TW nums...>
<#local sum = 0>
<#list nums as num>
<#local sum += num>
</#list>
<#if nums?size != 0>
<#return sum >
</#if>
</#function>
${TW(result['TotalWeightListResult']!)}
${TW(结果['TotalWeightListResult']!)}
当我使用静态列出的数字时,它会起作用
<#function TW nums...>
<#local sum = 0>
<#list nums as num>
<#local sum += num>
</#list>
<#if nums?size != 0>
<#return sum >
</#if>
</#function>
${TW(10 20)}
${TW(1020)}
参考-
这是我想到的第一件事-如果您使用
nums…
参数声明TW
,并将列表传递给TW
,它将只是nums
中的第一个元素。这是因为参数在FreeMarker中没有声明的类型,所以不清楚您的意思
在你的例子中还有一个令人困惑的巧合。如果您正在发送缺少的内容
到TW
,则nums
的第一个元素将是空字符串,这是表达式的结果代码>操作。因为+
被重载,既可以用作加法,也可以用作字符串连接,sum+=num
将不会失败,而是执行字符串连接。因此,它首先将sum
转换为字符串“0”
,然后将空字符串附加到该字符串中。因此,返回值“0”
,这是一个字符串,在打印时,它看起来就像数字0
。但它实际上不是一个0
数字
所以,只要使用
,它就会按预期工作。如果您想传递一个文本列表,那么可以编写TW([10,20])
。但我想通常情况下,您不想将预定义列表传递给TW
,因此额外的[]
并不是什么大问题。感谢您的解释,是的,我这样做是错误的,因为我只将0和这个${TW(结果['TotalWeightListResult'])
作为字符串读取,有没有一种方法可以将它拆分并转换成一个数字?像${TW(result['totalweightslist']!?split(“,”)}
但这不起作用。@AaronMerin你是说result['totalweightslist']
即使不丢失也是字符串吗?那是一个完全不同的问题。假设s
包含字符串,那么您可以这样做:s?split(“,”)map(it->it?trim?number)
。但您也有一个问题,即空字符串被拆分为[“”]
,而不是拆分为[]
。也要处理这个问题:(s!?length==0)?然后([],s?split(“,”)映射(it->it?trim?number))
。将其放入一个正确命名的#函数中
,以避免引起恐慌。。。或者,更好的是,该值应该作为数据模型中的列表或数组出现。或者,这比?然后解决方案更干净:s?split(,“”)过滤器(it->it?trim!=“”)映射(it->it?trim?编号)
。还要注意的是,?过滤器
地图
需要FreeMarker 2.3.29。