3

我正在做一个税务项目。税收分为季度。征税的月份是 3 月、6 月、9 月和 12 月。一旦运行我的网站会显示税收何时再次运行。我的问题是,在我的结果页面中,当下一次运行日期是 12 月而不是显示 12-2012 时,我得到的东西看起来像 0-2012。

这是我的代码:

<td style="white-space: nowrap;">&nbsp;#stec_mysql_search_results.cover_date#&nbsp;</td>
<td style="white-space: nowrap;">&nbsp;<cfif "" neq stec_mysql_search_results.next_run>0<cfset temp_next_run = stec_mysql_search_results.next_run MOD 4><cfswitch expression="#temp_next_run#">
<cfcase value="1">3</cfcase>
<cfcase value="2">6</cfcase>
<cfcase value="3">9</cfcase>
<cfcase value="4">12</cfcase>
</cfswitch>-<cfif 4 lt stec_mysql_search_results.next_run>#year(now())+1#<cfelse>#year(now())#</cfif></cfif>&nbsp;</td>

这是查看源代码时的输出:

<td style="white-space: nowrap;">&nbsp;07-16-2012&nbsp;</td>
<td style="white-space: nowrap;">&nbsp;0-2012&nbsp;</td>
4

2 回答 2

3

问题的关键是您的代码期望 12 mod 4 给出 4,而它给出 0。

您提供的代码已格式化,几乎没有任何换行符,这是一种愚蠢的代码编写方式,因为它很难维护(在可读性、修改甚至简单的修订比较方面),尤其是在以后的开发人员必须出现并了解正在发生的事情。

确保你使用换行符——尤其是当这意味着修复其他人编写的代码时。如果空格的输出是一个问题,那么理想的解决方案通常是将逻辑放在一个函数中(并使用output=false),尽管您也可以使用<cfsilent>..</cfsilent>块、适当放置的注释<!--- --->和其他方式。

以下是将代码的相关部分翻译成实际可读的内容:

<cfif "" neq stec_mysql_search_results.next_run>
    0
    <cfset temp_next_run = stec_mysql_search_results.next_run MOD 4>
        <cfswitch expression="#temp_next_run#">
            <cfcase value="1">3</cfcase>
            <cfcase value="2">6</cfcase>
            <cfcase value="3">9</cfcase>
            <cfcase value="4">12</cfcase>
        </cfswitch>
    -
    <cfif 4 lt stec_mysql_search_results.next_run>
        #year(now())+1#
    <cfelse>
        #year(now())#
    </cfif>
</cfif>

您在结果中看到的0是 cfif 中的硬编码。

因为开关没有 0 的情况,所以它没有输出任何东西。

要使现有代码正常工作,只需将 cfcase 的 4 更改为 0。


但是,由于这是处理宿舍,我不认为你在计算你的意思。

这是简单地将 cfcase 从 4 更改为 0 会导致...

January   = January
February  = February
March     = March
April     = December
May       = January
June      = February
July      = March
August    = December
September = January
October   = February
November  = March
December  = December


当你可能想要的是这样的:

January   = March
February  = March
March     = March
April     = June
May       = June
June      = June
July      = September
August    = September
September = September
October   = December
November  = December
December  = December


这可以很简单地用3*ceiling(next_run/3).

如果这个假设是正确的,那么有一个更好的方法来编写你的代码:

<td>#calculateNextRunQuarter(stec_mysql_search_results.next_run)#</td>


<cffunction name="calculateNextRunQuarter()" returntype="String" output=false>
    <cfargument name="NextRunMonth" type="Numeric" required />

    <cfset var Quarter = 3*ceiling(Arguments.NextRunMonth/3) />
    <cfset var TheYear = Year(Now()) />

    <cfif Arguments.NextRunMonth GTE 4 >
        <cfset TheYear = TheYear + 1 />
    </cfif>

    <cfreturn Right('0'&Quarter,2) & '-' & TheYear />
</cffunction>

而且因为逻辑都在 output=false 的函数中,所以没有杂散的空格,代码仍然完全可读

于 2012-08-17T17:52:50.143 回答
2

cfcase 将接受一个列表,也许你过于复杂了,为什么不这样做:

    <cfswitch expression="#stec_mysql_search_results.next_run#">
        <cfcase value="1,2,3">3</cfcase>
        <cfcase value="4,5,6">6</cfcase>
        <cfcase value="7,8,9">9</cfcase>
        <cfcase value="10,11,12">12</cfcase>
    </cfswitch>
于 2012-08-17T19:50:54.537 回答