使用重新创建单个会话变量将会话变量拆分为数组
Split the session variable into an array using recreating individual session variables
政府部门让您记录里程的典型方式是在每个输入框中输入一个数字,如下例所示:
所以我想做的是创建一个可以将会话变量拆分为数组的输入框。然后,当该会话变量被拆分成一个数组时,我希望它将数组中的每个值设置为其自己的会话变量。
里程输入:
123456 -<cfoutput>#session.checkout.vehicle.mileage#</cfoutput>
数组[1,2,3,4,5,6]
6 -<cfoutput>#session.checkout.vehicle.mileage1#</cfoutput>
5 -<cfoutput>#session.checkout.vehicle.mileage2#</cfoutput>
4 -<cfoutput>#session.checkout.vehicle.mileage3#</cfoutput>
3 -<cfoutput>#session.checkout.vehicle.mileage4#</cfoutput>
2 -<cfoutput>#session.checkout.vehicle.mileage5#</cfoutput>
1 -<cfoutput>#session.checkout.vehicle.mileage6#</cfoutput>
这样我就可以预先填写一个已经创建的表格,该表格的每个框只拆分一个框。
我超级困惑并试图理解的是不会总是有 6 个变量。假设里程数是 2344
。我假设它需要知道从右向左开始倒数。这就是为什么我在 #session.checkout.vehicle.mileage1#
开始 6
希望我没有让任何人对我正在尝试做的事情感到困惑。非常感谢任何帮助!!
<cfparam name="form.mileage" default="#session.checkout.vehicle.mileage#">
...
<label for="mileage">Mileage:</label>
<input type="text" name="mileage"
id="mileage"
value="<cfoutput>#form.mileage#</cfoutput>">
编辑:
我遇到的问题是假设里程数是 9000 全 0 将不会显示。 (这对于 (009000) 中的前两个零非常有用,但在 9 之后,这些 0 仍然需要显示。)你对这个问题有什么想法吗?或者这应该是一个新问题?
<cfset Mileage = "9000" />
<cfif mileage is not "Exempt">
<cfset Mileage = NumberFormat(trim(Mileage),"000000") />
<cfset MilArray = ReMatch("\d",Mileage) />
<cfelse>
<cfset MilArray = ["E","x","e","m","p","t"]>
</cfif>
<cfdump var="#MilArray#">
<cfif MilArray[1] is not "0">
<!---Section6 First box Odometer Reading--->
<cfpdfformparam name="E" value="#MilArray[1]#">
<cfelse>
<cfpdfformparam name="E" value="">
</cfif>
这里有一个更简单的方法。
originalNumber = "123";
sixDigitNumber = right(("000000" & originalNumber), 6);
<cfoutput>
<cfloop from="1" to = "6" index="position">
do something useful with #Mid(sixDigitNumber, position, 1)#
</cfloop>
<cfoutput>
如果我理解,您想将字符串分成六个易于使用变量,或者变量的长度是多少。
<cfset Mileage = "123456" />
<cfset MilArray = ReMatch("\d",Mileage) />
<cfdump var="#MilArray#" />
你实际上可以在其中插入一个 Reverse()
来反转字符串,这可能很方便,因为你可以在个位上设置 [1]
,在十位上设置 [2]
,[3]
成百上千。
<cfset Mileage = "123456" />
<cfset MileageR = Reverse(Mileage) />
<cfset MilArray = ReMatch("\d",MileageR) />
<cfdump var="#MilArray#" />
\d
在正则表达式中本身就意味着 "one digit"。与 [0-9]
.
相同
正如 CFDUMP 将显示的那样,ReMatch
会将您的里程分成一个易于使用的数组。如果你像上面那样使用反向,你可以说"The last digit of your mileage is #MilArray[1]#
.",例如
编辑:
you know the \d ? is there a way to have it be either \d or only the word Exempt? is it possible to create both of those?
有几种方法。
你可以说
<cfif mileage is not "Exempt">
...
<cfelse>
<cfset MilArray = ["Exempt"]>
</cfif>
创建一个一维数组,其中填充了 "Exempt" 作为唯一元素,稍后在您的代码中可能会有用,因此您知道 MilArray 始终是一个数组,或者您可以简单地始终使用 <cfif mileage is not "Exempt">
.
可以使用正则表达式来完成相同的事情,但它的实现与上面的 cfif 相同,如果你使用反向,你必须向后写豁免,就像这样
<cfset MilArray = ReMatchNoCase("\d|^Exempt$|^tpmexE$)",trim(Mileage)) />
<cfif MilArray[1] is "tpmexE"><cfset milArray = ["Exempt"] /></cfif>
编辑#2:
<cfif isDefined("session") and structKeyExists(session, 'checkout') and structKeyExists(session.checkout, 'info') and structKeyExists(session.checkout.info, 'oreading')>
<cfif isDefined("#MilArray[6]#") eq "">
<cfpdfformparam name="E" value="">
<!---Section6 First box Odometer Reading--->
<cfelse>
<cfpdfformparam name="E" value="#MilArray[6]#">
</cfif>
</cfif>
这是 ArrayIsDefined()
(link)
的任务
<cfif isDefined("session") and structKeyExists(session, 'checkout') and structKeyExists(session.checkout, 'info') and structKeyExists(session.checkout.info, 'oreading')>
<cfset MilArray = ReMatch("\d",session.checkout.info.oreading) />
<cfif not ArrayIsDefined(MilArray,6)>
<cfpdfformparam name="E" value="">
<!---Section6 First box Odometer Reading--->
<cfelse>
<cfpdfformparam name="E" value="#MilArray[6]#">
</cfif>
.... I assume that it continues on down from here... <cfif not ArrayIsDefined(MilArray,5)>........</cfif>
</cfif>
最后,虽然这里存在关于是否使用 StructKeyExists()
而不是 IsDefined()
的争论,但有一个狭窄的领域 isDefined()
失败了。
(不要将结构放在顶层和变量范围内。Cold Fusion 会混淆——IE,不要创建名为“variables.form
”或“variables.url
的对象”)。除此之外,它主要只是语义。
总之。一旦上面的代码开始工作(因为这是你的代码并且你很熟悉它),你可能会发现切换到更容易阅读的 IsDefined()
版本很有用,因为 isDefined 可以在一个条件下深入检查多个级别。
<cfif isDefined("session.checkout.info.oreading')>
<cfset MilArray = ReMatch("\d",session.checkout.info.oreading) />
<cfif not ArrayIsDefined(MilArray,6)>
<cfpdfformparam name="E" value="">
<!---Section6 First box Odometer Reading--->
<cfelse>
<cfpdfformparam name="E" value="#MilArray[6]#">
</cfif>
</cfif>
编辑 3:
李指出
Why so complicated? Can't you just left pad the value with spaces or zeroes? Then change the regex to check for either a digit or space? Then the array will always have six elements
可以这样实现:
<cfset Mileage = "exempt" />
<cfif mileage is not "Exempt">
<cfset Mileage = NumberFormat(trim(Mileage),"000000") />
<cfset MilArray = ReMatch("\d",Mileage) />
<cfelse>
<cfset MilArray = ["E","x","e","m","p","t"]>
</cfif>
<cfdump var="#MilArray#">
哪个可以方便地将 Exempt 放置到位(很方便,它是 6 个字符)。
您需要在开始生成 pdf 之前进行一些预检查,以确保 mileage 变量是 Exempt 或 or numeric。
<cfif len((trim(mileage)) gt 6 or not ((isNumeric(trim(mileage))
or mileage is "exempt")>
<!--- The 6 above is a len-check, you may need to update that number to
something else later, but you'll have to put the same number of 0s
in the NumberFormat function.
If you change that number, and the 0s, you'll need to pad the
"Exempt array"... ie ["E","x","e","m","p","t"," "] --->
....raise a flag...
</cfif>
政府部门让您记录里程的典型方式是在每个输入框中输入一个数字,如下例所示:
所以我想做的是创建一个可以将会话变量拆分为数组的输入框。然后,当该会话变量被拆分成一个数组时,我希望它将数组中的每个值设置为其自己的会话变量。
里程输入:
123456 -<cfoutput>#session.checkout.vehicle.mileage#</cfoutput>
数组[1,2,3,4,5,6]
6 -<cfoutput>#session.checkout.vehicle.mileage1#</cfoutput>
5 -<cfoutput>#session.checkout.vehicle.mileage2#</cfoutput>
4 -<cfoutput>#session.checkout.vehicle.mileage3#</cfoutput>
3 -<cfoutput>#session.checkout.vehicle.mileage4#</cfoutput>
2 -<cfoutput>#session.checkout.vehicle.mileage5#</cfoutput>
1 -<cfoutput>#session.checkout.vehicle.mileage6#</cfoutput>
这样我就可以预先填写一个已经创建的表格,该表格的每个框只拆分一个框。
我超级困惑并试图理解的是不会总是有 6 个变量。假设里程数是 2344
。我假设它需要知道从右向左开始倒数。这就是为什么我在 #session.checkout.vehicle.mileage1#
希望我没有让任何人对我正在尝试做的事情感到困惑。非常感谢任何帮助!!
<cfparam name="form.mileage" default="#session.checkout.vehicle.mileage#">
...
<label for="mileage">Mileage:</label>
<input type="text" name="mileage"
id="mileage"
value="<cfoutput>#form.mileage#</cfoutput>">
编辑:
我遇到的问题是假设里程数是 9000 全 0 将不会显示。 (这对于 (009000) 中的前两个零非常有用,但在 9 之后,这些 0 仍然需要显示。)你对这个问题有什么想法吗?或者这应该是一个新问题?
<cfset Mileage = "9000" />
<cfif mileage is not "Exempt">
<cfset Mileage = NumberFormat(trim(Mileage),"000000") />
<cfset MilArray = ReMatch("\d",Mileage) />
<cfelse>
<cfset MilArray = ["E","x","e","m","p","t"]>
</cfif>
<cfdump var="#MilArray#">
<cfif MilArray[1] is not "0">
<!---Section6 First box Odometer Reading--->
<cfpdfformparam name="E" value="#MilArray[1]#">
<cfelse>
<cfpdfformparam name="E" value="">
</cfif>
这里有一个更简单的方法。
originalNumber = "123";
sixDigitNumber = right(("000000" & originalNumber), 6);
<cfoutput>
<cfloop from="1" to = "6" index="position">
do something useful with #Mid(sixDigitNumber, position, 1)#
</cfloop>
<cfoutput>
如果我理解,您想将字符串分成六个易于使用变量,或者变量的长度是多少。
<cfset Mileage = "123456" />
<cfset MilArray = ReMatch("\d",Mileage) />
<cfdump var="#MilArray#" />
你实际上可以在其中插入一个 Reverse()
来反转字符串,这可能很方便,因为你可以在个位上设置 [1]
,在十位上设置 [2]
,[3]
成百上千。
<cfset Mileage = "123456" />
<cfset MileageR = Reverse(Mileage) />
<cfset MilArray = ReMatch("\d",MileageR) />
<cfdump var="#MilArray#" />
\d
在正则表达式中本身就意味着 "one digit"。与 [0-9]
.
正如 CFDUMP 将显示的那样,ReMatch
会将您的里程分成一个易于使用的数组。如果你像上面那样使用反向,你可以说"The last digit of your mileage is #MilArray[1]#
.",例如
编辑:
you know the \d ? is there a way to have it be either \d or only the word Exempt? is it possible to create both of those?
有几种方法。
你可以说
<cfif mileage is not "Exempt">
...
<cfelse>
<cfset MilArray = ["Exempt"]>
</cfif>
创建一个一维数组,其中填充了 "Exempt" 作为唯一元素,稍后在您的代码中可能会有用,因此您知道 MilArray 始终是一个数组,或者您可以简单地始终使用 <cfif mileage is not "Exempt">
.
可以使用正则表达式来完成相同的事情,但它的实现与上面的 cfif 相同,如果你使用反向,你必须向后写豁免,就像这样
<cfset MilArray = ReMatchNoCase("\d|^Exempt$|^tpmexE$)",trim(Mileage)) />
<cfif MilArray[1] is "tpmexE"><cfset milArray = ["Exempt"] /></cfif>
编辑#2:
<cfif isDefined("session") and structKeyExists(session, 'checkout') and structKeyExists(session.checkout, 'info') and structKeyExists(session.checkout.info, 'oreading')> <cfif isDefined("#MilArray[6]#") eq ""> <cfpdfformparam name="E" value=""> <!---Section6 First box Odometer Reading---> <cfelse> <cfpdfformparam name="E" value="#MilArray[6]#"> </cfif> </cfif>
这是 ArrayIsDefined()
(link)
<cfif isDefined("session") and structKeyExists(session, 'checkout') and structKeyExists(session.checkout, 'info') and structKeyExists(session.checkout.info, 'oreading')>
<cfset MilArray = ReMatch("\d",session.checkout.info.oreading) />
<cfif not ArrayIsDefined(MilArray,6)>
<cfpdfformparam name="E" value="">
<!---Section6 First box Odometer Reading--->
<cfelse>
<cfpdfformparam name="E" value="#MilArray[6]#">
</cfif>
.... I assume that it continues on down from here... <cfif not ArrayIsDefined(MilArray,5)>........</cfif>
</cfif>
最后,虽然这里存在关于是否使用 StructKeyExists()
而不是 IsDefined()
的争论,但有一个狭窄的领域 isDefined()
失败了。
(不要将结构放在顶层和变量范围内。Cold Fusion 会混淆——IE,不要创建名为“variables.form
”或“variables.url
的对象”)。除此之外,它主要只是语义。
总之。一旦上面的代码开始工作(因为这是你的代码并且你很熟悉它),你可能会发现切换到更容易阅读的 IsDefined()
版本很有用,因为 isDefined 可以在一个条件下深入检查多个级别。
<cfif isDefined("session.checkout.info.oreading')>
<cfset MilArray = ReMatch("\d",session.checkout.info.oreading) />
<cfif not ArrayIsDefined(MilArray,6)>
<cfpdfformparam name="E" value="">
<!---Section6 First box Odometer Reading--->
<cfelse>
<cfpdfformparam name="E" value="#MilArray[6]#">
</cfif>
</cfif>
编辑 3:
李指出
Why so complicated? Can't you just left pad the value with spaces or zeroes? Then change the regex to check for either a digit or space? Then the array will always have six elements
可以这样实现:
<cfset Mileage = "exempt" />
<cfif mileage is not "Exempt">
<cfset Mileage = NumberFormat(trim(Mileage),"000000") />
<cfset MilArray = ReMatch("\d",Mileage) />
<cfelse>
<cfset MilArray = ["E","x","e","m","p","t"]>
</cfif>
<cfdump var="#MilArray#">
哪个可以方便地将 Exempt 放置到位(很方便,它是 6 个字符)。
您需要在开始生成 pdf 之前进行一些预检查,以确保 mileage 变量是 Exempt 或 or numeric。
<cfif len((trim(mileage)) gt 6 or not ((isNumeric(trim(mileage))
or mileage is "exempt")>
<!--- The 6 above is a len-check, you may need to update that number to
something else later, but you'll have to put the same number of 0s
in the NumberFormat function.
If you change that number, and the 0s, you'll need to pad the
"Exempt array"... ie ["E","x","e","m","p","t"," "] --->
....raise a flag...
</cfif>