我在Windows Server 2008 R2上使用Java 1.6.0_22运行ColdFusion Enterprise 9.0.1.274733。
我正在调用SOAP Web服务,它向我返回各种数据。其中一个数据元素包含由带前导零的数字组成的代码。我试图将该代码转换为文本描述,但我遇到了前导零问题。我尝试使用cfswitch
标记以及cfif
标记的各种内容。他们的表现有点不同。我正在寻找一些关于如何最好地处理这些代码的建议。
以下是描述查找的代码示例:
Code Description
01 Automobile
010 Personal Automobile
011 Commercial Automobile
02 Home
03 Boat
10 Life
11 Umbrella
我最初尝试使用cfswitch
块来处理这个问题,但发现它将代码视为整数。所以就cfswitch
而言; 010
等于10
。我也尝试过使用cfif
。它似乎也是在比较期间转换价值。因此,就cfif
而言,情况恰恰相反; 10
等于010
。
你们如何处理这个问题?
以下是一些显示正在发生的事情的示例代码:
<html>
<head><title>Test</title></head>
<body>
<h3>Test</h3>
<cfset testvals = "01,010,011,10,11,12" />
<cfoutput>
<div>
<cfloop list="#testvals#" index="testval">
<p>testval = [#testval#]
<cfswitch expression="#testval#">
<cfcase value="01"> <cfset desc="matches 01" /> </cfcase>
<!---<cfcase value="010"> <cfset desc="matches 010" /></cfcase> --->
<!---<cfcase value="011"> <cfset desc="matches 011" /></cfcase> --->
<cfcase value="02"> <cfset desc="matches 02" /> </cfcase>
<cfcase value="03"> <cfset desc="matches 03" /> </cfcase>
<cfcase value="04"> <cfset desc="matches 04" /> </cfcase>
<cfcase value="08"> <cfset desc="matches 08" /> </cfcase>
<cfcase value="09"> <cfset desc="matches 09" /> </cfcase>
<cfcase value="10"> <cfset desc="matches 10" /> </cfcase>
<cfcase value="11"> <cfset desc="matches 11" /> </cfcase>
<cfcase value="12"> <cfset desc="matches 12" /> </cfcase>
<cfdefaultcase> <cfset desc="no match" /> </cfdefaultcase>
</cfswitch>
<br />cfswitch: #desc#
<cfif testval EQ "01">
<cfset desc="matches 01" />
<cfelseif testval EQ "010">
<cfset desc="matches 010" />
<cfelseif testval EQ "011">
<cfset desc="matches 011" />
<cfelseif testval EQ "02">
<cfset desc="matches 02" />
<cfelseif testval EQ "03">
<cfset desc="matches 03" />
<cfelseif testval EQ "04">
<cfset desc="matches 04" />
<cfelseif testval EQ "08">
<cfset desc="matches 08" />
<cfelseif testval EQ "09">
<cfset desc="matches 09" />
<cfelseif testval EQ "10">
<cfset desc="matches 10" />
<cfelseif testval EQ "11">
<cfset desc="matches 11" />
<cfelseif testval EQ "12">
<cfset desc="matches 12" />
<cfelse>
<cfset desc="no match" />
</cfif>
<br />cfif: #desc#
<cfif toString(testval) EQ "01">
<cfset desc="matches 01" />
<cfelseif toString(testval) EQ "010">
<cfset desc="matches 010" />
<cfelseif toString(testval) EQ "011">
<cfset desc="matches 011" />
<cfelseif toString(testval) EQ "02">
<cfset desc="matches 02" />
<cfelseif toString(testval) EQ "03">
<cfset desc="matches 03" />
<cfelseif toString(testval) EQ "04">
<cfset desc="matches 04" />
<cfelseif toString(testval) EQ "08">
<cfset desc="matches 08" />
<cfelseif toString(testval) EQ "09">
<cfset desc="matches 09" />
<cfelseif toString(testval) EQ "10">
<cfset desc="matches 10" />
<cfelseif toString(testval) EQ "11">
<cfset desc="matches 11" />
<cfelseif toString(testval) EQ "12">
<cfset desc="matches 12" />
<cfelse>
<cfset desc="no match" />
</cfif>
<br />tostring: #desc#
</p>
</cfloop>
</div>
</cfoutput>
</body>
</html>
请注意,我必须为cfcase
标记注释010
和011
的值,以避免出错。如果它们在cfswitch
中,那么我会收到此错误:Context validation error for the cfcase tag. The cfswitch tag has a duplicate cfcase tag for value 10.0. The error occurred on line -1.
以下是示例代码的输出:
Test
testval = [01]
cfswitch: matches 01
cfif: matches 01
tostring: matches 01
testval = [010]
cfswitch: matches 10 // trying to avoid this
cfif: matches 010
tostring: matches 010
testval = [011]
cfswitch: matches 11 // trying to avoid this
cfif: matches 011
tostring: matches 011
testval = [10]
cfswitch: matches 10
cfif: matches 010 // trying to avoid this
tostring: matches 010 // trying to avoid this
testval = [11]
cfswitch: matches 11
cfif: matches 011 // trying to avoid this
tostring: matches 011 // trying to avoid this
testval = [12]
cfswitch: matches 12
cfif: matches 12
tostring: matches 12
答案 0 :(得分:4)
我经常使用compare()
来避免意外的隐式转换问题:
<cfif compare("010", testVal) EQ 0>
matches 010
</cfif>
但是,如果您只是返回一个值,您是否考虑使用结构来进行简单的查找?
<cfset lookup = { "010"="matches 010", ...} >
<cfif structKeyExists(lookup, testVal)>
do something with #lookup[ testVal ]# ...
</cfif>
就cfswitch而言; 010等于10
编辑:听起来有点儿错误的IMO。该文档提到a similar issue with 0
versus 00
并说明它已得到修复。但错误仍然发生在CF 9中。因此您可能想要提交错误报告。
值“00”也被评估为值0.这导致了 异常“标记CFCASE的上下文验证错误。 CFSWITCH有一个 复制CFCASE的值为“0.0”。“标签现在返回 预期的结果。
答案 1 :(得分:0)
为什么不使用val()然后再做cfswitch ??? Val()将从值中删除所有前导零:
<cfset a = "010">
<cfset b = val(a)>
<cfdump var="#a#">
<cfdump var="#b#">
<cfdump var="#b eq 10#">