首页 文章

如果value是字符串而不是int或float,如何告诉angular(2)货币管道显示的情况

提问于
浏览
4

货币管道应该足够智能,以便自动处理 stringfloatint 等 .

如果传递的值是 string 或不是 intfloat ,它应该什么也不做,并按原样显示传递的值 . 并且只显示格式化的值,如果它是 intfloat .

它发生在angularJs但没有发生角度(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 .

2 回答

  • 5

    The manual明确声明它接受数字表达式而不是其他:

    number_expression |货币[:CURRENCYCODE [:symbolDisplay [:digitInfo]]]

    管道是really simple,可以扩展和使用而不是 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;
        }
      }
    }
    

    为了通过DI注入 CurrencyPipe ,还应该向模块提供者添加:

    declarations: [LooseCurrencyPipe, ...],
    providers: [CurrencyPipe, ...],
    
  • 9

    a 为真时,您可以使用三元运算符 a ? b : c 来显示 b ,否则显示 c .

    首先在组件中有一个函数,当值为数字时,该函数返回 true .

    component

    isNumber(e) {return typeof e === 'number'}
    

    然后使用它来确定是将值发送到货币管道还是直接打印

    template

    <div>
        {{ isNumber(money) ? (money|currency:'USD':true:'1.2-2') : money }}  
    </div>
    

    live demo

相关问题