我正在使用SpreadsheetMapper工具,我想在列中计算结果列出的数字。
当我使用结果列表时,此代码不起作用。
<#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']!)}
当我使用静态列出的号码时,此方法有效。
<#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)}
参考-https://freemarker.apache.org/docs/ref_directive_function.html
如果使用TW
参数声明nums...
,并将列表传递给TW
,则它将只是第一个元素inside nums
。这是因为参数在FreeMarker中没有声明的类型,因此,您的意思并不明显。
您的示例中还有另一个令人困惑的巧合。如果将somethingMissing!
发送到TW
,则nums
的第一个元素将是一个空字符串,这是expression!
操作的结果。因为+
被重载以作为加法和字符串连接工作,所以sum += num
不会失败,而是先将sum
转换为字符串"0"
,然后将空字符串附加到该字符串上。因此,您最终得到返回值"0"
,这是一个字符串,在打印时,它看起来就像数字0
。
因此,只需使用<#function TW nums>
,它将按预期工作。如果要传递文字列表,则可以写TW([10, 20])
。但我想通常您不想将预定义列表传递给TW
,因此多余的[]
没什么大不了的。