用于带前导零的数字的条件逻辑是什么?

时间:2013-04-11 15:10:19

标签: coldfusion coldfusion-9 cfml

我在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标记注释010011的值,以避免出错。如果它们在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

2 个答案:

答案 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#">