我使用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']!)}
https://prnt.sc/r3h137
当我使用静态列出的数字时,它就起作用了。
<#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
我首先想到的是——如何计算子数据存储中列出的数字?
如果用nums...
参数声明TW
,并将列表传递给TW
,它将只是nums
中的第一个元素。这是因为参数在FreeMarker中没有声明的类型,所以您的意思并不明显。
在你的例子中还有一个令人困惑的巧合。如果要将somethingMissing!
发送到TW
,则nums
的第一个元素将是一个空字符串,这是expression!
操作的结果。因为+
被重载,既可以作为加法,也可以作为字符串串联,所以sum += num
不会失败,相反,它会进行字符串串联。因此,首先它将sum
转换为字符串"0"
,然后将空字符串附加到它。因此,您最终得到返回值"0"
,一个字符串,当它打印出来时,看起来就像数字0
。但它并不是一个真正的0
数字。
所以,只要使用<#function TW nums>
,它就会按预期工作。如果您想传递一个文字列表,那么您可以编写TW([10, 20])
。但我想通常您不想将预定义的列表传递给TW
,因此额外的[]
并不是什么大不了的。