3

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

4

2 回答 2

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),或者将其放入带有.d 的#include-d/ #import-ed 模板中<#assign isNaN = "com.example.IsNaNMethod"?new()>

于 2012-06-08T14:40:30.673 回答
0

我现在正在使用“解决方法”:在 Java 代码中,我检查值是否为 NaN,然后​​使变量无效。为此,我必须先将 from 转换doubleDoubletype 。

if (Double.isNaN(var)
    var = null;

所以var要么有一个非 NaN 值,要么null

在 Freemarker 模板中,我这样处理它:

<#if var?has_content>
   ${var}
<#else>
   NaN
</#if>

不是很好,但它的工作原理

于 2012-06-08T11:28:10.197 回答