47歳でやむなくセミリタイア

病気のためセミリタイアをすることに。現在は週20時間程度のバイトをしています。その他、雑多なことを記録として書いています。

Yii2の使い方: formatterでdecimalの末尾の0を削除する

今日も一日引きこもりです。台風が近づいているようなので、買い物しておいたほうが良いかな。

さて、セミリタイアのブログなのか疑問になってきましたが、Yii2の話題です。メモして残さないと忘れてしまうので、仕方ない。

問題点

SQLで、10進数の数字を表すdecimalというデータタイプがあるのですが、小数点以下の桁数を指定した場合、Yii2で表示すると必ずその桁数で表示ます。たとえば、小数点以下を3桁と指定すると、1は1.000、13.2は13.200という感じです。そうじゃなく、小数点以下の末尾の0を除いた、1や13.2で表示したいと思ったりします。
Yii2にはformatterという概念があり、数値の表示形式を指定できる(お金なら1200を1,200円とか)のですが、小数点以下の末尾の0を除く形式は用意されていません。

解決方法

希望のフォーマットに変換するFormatterを自作します。まず、Formatterを継承するFormatterHelperを作り、doubleに変換するasDouble関数を定義します。
(補足) 厳密には誤差を気にしないといけないのですが、実用上(小数点以下が10桁以下位までなら)これで十分です。

$ cat common/components/FormatterHelper.php
<?php

namespace common\components;

use yii\i18n\Formatter;

class FormatterHelper extends Formatter {

    public function asDouble($value) {
        return (double) $value;
    }
}

Yii2が作成したFormatterHelperを使うようcommon/config/main.phpに設定します。

    'components' => [
        'formatter' => [
            'class' => '\common\components\FormatterHelper',
        ],
    ],

使った結果

一例として、GridViewのcolumnsで使ってみます。

        'columns' => [
...
            [
                'attribute' => 'height',
                'format' => ['double'],
            ] ,
            [
                'attribute' => 'weight',
                'format' => ['double'],
            ] ,

こんな感じで0が削除されて表示されます。
f:id:ekutajp:20190908164907p:plain