【问题标题】:Remove characters in <cfoutput> with ReplaceNoCase() ColdFusion使用 ReplaceNoCase() ColdFusion 删除 <cfoutput> 中的字符
【发布时间】:2015-01-15 14:07:55
【问题描述】:

我需要显示格式类似于以下的数据记录的输出:XXXX:12345 (Xxxxxxxxx)

但是,我想要输出的唯一数据是“12345”并且前面有两个零,即输出应该看起来像“0012345”。记录中的“12345”仅作为示例,每条记录都有一个唯一编号。示例记录如下所示:CAST:98765 (RPOS1234-XY)

我可以使用 ReplaceNoCase() 仅从记录中提取该数据吗?如果是这样,我将如何编写代码来删除不需要的字符?

【问题讨论】:

  • XXs 应该代表什么?它们可以是数字吗?
  • 另外,答案是否有某些原因需要使用ReplaceNoCase() 而不是REReplaceNoCAse()
  • 第一组 XXXX 实际上是单词“CAST”,括号内的最后一组 (Xxxxxxxxx) 长度可变,并且包含两个字母数字字符。不必是 ReplaceNoCase()。
  • 没有看过ListToArray函数,但是“12345”只是一个例子,所有的记录都会有一个唯一的编号。
  • 前面有两个零 你的意思是用零填充提取的数字吗?另外,到目前为止,您尝试过什么?

标签: replace coldfusion character cfoutput


【解决方案1】:

您可以使用几个函数在一行代码中完成此操作。

str = 'CAST:98765 (RPOS1234-XY)';
projectCode = '00' & listLast( listFirst( str, ' ' ), ':' );

writeDump( projectCode );

从最里面的函数出来解释这段代码。

ListFirst() 根据您指定的分隔符获取列表中的第一个元素,在这种情况下,分隔符是 ' ' - 一个空格 - 是的,您可以使用空格作为分隔符。

ListLast() 根据您指定的分隔符获取列表中的最后一个元素,在这种情况下,分隔符是':'

第一部分 simplt 将 '00' 附加到上述函数调用的结果中。

【讨论】:

  • 当然,如果字符串的语法改变了,上面的代码可能也需要改变。
  • 或者使用多个分隔符。然后是一个列表函数调用来获取原始值,即getToken(text, 2, ":(")。如果您不想要尾随空格,请修剪它。
  • 我永远不记得使用getToken()。好电话。
  • 其实你可以使用getToken( str, 2, ": "),它会处理尾随空格。
  • @scott-stroz 这行得通!非常感谢!我稍微修改了代码以适应数据和输出的需要,但这解决了问题! castTicket = 项目代码; castNumber = '00' & listLast( listFirst( castTicket, ' ' ), ':' ); #castNumber#
【解决方案2】:

如果我必须使用 reReplaceNoCase 或 reFindNoCase,我会这样做。

function parseTokenUsingReFindNoCase(token) {
    var local = {};

    // use regex to locate position of number (see only set of parentheses in regex pattern)
    local.positions = reFindNoCase("^.+:(\d+).+$", arguments.token, 1, true);
    // obtain the token substring and ensure at least 7 digits with preceding 0's
    local.result = numberFormat( mid(arguments.token, local.positions.pos[2], local.positions.len[2]), repeatString(0, 7));

    return local.result;
}


function parseTokenUsingReReplaceNoCase(token) {
    var local = {};

    // use regex to strip away text before and after the token
    local.result = reReplaceNoCase(arguments.token, "(^\D+|\s.+$)", "", "all");
    // ensure at least 7 digits with preceding 0's
    local.result = numberFormat(local.result, repeatString(0, 7));

    return local.result;
}

<h1>ParseToken</h1>

<h2>Using ReFindNoCase</h2>
<cfdump var="#parseTokenUsingReFindNoCase("CAST:98765 (RPOS1234-XY)")#" /><br>
<cfdump var="#parseTokenUsingReFindNoCase("CAST:591498 (FUBAR56-XE)")#" /><br>
<cfdump var="#parseTokenUsingReFindNoCase("CAST:784 (RFP4542-LL)")#" /><br>

<h2>Using ReReplaceNoCase</h2>
<cfdump var="#parseTokenUsingReReplaceNoCase("CAST:98765 (RPOS1234-XY)")#" /><br>
<cfdump var="#parseTokenUsingReReplaceNoCase("CAST:591498 (FUBAR56-XE)")#" /><br>
<cfdump var="#parseTokenUsingReReplaceNoCase("CAST:784 (RFP4542-LL)")#" /><br>

ParseToken

使用 ReFindNoCase

  • 0098765
  • 0591498
  • 0000784

使用 ReReplaceNoCase

  • 0098765
  • 0591498
  • 0000784

【讨论】:

    【解决方案3】:

    它不使用 replaceNoCase,但根据您的 cmets 这将起作用:

    <cfset castTicket = projectCode>
      <!--- strip the first 5 characters, since it is always "CAST " --->
    <cfset castTicket = removechars(castTicket, 1,5)>
      <!--- now return the leftmost characters, up to the space --->
    <cfset castTicket = left(castTicket, find(" ", castTicket) )>  
      <!--- format the number so it has 7 digits (2 leading zeros in this case) --->
    <cfset castTicket = NumberFormat(castTicket, 0000000)>
    <cfoutput>#castTicket#</cfoutput>
    

    返回:

    0012345

    【讨论】:

    • 实际的数据标签是#projectCode#,所以我是否正确,您的示例中的第一行应该是:
    • 然后把第一行改成&lt;cfset string = projectCode&gt;
    • @CajunWebDev 注意 Chris 没有使用 "##" 来设置变量。当您设置变量时,几乎不需要井号
    • 我得到以下错误:Left函数的2参数,现在是0,必须是一个正整数
    • 这让我觉得数字之后和(之前没有空格...可以吗?
    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多