在Freemarker中检测NaN的数值

时间:2012-06-08 09:41:02

标签: freemarker

有没有办法检测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是我使用的数据结构。也许我需要为双重处理设置一些特殊标志?

2 个答案:

答案 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>

不好,但有效