ftl的<td>${conclude!""}%</td>使用了!来做处理,但是遇到NaN还是不呈现0
时间: 2024-10-09 22:01:12 浏览: 17
在FreeMarker (FTL) 模板语言中,`!` 后面跟着的操作符用于安全字符串转换,它会尝试将变量转换为字符串并返回,如果转换失败(比如变量为 `null` 或无法转换),则会返回空字符串 (`""`)。在这个例子 `${conclude!""}%` 中,`conclude` 变量如果是 `NaN` 或者无法转换为数字,`!` 操作符会将其转换为空字符串,所以单元格显示的是 `%` 字符而非 `NaN%`。
然而,如果 `conclude` 实际上是一个数字,即使是 `NaN`,由于 `!` 会先尝试转换为字符串,结果仍然是 `"NaN"`,不会变成 `0%`。如果需要确保在遇到 `NaN` 时显示为 `0%`,你应该在计算 `conclude` 的时候就做这个处理,或者在模板中额外添加一个判断来覆盖这种情况,比如:
```ftl
<td#${conclude == NaN ? " result='0%'": ""}>${conclude}%</td>
```
这里用了一个嵌套的判断,如果 `conclude` 等于 `NaN`,那么插入 `result='0%'` 属性,否则直接输出比例。
相关问题
在ftl模板引擎中 <#list data as saleData> <tr style="font-size: ${(saleData.team?contains('汇总') || saleData.team?contains('汇总'))?string('28px', '26px')}; color: ${(saleData.dailySalesAmount == 0)?string("#f3f3f3", '')}; background-color: ${(saleData.dailySalesAmount == 0)?string('#4472C4', '')} ${((saleData.dailySalesAmount > 0) && (saleData.dailySalesAmount < 10000))?string('#D9E1F2', '')} ${(saleData.saleArea=='CA部门' && saleData.dailySalesAmount>0 && saleData.dailySalesAmount<50000)?string('#D9E1F2', '')} ${(saleData.team?contains('汇总')?string('#f3f3f3', ''))}; font-weight: bold"> <td>${(saleData.team)!""}</td> <td>${(saleData.name)!""}</td> <td>${(saleData.tenDailySalesAmount)!""}</td> <td>${(saleData.twelveDailySalesAmount)!""}</td> <td>${(saleData.fifteenDailySalesAmount)!""}</td> <td>${(saleData.dailySalesAmount)!""}</td> <td>${(saleData.orderCount!"")}</td> </tr> </#list> 这个代码可以怎么优化
可以将一些重复判断条件的部分提取出来,减少代码重复和冗余,同时可以使用内置函数和变量简化代码:
```
<#list data as saleData>
<#assign isSummary = saleData.team?contains('汇总')>
<#assign salesAmount = saleData.dailySalesAmount>
<#assign bgColor = (salesAmount == 0)?string('#f3f3f3', '')>
<#assign fontColor = (salesAmount == 0)?'#4472C4' : ((salesAmount > 0) && (salesAmount < 10000))? '#D9E1F2' : (saleData.saleArea == 'CA部门' && salesAmount > 0 && salesAmount < 50000)? '#D9E1F2' : ''>
<#assign fontSize = isSummary?string('28px', '26px')>
<#assign fontWeight = isSummary?string('bold', '')>
<tr style="font-size: ${fontSize}; color: ${fontColor}; background-color: ${bgColor}; font-weight: ${fontWeight}">
<td>${saleData.team!""}</td>
<td>${saleData.name!""}</td>
<td>${saleData.tenDailySalesAmount!""}</td>
<td>${saleData.twelveDailySalesAmount!""}</td>
<td>${saleData.fifteenDailySalesAmount!""}</td>
<td>${saleData.dailySalesAmount!""}</td>
<td>${saleData.orderCount!""}</td>
</tr>
</#list>
```
在这里,我们使用了内置函数 `contains()` 来判断字符串是否包含某个子串,使用 `assign` 定义变量来避免重复计算。同时,我们使用了三目运算符 `?` 简化了代码,使得整个代码更加简洁易懂。
<td style="text-align: right">${(saleData.tenDailySalesAmount!'')?int('')}</td> <td style="text-align: right">${(saleData.twelveDailySalesAmount!'')?int('')}</td> <td style="text-align: right">${(saleData.fifteenDailySalesAmount!'')?int('')}</td> <td style="text-align: right">${(saleData.dailySalesAmount!'')?int('')}</td> <td style="text-align: right">${(saleData.orderCount!'')?int('')}</td> ftl中这种写法可以吗
这种写法是 FreeMarker 模板语言中的表达式语法,可以用于将数据渲染到 HTML 页面中。这段代码中包含了一些 FreeMarker 表达式,用于将 `saleData` 对象中的一些属性显示到 HTML 页面上。
其中 `${expression}` 用于输出变量或表达式的值,`!(default_value)` 用于设置默认值,`?int` 用于将值转换为整数类型。
总的来说,这段代码是合法的 FreeMarker 表达式语法,可以在 FreeMarker 模板中使用。
阅读全文