Yellowfinのカスタムフォーマッターを作って数値のマイナスを△（三角）で表示する

経理関係の資料などでマイナスの数値を「△100,000」のように表記するケースがあります。
Yellowfinでは **カスタムフォーマッター** を使えばこのような表示を実現することができます。

カスタムフォーマッター等の **Yellowfinのプラグイン** はJavaで開発します。
今回はEclipse（を日本語化した [Pleiades](https://mergedoc.osdn.jp/)）を用いています。

なお、開発方法はYellowfinのオンラインマニュアルに記載があります。
[プラグイン開発の基礎](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=10945559)
[カスタムフォーマッターの作成](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=10945478)
本記事では端折りながら進めていきますので、適宜マニュアルを参照してください。

# Javaプロジェクトの作成

新規Javaプロジェクトを作成します。Javaのバージョンは7にせよと[マニュアルに書かれている](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=10945480)ので、JREはjava7を選択しておきます。
<img width="737" alt="image001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/2e810d0c-89aa-6299-854b-eecb761f2204.png">

「次へ」をクリックし、「デフォルト出力フォルダー」を **<プロジェクト名>/ROOT/WEB-INF/classes** に変更します。
<img width="741" alt="image002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/071fdd54-43eb-60dc-1efc-8bfc6efdafae.png">

プロジェクトを右クリックし、「インポート」を選択します。
<img width="482" alt="image003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/84c09b45-033c-fe1e-d436-89dfe89094a6.png">

「ファイル・システム」を選択し、「次へ」をクリックします。
<img width="523" alt="image004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/acddf73e-9b2a-ed5e-e2eb-516b52720cbd.png">

**＜Yellowfinインストールディレクトリ＞/appserver/webapps/ROOT** に移動します。「ROOT」を選択し、「Open」をクリックします。
<img width="795" alt="image005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/3b3f6f07-b93e-c0f6-100f-591e93dd94ba.png">

ROOT配下のすべてを選択し、「拡張」項目で「Create links in workspace（ワークスペース内にリンクを作成）」チェックボックスにチェックを入れます。
<img width="856" alt="image006.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/0921826c-ca64-a08f-07c0-564588c55967.png">

# プロジェクトの構成

プロジェクトを右クリックし、メニューから「ビルド・パス」＞「ビルド・パスの構成」を選択します。
<img width="654" alt="image007.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/7cb5ef07-1987-e38f-e424-b8f4dfa468ec.png">

「ライブラリー」をクリックします。
<img width="937" alt="image008.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/299c5115-4de7-5cb4-5919-d387b35f0853.png">

「JARの追加」ボタンをクリックし、検索バーに「i4」と入力します。検索結果から「i4-core.jar」と「i4-mi.jar」を選択します。
<img width="395" alt="image009.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/d1fda54f-5968-8483-ec6d-1fa7a0c0471b.png">

srcフォルダー配下に、**META-INF** という名前で新規フォルダーを作成します。そのフォルダー配下に **services** という名前の新規フォルダーを作成します。
<img width="688" alt="image010.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/86c781dc-a86d-aff5-f8b9-c20d1986c44f.png">
<img width="374" alt="image011.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/0bc136cb-e539-d68a-f03c-e31cebbee220.png">

servicesフォルダー配下に、**com.hof.mi.interfaces.CustomFormatter** というファイルを作成します。
<img width="710" alt="image012.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/944a1fd4-a593-2b79-fea1-171e61437ddf.png">
<img width="523" alt="image013.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/ba33778d-ec9f-d74f-e7bb-32afa2db4a58.png">

作成したファイルに `com.company.yellowfin.formatters.SankakuFormatter`と記述します。これが作成するカスタムフォーマッターの完全修飾クラス名になります。
<img width="764" alt="image014.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/fa78952d-03f8-319c-ee67-441bd019a9fd.png">

# カスタムフォーマッターの作成

プロジェクトを右クリックし、「新規」＞「パッケージ」を選択します。新規パッケージの名前は **com.company.yellowfin.formatters** とします。（先ほど設定した完全修飾クラス名と合わせます）
<img width="630" alt="image015.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/eb7893ce-fcc7-78eb-a54c-d65ae8148f8c.png">
<img width="522" alt="image016.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/667477cd-3f5e-a6f4-f5aa-63b2ee4786b4.png">

作成したパッケージを右クリックし、「新規」＞「ファイル」を選択します。ファイル名は **SankakuFormatter.java** とします。（こちらも完全修飾クラス名と合わせておきます）
<img width="848" alt="image017.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/f430adcb-7176-9c97-98fa-11163fda8d4a.png">
<img width="520" alt="image018.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/232eeaae-9531-5e50-fd15-7319ecc9022a.png">

SankakuFormatter.javaに以下のコードを貼り付けます。

```java:SankakuFormatter.java
package com.company.yellowfin.formatters;
import java.text.NumberFormat;

import com.hof.mi.interfaces.CustomFormatter;

public class SankakuFormatter extends CustomFormatter {
    public String getName() {
            return "三角フォーマッター";
    }
    public boolean acceptsNativeType(int type) {
            // We only handle numeric types
            if (type == TYPE_NUMERIC) return true;
            return false;
    }
    public String render(Object value, int renderType) throws Exception {
            if (value == null) return null;
            if (renderType == RENDER_LINK) {
                  // Return a generic version of the value
                  return value.toString();
            }

    // Create a String representing the value
    NumberFormat nf = NumberFormat.getNumberInstance();
    String mark = "";
    String valStr = value.toString();
    double valNum = Double.parseDouble(valStr);
    double val = valNum;
    if (valNum < 0 ) {
    	mark = "△";
    	val = Math.abs(val);
    	}
    return mark + nf.format(val);
    }
}
```

<img width="762" alt="image019.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/28390446-4241-9233-6c91-d0239a9ffda4.png">

ちなみに、参考にした[コードの例](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=10945483)がオンラインマニュアルにあります。


# JARファイルの作成

プロジェクトを右クリックし、「エクスポート」を選択します。
<img width="530" alt="image020.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/f7db6f87-b19a-5955-21d1-f106de0b4f5a.png">

「JARファイル」を選択します。
<img width="523" alt="image021.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/6c1bfef7-85d4-cac1-95f2-c18673a8c171.png">

**.settingsとROOT以外** をすべて選択し、JARファイル名（ここでは **SankakuFormatter.jar** としました）を指定してエクスポートします。
<img width="535" alt="image022.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/e090b743-fb58-4d6b-91e9-274d300e1e99.png">

# Yellowfinに新規プラグイン追加

Yellowfinのプラグイン管理画面から、作成したJARファイルを新規プラグインとして追加します。
<img width="445" alt="image023.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/ac32e8e8-1c75-ddb1-06ab-276883a88af5.png">

# Yellowfinレポートでの使用例

今回作成したカスタムフォーマッターは **三角フォーマッター** という名前にしています。名前はSankakuFormatter.java内の **getName()** の箇所で指定しています。
このフォーマッターを使うと、マイナスの数値を「△」の記号付きの書式にすることができます。

例えば以下のような単純なデータがあったとします。
<img width="1516" alt="image024.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/96ce6b2e-17ec-302a-8ea7-1d72d1721a0b.png">

この数値に対して、書式で「三角フォーマッター」を指定します。
<img width="1021" alt="image025.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/1d73d539-78b1-dfe4-b2f0-0aa9732fcc6a.png">

すると、マイナスの数値が三角記号で表示されるようになりました！
<img width="1519" alt="image026.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/41113ee6-c773-6ccd-2179-b9578165d40c.png">

一見すると記号付きの文字列に改変されたように思えますが、実際は見かけの書式を変更しただけで、データ自体は数値型のままですので、条件付き書式を適用することも可能です。
<img width="1081" alt="image027.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/12e7e705-497d-f4e6-7cb3-ece0675e69b6.png">
<img width="1519" alt="image028.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/aad7e776-34b6-9e1c-2347-d4feca2f31dc.png">

# おまけ：今回作ったJARファイル

作成したJARファイルをGithubに置いています。よろしければご利用ください！
https://github.com/hadatuna/SankakuFormatter