如何在Velocity模板中将字符串转换为整数?

50

我有一个Velocity模板文件,其中包含来自XML的数据。 我想将字符串转换为整数类型。

我该如何做到这一点?


你有一个操作XML输入文档的XSLT文件,想要将类型为xs:string的字段转换为类型为xs:integer的字段? - vicatcu
是的,我有包含字符串值的 XML 输入文档,我想将其转换为整数。 - uma
4个回答

108

啊哈!我也经历过类似的情况。

#set($intString = "9")
#set($Integer = 0)
$Integer.parseInt($intString)

这样做使用了Java底层的Velocity。$Integer变量不过是一个Java Integer对象,您可以使用它来访问.parseInt方法。

编辑:以上代码仅供演示。当然有优化它的方法。


非常感谢这个。我一直在为什么$obj.getById("23")能够正常工作,而#set($id = "23") $obj.getById($id))不能正常工作而苦恼。 - adarshr
1
如果我先设置变量,这将对我起作用 #set($int = $Integer.parseInt($intString))。 - Jabda

10

如果您可以控制速度上下文,这里有一种替代方法,可以减轻在Velocity模板中设置变量的需要。

Context velocityContext = new Context();
velocityContext.put(Integer.class.getSimpleName(), Integer.class);

这样可以让您在模板中使用$Integer.parseInt($value)调用java.lang.Integer的静态方法,并且不依赖于在模板中执行类型转换之前已经调用了#set。


4

parseInt 存在一个问题,即如果字符串无法解析,则会抛出异常。如果您的上下文中加载了 NumberTool,则比使用 parseInt 更好的解决方案如下:

#set($intString = "009")
#set($Integer=$numberTool.toNumber($intString).intValue())

#if($Integer)
 ## ok
#else
 ## nok
#end

有时候 NumberTool 也被加载为 $number
但是,NumberTool 有一个小缺点,它只会解析找到的第一个数字并忽略其他内容。所以 "123a" => 123。

如果你想始终以最佳努力的方式解析,而不进行验证,那么这是最好的方法。但是,如果你希望进行更严格的检查,如果遇到无效的数字则失败,那么Integer.parseInt可能更合适。因人而异! - undefined

0

简单易懂:

#set( $stringToCast = "0" )
$number.toNumber($stringToCast)

$numberNumberTool 的默认键名,但可以通过在配置中指定不同的名称(例如 $numberTool)来覆盖它。您必须检查您的 Velocity 环境中使用的 NumberTool 名称。

toNumber 方法 返回:

对象作为 Number 或 null(如果无法转换)

如果您想要一个明确的 int 变量,而不是一个 Number 对象,您可以在结果上使用 intValue 方法。因此,上面的代码将如下所示:

#set( $stringToCast = "0" )
$number.toNumber($stringToCast).intValue()

当然,你可以将结果分配给另一个变量(例如$intVal)。

因此,完整的代码可能如下所示:

#set( $stringToCast = "0" )
#set( $intVal = $number.toNumber($stringToCast).intValue() )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接