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;
        }
    }

}

「isNaN」としてデータモデルに入れるIsNaNMethod.INSTANCE(または を使用してすべてのデータモデルに入れるconfig.setSharderVariable) か、単に#include-d/ #import-ed テンプレートに を使用してそれを取り込みます<#assign isNaN = "com.example.IsNaNMethod"?new()>

于 2012-06-08T14:40:30.673 に答える
0

私は現在、「回避策」を使用しています。Java コードでは、値が NaN であるかどうかを確認してから、変数を無効にします。このために、最初に型doubleからDouble型に変換する必要がありました。

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

したがってvar、非 NaN 値を持つか、null

Freemarker テンプレートでは、次のように処理します。

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

良くはありませんが、うまくいきます

于 2012-06-08T11:28:10.197 に答える