FTL:如何检查字符串类型中的值是否包含数字或字符

时间:2018-04-12 05:15:55

标签: freemarker

问题: 我从列表中获取值。 List包含字符串值。 我需要检查列表的值是包含字符值还是仅包含数字。

<#assign arr =["0-200000", "200001-500000" ,"500001 & above"]/>
<#list arr as prcVal>
    <#assign vals= prcVal?split('-')/>  
    <#assign rangeStart = ""/>
        <#assign arrIndex = 0/>
    <#list vals as prcVal1>
        <#if prcVal1?index_of("& above") gt 0>
            <#assign prcVal2 = (prcVal1?split('&')[0])?trim/>
            <#if prcVal2?number gt 99>
                <#assign rangeStart = prcVal2?number?string[",000"] + ' &' + prcVal1?split('&')[1]/>
            </#if>
        <#else>
            <#if prcVal1?number gt 99>
                <#assign rangeStart = rangeStart  + prcVal1?number?string[",000"]/>
            <#else>
                <#assign rangeStart = rangeStart  + prcVal1/>
            </#if>
            <#if arrIndex == 0>
                <#assign rangeStart = rangeStart + '-'/>
            </#if>
            <#assign arrIndex = arrIndex + 1/>
        </#if>
    </#list>
    ${rangeStart}
</#list>

如果prcVal1有&#39;&amp;&#39;它会在&#34; else&#34;条件。

如果prcVal1不包含&#39;&amp;&#39;它转到&#34; else&#34;,但在那之下,我检查了&#34; #if prcVal1?number gt 99&#34;因为prcVal1包含无法转换为数字的字符,我将收到FTL错误。

id?is_number or ?is_string

我得到的这些建筑条件,但这只检查了一个值的tyoe。 例如:prcVal1="100"包含数字,但prcVal1?is_number返回false。

<#assign arr =["0-200000", "200001-500000" ,"500001 & above","test"]/>
<#list arr as prcVal>
    <#assign vals= prcVal?split('-')/>  
    <#assign rangeStart = ""/>
         <#assign arrIndex = 0/>
    <#list vals as prcVal1>
        <#if prcVal1?index_of("& above") gt 0>
            <#assign prcVal2 = (prcVal1?split('&')[0])?trim/>
            <#if prcVal2?number gt 99>
                <#assign rangeStart = prcVal2?number?string[",000"] + ' &' + prcVal1?split('&')[1]/>
            </#if>
        <#else>
            <#if prcVal1?number gt 99>
                <#assign rangeStart = rangeStart  + prcVal1?number?string[",000"]/>
            <#else>
                <#assign rangeStart = rangeStart  + prcVal1/>
            </#if>
            <#if arrIndex == 0>
                <#assign rangeStart = rangeStart + '-'/>
            </#if>
            <#assign arrIndex = arrIndex + 1/>
        </#if>
    </#list>
    ${rangeStart}
</#list>

由于输入中的测试,上面的代码抛出错误,我需要检查并跳过它。

有人可以建议我一个解决方案来检查值是否包含字符串值或数字。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用Freemarker builtin replace删除除号码以外的其他字符,例如在您的情况下可以使用

<#assign prcVal1 = prcVal1?replace("[a-zA-Z& ]+", "", "r") />

或使用\D替换所有非数字字符:

<#assign prcVal1 = prcVal1?replace("[\\D]+", "", "r") />

答案 1 :(得分:1)

目前(2.3.28)你必须使用正则表达式。这将评估为truefalse,具体取决于pcVal是否为整数(可选择-+前缀):pcVal?matches(r'[-\+]?[0-9]+') 。请注意,它不会匹配小数(例如1.5),但我想如果需要,可以从此处进一步扩展正则表达式。