通貨パイプは、string
、float
、int
などを自動的に処理できるほどスマートである必要があります。
渡された値がstring
であるかint
またはfloat
でない場合、何もせず、渡された値をそのまま表示する必要があります。また、フォーマットされた値がint
またはfloat
の場合にのみ表示されます。
それはangularJsで発生していましたが、angular(2)では発生していませんでした
string
の場合に通貨パイプをエスケープし、decimal
値の場合に通貨フォーマットを実行するように指示する方法。私は以下のようなものを期待しています。
<div>Money:{{'xxx/vv/cc' | currency:'USD':true:'1.2-2'}}</div>
はxxx/vv/cc
を表示する必要があります
<div>Money: {{''11.99'' | currency:'USD':true:'1.2-2'}}</div>
は$11.99
- $記号が含まれていることを表示する必要があります。
しかし、それは起こりません。私が得ているエラーはcaused by: Invalid argument 'Included' for pipe 'CurrencyPipe'
です
私はそれがangularjsでデフォルトで起こっていたと思いますが、angular2ではdefalutによって起こっていません。
マニュアル は、数式のみを受け入れることを明示的に示しています。
number_expression |通貨[:currencyCode [:symbolDisplay [:digitInfo]]]
パイプは 本当に単純 であり、CurrencyPipe
の代わりに拡張して使用して、予想される動作に準拠させることができます。
const _NUMBER_FORMAT_REGEXP = /^(\d+)?\.((\d+)(-(\d+))?)?$/;
@Pipe({name: 'currency'})
export class LooseCurrencyPipe extends CurrencyPipe {
transform(value: any, currencyCode: string, symbolDisplay: boolean, digits: string): string {
if (typeof value === 'number' || _NUMBER_FORMAT_REGEXP.test(value)) {
return super.transform(value, currencyCode, symbolDisplay, digits);
} else {
return value;
}
}
}
別の名前で新しいパイプを作成するには、CurrencyPipe
をカスタムパイプに挿入できます。
@Pipe({name: 'looseCurrency'})
export class LooseCurrencyPipe implements PipeTransform {
constructor(private _currencyPipe: CurrencyPipe) {}
transform(value: any, currencyCode: string, symbolDisplay: boolean, digits: string): string {
if (typeof value === 'number' || _NUMBER_FORMAT_REGEXP.test(value)) {
return this._currencyPipe.transform(value, currencyCode, symbolDisplay, digits);
} else {
return value;
}
}
}
CurrencyPipe
をDIから注入するには、モジュールプロバイダーに追加する必要があります。
declarations: [LooseCurrencyPipe, ...],
providers: [CurrencyPipe, ...],
三項演算子a ? b : c
を使用して、b
が真の場合はa
を表示できますが、それ以外の場合はc
を表示できます。
まず、値が数値の場合にtrue
を返す関数をコンポーネントに設定します。
コンポーネント
isNumber(e) {return typeof e === 'number'}
次に、それを使用して、値を通貨パイプに送信するか、直接印刷するかを決定します
テンプレート
<div>
{{ isNumber(money) ? (money|currency:'USD':true:'1.2-2') : money }}
</div>