概要
元はunixtimeだったり、単純な数値データなものだったりを以下のようなフォーマットにしたいことは往々にしてあります。
- 日付
- 通過
- パーセント
- 大文字に統一
AngularではPipesという機能を使うことでテンプレート上で簡単に実現できます。
ビルトインPipe
あらかじめ用意されているPipeを使ってみます。今回はCurrencyPipeを使ってみます。
期待する挙動
説明 | 結果 |
---|---|
元データ | 1980 |
結果 | ¥1,980 |
お金を表現する時はこのようにカンマ
を付けたり、¥マーク
を付けたりと地味に面倒ですが、AngularのCurrencyPipeを使うと、
<div>{{ money | currency:'JPY':'symbol' }}</div> <div>{{ money | currency:'USD':'symbol' }}</div> <div>{{ money | currency:'JPY':'' }}円</div>
と書くだけで
このように色々表現できます。簡単ですね!
以下にStackBlitzでコードを用意しているので簡単に検証できます。
カスタムPipe
自分でPipeを作ることでテンプレートを柔軟に操作することができます。
例えば文字列に括弧()
を付けるPipeを作ってみます。
また引数で全角・半角を分けられるようにします。
コード
import { Pipe, PipeTransform } from '@angular/core'; /* * Usage: * value | paren * Example: * {{ 'foo' | paren }} * formats to: '(foo)' */ @Pipe({ name: 'paren' }) export class ParenthesisPipe implements PipeTransform { transform(value: string, zenkaku: boolean = true): string { if (value === '') { return ''; } if (zenkaku) { return '(' + value + ')'; } return '(' + value + ')'; } }
こんな感じですね。全角オプションはデフォルトでtrueにしてみました。
テンプレート側は以下のように使います。
<div>{{ name | paren }}</div> <div>{{ name | paren:false }}</div>
結果
このようになります。ちゃんとオプションも使えて全角・半角がそれぞれ表現できてますね。
テストコード
テストコードは以下のように書きます。
transform()
というメソッドを使います。もしテンプレートでなく、モデル内で使いたい時はこのメソッドを使います。
import { ParenthesisPipe } from './parenthesis.pipe'; describe('ParenthesisPipe', () => { let pipe: ParenthesisPipe; beforeEach(() => { pipe = new ParenthesisPipe(); }); it('should not append paren', () => { expect(pipe.transform('', false)).toBe(''); }); it('should append zenkaku paren', () => { expect(pipe.transform('foo', true)).toBe('(foo)'); }); it('should append paren', () => { expect(pipe.transform('foo', false)).toBe('(foo)'); }); });
まとめ
AngularのPipeを使うことでテンプレートの表現が柔軟になりますし、べた書きが減ることで文言の統一もしやすく、変更したい〜となった時も簡単に済むので保守性も上がります。