VTL(Velocity模板语言)类型转换问题:字符串求和变为拼接
VTL字符串转数值实现数学求和,避免字符串拼接问题
问题描述
我写了一段VTL代码,用来检查从PIM系统获取的属性变量是否为空,为空就设为0,然后对两个变量求和。但现在的问题是这些变量被识别成字符串类型,导致($FordR12 + $DodgeR12)执行的是字符串拼接而非数值相加,比如输入58和58会得到5858。想知道怎么把这些字符串转为数值来做数学求和?
原代码:
#if(${R12 Sales Rev Ford VDSP}== "") #set($FordR12 = 0) #else #set($FordR12 = ${R12 Sales Rev Ford VDSP}) #end #if(${R12 Sales Rev Dodge VDSP}== "") #set($DodgeR12 = 0) #else #set($DodgeR12 = ${R12 Sales Rev Dodge VDSP}) #end #set($Total = ($FordR12 + $DodgeR12)) $Total
我查过VTL官方文档等资料,没找到有效的类型转换方法。
解决方案
方法1:利用Velocity隐式类型转换(加减0)
Velocity在处理算术运算时,会自动将可解析为数字的字符串转为数值类型。可以在赋值时给字符串值加0,完成类型转换:
#if(${R12 Sales Rev Ford VDSP}== "") #set($FordR12 = 0) #else #set($FordR12 = ${R12 Sales Rev Ford VDSP} + 0) #end #if(${R12 Sales Rev Dodge VDSP}== "") #set($DodgeR12 = 0) #else #set($DodgeR12 = ${R12 Sales Rev Dodge VDSP} + 0) #end #set($Total = $FordR12 + $DodgeR12) $Total
这样后续的加法就会是数学运算,而非字符串拼接。
方法2:使用NumberTool(若Velocity工具包可用)
如果你的环境引入了Velocity Tools的NumberTool,可以用它显式转换类型,还能处理非法数值的情况:
#if(${R12 Sales Rev Ford VDSP}== "") #set($FordR12 = 0) #else #set($FordR12 = $numberTool.toNumber(${R12 Sales Rev Ford VDSP})) #end #if(${R12 Sales Rev Dodge VDSP}== "") #set($DodgeR12 = 0) #else #set($DodgeR12 = $numberTool.toNumber(${R12 Sales Rev Dodge VDSP})) #end #set($Total = $FordR12 + $DodgeR12) $Total
toNumber()方法支持传入默认值,比如$numberTool.toNumber(${变量}, 0),可以直接替代空值判断逻辑。
方法3:简化逻辑(空值运算符+类型转换)
用Velocity的空值运算符?:简化空值判断,再结合加0完成转换:
#set($FordR12 = ${R12 Sales Rev Ford VDSP} ?: 0) #set($FordR12 = $FordR12 + 0) #set($DodgeR12 = ${R12 Sales Rev Dodge VDSP} ?: 0) #set($DodgeR12 = $DodgeR12 + 0) #set($Total = $FordR12 + $DodgeR12) $Total
?:会在左边变量为空/Null时返回右边的0,后续加0完成类型转换,代码更简洁。
内容的提问来源于stack exchange,提问作者tecj9
相关产品推荐
相关产品推荐

