1

我在带有 Java 1.6.0_22 的 Windows Server 2008 R2 上运行 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的值的标签以避免错误。如果那些在然后我得到这个错误:010011cfswitchContext 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
4

2 回答 2

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

编辑:这听起来有点马车海事组织。该文档提到了与vs类似的问题,000并指出它已得到修复。但是 CF 9 中仍然会出现错误。因此您可能需要提交错误报告。

值“00”也被评估为值 0。这导致异常“标签 CFCASE 的上下文验证错误。CFSWITCH 有一个重复的 CFCASE 值“0.0”。该标签现在返回预期的结果。

于 2013-04-11T15:35:46.700 回答
0

为什么不直接使用 val() 然后执行 cfswitch ???Val() 将从值中删除所有前导零:

<cfset a = "010">
<cfset b = val(a)>

<cfdump var="#a#">
<cfdump var="#b#">
<cfdump var="#b eq 10#">
于 2013-04-12T19:22:43.307 回答