3

我想在 ColdFusion 中做一些类似于 C 或 Perl 中的 sprintf 的事情。我找到了这个 答案,这似乎是我正在寻找的。但是,我无法让它工作。

这是我正在尝试的:

<cftry>
    <cfset firstName="John">
    <cfset output=createObject("java","java.lang.String").format("Hello, %s!", firstName)>
    <cfcatch type="any">
        <cfdump var="#cfcatch#" expand="false">
    </cfcatch>
<cftry>

这就是我得到的:

cfcatch.Message:未找到格式化方法。

cfcatch.Detail:要么没有具有指定方法名称和参数类型的方法,要么格式方法被 ColdFusion 无法可靠破译的参数类型重载。ColdFusion 找到 0 个与提供的参数匹配的方法。如果这是一个 Java 对象并且您验证了该方法存在,请使用 javacast 函数来减少歧义。

这是一个重载的方法,所以我按照建议做了,并在参数上使用了 JavaCast:

<cfset output=createObject("java","java.lang.String").format(JavaCast('string', "Hello, %s!"), firstName)>
<cfset output=createObject("java","java.lang.String").format("Hello, %s!", JavaCast('string', firstName))>
<cfset output=createObject("java","java.lang.String").format(JavaCast('string', "Hello, %s!"), JavaCast('string', firstName))>

并且每次都得到同样的错误。

我在 String 类上尝试了另一种静态方法 valueOf,它运行良好。

编辑: 我已经看到了评论,我不知道如何回应,但也许我应该在这里解释一下。我上面展示的是我正在尝试做的一个非常简化的例子。目标是使用格式字符串在一个地方提供大量格式,然后简单地传入一个变量列表,而不是格式化一堆变量并输出它们,或者在我输出它们时格式化它们。使用 format 方法,我计划构建一组与我需要的输出匹配的格式字符串,然后我将在查询上执行 cfloop 或 cfoutput,在其中运行这个方法,并获得我想要的输出。没有 DateFormat、NumberFormat、Left、Right 等。如果我不能让这个工作,那就是 B 计划。

我正在运行 ColdFusion 9.01、Windows 7、Java 1.6.0_22。

非常感谢任何和所有帮助。

4

1 回答 1

1

根据我上面的评论回答:

它可能与您正在寻找的格式方法不匹配,因为它的签名是 format(String, Object[]) 并且您的第二个 String 参数无法自动转换为 Object 数组。

您可以更改参数以将名称封装在数组中,如下所示format("Hello, %s!", [firstName])

感谢 Leigh 如此有礼貌,我赞成你的评论 :)

于 2012-04-19T19:19:48.070 回答