0

在 Coldfusion 中,我正在使用将一个选择框绑定到另一个选择框的 cfc(基本上,从一个框中选择一个州,第二个框填充有县名称。)县框的值是一个 5 位数字,即格式化为文本(即值来自文本字段。)

问题是我发现如果所选县 id 的值以“0”开头,它就被切断了。

所以我得到类似的东西: ID County 11223 A 2300 B(应该是 02300)

有人可以帮助确保前导 0 没有被切断吗?

这是页面上的选择框:

 <!--- State Name options --->
    <b>State:</b><br />
    <cfselect bind="cfc:states.getStates()" bindonload="true" name="search_state" id="search_state" value="StateUSAbb" display="StateName">
    </cfselect><br />

  <!--- County Name options --->
    <b>County:</b><br />
    <cfselect bind="cfc:states.getCounties({search_state})" name="search_county" id="search_county" value="FIPS_County" display="CountyName">
    </cfselect>

我讨厌粘贴整个 .cfc,但要注意后面的部分,尤其是使用 cfset 填充数组 RESULT 的 cfloop:

<cfcomponent output="false">

    <!--- Get array of media types --->
    <cffunction name="getStates" access="remote" returnType="array">
        <!--- Define variables --->
        <cfset var data="">
        <cfset var result=ArrayNew(2)>
        <cfset var i=0>

        <!--- Get data --->
        <cfquery name="data" datasource="bridges">
       SELECT DISTINCT tblLoc.StateUSAbb, lkuState.StateName
        FROM lkuState INNER JOIN tblLoc ON lkuState.FIPS_State = tblLoc.FIPS_State
        WHERE (lkuState.StateName <> 'New Brunswick')
        UNION
        SELECT '' AS StateUSAbb, ' ALL' AS StateName
        FROM lkuState
        ORDER BY StateName
        </cfquery>

        <!--- Convert results to array --->
        <cfloop index="i" from="1" to="#data.RecordCount#">
            <cfset result[i][1]=data.StateUSAbb[i]>
            <cfset result[i][2]=data.StateName[i]>
        </cfloop>

        <!--- And return it --->
        <cfreturn result>
    </cffunction>

    <!--- Get counties by state --->
    <cffunction name="getCounties" access="remote" returnType="array">
        <cfargument name="stateabb" type="string" required="true">

        <!--- Define variables --->
        <cfset var data="">
        <cfset var result=ArrayNew(2)>
        <cfset var i=0>

        <!--- Get data --->
        <cfquery name="data" datasource="bridges">
        SELECT '' AS FIPS_COUNTY, ' ALL' as CountyName
        FROM lkuCnty
        UNION
        SELECT FIPS_County, CountyName
        FROM lkuCnty
        WHERE StateAbb = '#ARGUMENTS.stateabb#'
        ORDER BY CountyName
        </cfquery>

        <!--- Convert results to array --->
        <cfloop index="i" from="1" to="#data.RecordCount#">
            <cfset result[i][1]=data.FIPS_County[i]>
            <cfset result[i][2]=data.CountyName[i]>
        </cfloop>

        <!--- And return it --->
        <cfreturn result>
    </cffunction>

</cfcomponent>
4

3 回答 3

1

在数字末尾附加一个空格,然后 CF 会将其视为字符串,并且不会截断前导 0。

简单的解决方法:<cfset result[i][1]=data.StateUSAbb[i] & " ">

顺便说一句,您知道支持填充查询对象cfselect吗?所以你甚至不需要循环。您可以执行相同的解决方法,但在 cfquery 中的 SQL 中

更新:无论如何,这个想法是,如果您想保留前导 0 并继续使用 CF 内置的 serializeJSON() 或以 JSON 样式调用 cfc 远程方法(它将在内部调用 serializeJSON(),您可以附加一个空格,以便 CF会将其视为字符串并保留前导 0。如果您的脚本以某种方式必须需要没有尾随空格的“012345”,则从 riaforge 或 cflib 寻找另一个 JSON 序列化程序。

于 2010-11-16T18:39:00.030 回答
1

如果数据是固定长度,您可以使用NumberFormat强制前导零。通常,CF 是无类型的,因此必须发生一些导致数据损坏的底层转换。您可以尝试强制值 toString(),或者调试添加单引号作为列值中的第一个字符(例如 SELECT '''' + FIPS_County, '''' + CountyName FROM lkuCnty)以查看是否他们保留了所有角色。

[更新] 根据您对 SQL 如何不返回 5 个字符的评论,使用此更新的查询从 INT 转到带有前导零的 VARCHAR。

  SELECT DISTINCT 
    RIGHT('00000' + CONVERT(VARCHAR(5),StateUSAbb),5), 
    lkuState.StateName
         FROM lkuState INNER JOIN tblLoc ON lkuState.FIPS_State = tblLoc.FIPS_State
         WHERE (lkuState.StateName <> 'New Brunswick')
  UNION
     SELECT '' AS StateUSAbb,
     ' ALL' AS StateName
          FROM lkuState
          ORDER BY StateName
于 2010-11-16T23:26:06.430 回答
0

You're sure the data returned from your query is a text string which contains the leading zero, rather than just the integer value? Regardless, I think Zachary's suggestion of NumberFormat(x, "00000") is the way to go.

于 2010-11-17T14:27:48.550 回答