在Coldfusion中,我使用的是将一个选择框绑定到另一个选择框的cfc(基本上,从一个框中选择一个状态,第二个框填充了县名。)County框的值是5位数数字格式为TEXT(即值来自文本字段。)
问题在于,我发现如果所选县id的值以'0'开头,则会被切断。
所以我得到的东西: ID县 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,但要注意后一部分,特别是cfloop使用cfset来填充数组结果:
<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>
答案 0 :(得分:1)
在数字的末尾附加一个空格,然后CF将其视为一个字符串,并且不会切断前导0。
简单的解决方法:<cfset result[i][1]=data.StateUSAbb[i] & " ">
顺便说一句,您知道查询对象是否支持填充cfselect
对吗?所以你甚至不需要循环。您可以在cfquery
UPDATE:无论如何,想法是如果你想保留前导0并继续使用CF内置的serializeJSON()或以JSON样式调用cfc远程方法(这将在内部调用serializeJSON (),你可以附加一个空格,这样CF就会把它当成一个字符串,并且前导0将被保留。如果你的脚本必须以某种方式必须“012345”没有尾随空格,那么从riaforge或cflib中寻找另一个JSON seralizer。
答案 1 :(得分: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
答案 2 :(得分:0)
您确定查询返回的数据是一个包含前导零的文本字符串,而不仅仅是整数值吗?无论如何,我认为Zachary对NumberFormat(x,“00000”)的建议是可行的。