有没有办法检测Freemarker模板中设置为NaN的数字(java double)?
基本上我想做点什么:
<#if val?is_nan>
-
<#else>
${val}
</#if>
我尝试转换为字符串,然后检查\uFFFD
字符,但未能在此处进行正确的比较。
我的印象是我的问题来自于方式,我将数据提供给处理
Map<String, Object> root = new HashMap<String, Object>();
root.put("var", objectToRender);
template.process(root, out);
objectToRender
是我使用的数据结构。也许我需要为双重处理设置一些特殊标志?
答案 0 :(得分:1)
更新:从FreeMarker 2.3.20开始,您只需撰写val?is_nan
即可。对于旧版本,请参阅以下内容...
没有n?is_nan
,但您可以创建自己的方法,可以将其用作isNaN(n)
:
import java.util.List;
import freemarker.template.TemplateBooleanModel;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateNumberModel;
public class IsNaNMethod implements TemplateMethodModelEx {
public static final IsNaNMethod INSTANCE = new IsNaNMethod();
public Object exec(@SuppressWarnings("rawtypes") List args)
throws TemplateModelException {
if (args.size() != 1) {
throw new TemplateModelException("isNaN needs exactly 1 arguments!");
}
Object arg = args.get(0);
if (arg == null) {
throw new TemplateModelException(
"The argument to the isNaN method must not be null!");
}
if (!(arg instanceof TemplateNumberModel)) {
throw new TemplateModelException(
"The argument to the isNaN method must be a number! " +
"(The class of the value was: " + arg.getClass().getName() + ")");
}
Number n = ((TemplateNumberModel) arg).getAsNumber();
if (n instanceof Double) {
return ((Double) n).isNaN()
? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
} else if (n instanceof Float) {
return ((Float) n).isNaN()
? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
} else {
return TemplateBooleanModel.FALSE;
}
}
}
将IsNaNMethod.INSTANCE
作为“isNaN”(或带有config.setSharderVariable
的所有数据模型)放入数据模型中,或者只需将其插入#include
- d / {{ 1}} - 带#import
的ed模板。
答案 1 :(得分:0)
我现在正在使用“解决方法”:在Java代码中,我检查该值是否为NaN,然后使变量无效。为此,我必须先从double
转换为Double
类型。
if (Double.isNaN(var)
var = null;
因此var
要么具有非NaN值,要么null
在Freemarker模板中,我按照这样处理:
<#if var?has_content>
${var}
<#else>
NaN
</#if>
不好,但有效