使用重新创建单个会话变量将会话变量拆分为数组

时间:2015-02-03 23:31:23

标签: coldfusion

政府办公室让您记录里程的典型方式是在每个输入框中输入一个数字,如下例所示:

Example of mileage entry

所以我要做的是创建一个可以将会话变量拆分为数组的输入框。然后,当该会话变量被分割成一个数组时,我希望它将数组中的每个值设置为它自己的会话变量。

里程输入:
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>

2 个答案:

答案 0 :(得分:3)

这是一种更简单的方法。

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>

答案 1 :(得分:3)

如果我理解,你想把字符串分成六个易于使用的变量,或者变量的长度。

<cfset Mileage = "123456" />
<cfset MilArray = ReMatch("\d",Mileage) />
<cfdump var="#MilArray#" />

你实际上可以将Reverse()放在那里以反转字符串,这可能很方便,因为你可以在某个地方[1][2]数十,{{1}数以百计。

[3]

<cfset Mileage = "123456" /> <cfset MileageR = Reverse(Mileage) /> <cfset MilArray = ReMatch("\d",MileageR) /> <cfdump var="#MilArray#" /> 本身在正则表达式中仅表示&#34;一个数字&#34;。它与\d相同。

正如CFDUMP将展示的那样,[0-9]会将您的里程分成一个易于使用的阵列。如果你使用与上面相反的方法,你可以说&#34;里程的最后一位数是ReMatch。&#34;,作为一个例子。

编辑:

  你知道吗\ d?有没有办法让它成为\ d或只有单词豁免?是否可以创建这两个?

有几种方法。

你可以说

#MilArray[1]#

创建一个用&#34;豁免&#34;填充的一维数组;作为唯一的元素,在您的代码中稍后可能会有用,因此您知道MilArray始终是一个数组,或者您可以简单地使用<cfif mileage is not "Exempt"> ... <cfelse> <cfset MilArray = ["Exempt"]> </cfif>

完成相同的事情的正则表达式是可能的,但它实现与上面的cfif相同,如果你正在使用反向,你必须向后豁免,这样

<cfif mileage is not "Exempt">

编辑#2:

  

<cfset MilArray = ReMatchNoCase("\d|^Exempt$|^tpmexE$)",trim(Mileage)) /> <cfif MilArray[1] is "tpmexE"><cfset milArray = ["Exempt"] /></cfif>

这是<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>link

的任务
ArrayIsDefined()

最后,虽然此处存在关于是否使用 <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()失败的是一个狭窄的字段。

(不要将结构放在顶层和变量范围内。冷融合感到困惑 - IE,不要创建一个名为&#34; isDefined()&#34的对象;或&#34; variables.form&#34;)。除此之外,它主要只是语义学。

反正。一旦你有上面的代码工作(因为它是你的代码并熟悉它),你可能会发现切换到更容易阅读的variables.url版本很有用,因为isDefined可以检查多个级别一个条件。

IsDefined()

编辑3:

Leigh指出

  

为什么这么复杂?你不能用空格或零填充值吗?然后更改正则表达式以检查数字或空格?然后数组将始终有六个元素

这可以这样实现:

  <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>

哪个可以方便地将豁免放到位(方便它的6个字符)。

在开始生成pdf之前,您需要做一些预先检查,以确保里程数变量是免税或数字。

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