【问题标题】:Display number in Million or Thousand format in angular 4以角 4 显示百万或千格式的数字
【发布时间】:2018-02-02 12:45:15
【问题描述】:

我正在尝试在我的 Angular 4 应用程序中显示数字格式。基本上我正在看的是如果这个数字是 1223 万那么它应该显示例如 12.2M(小数点后一位)

如果数字是 50,000.123,那么 50.1K

我如何以角度实现这一点。我需要写指令吗?有角的内置管道吗?

结构

export interface NpvResults  {

            captiveInsYear: number[];
            captiveInsPremiumPaid: number[];
            captiveInsTaxDeduction: number[];
            captiveInsLoanToParent: number[];
            captiveInsCapitalContribution: number[];
            captiveDividentDistribution: number[];
            captiveInsTerminalValue: number[];

        }

数组初始化为以下值

this.sourceResults.captiveInsPremiumPaid = [1,2,3,4,5];

html

<td *ngFor= "let item of NpvResults.captiveInsPremiumPaid" >{{item}}</td>

【问题讨论】:

标签: angular angular-pipe


【解决方案1】:

您可以创建 PIPE

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'thousandSuff'
})
export class ThousandSuffixesPipe implements PipeTransform {

  transform(input: any, args?: any): any {
    var exp, rounded,
      suffixes = ['k', 'M', 'G', 'T', 'P', 'E'];

    if (Number.isNaN(input)) {
      return null;
    }

    if (input < 1000) {
      return input;
    }

    exp = Math.floor(Math.log(input) / Math.log(1000));

    return (input / Math.pow(1000, exp)).toFixed(args) + suffixes[exp - 1];


  }

}

在视图中实现

{{ model | thousandSuff  }} <!-- 0 decimals -->

{{ model | thousandSuff : 2  }}  <!-- X decimals -->

结果

{{ 22600000 |千尾}} -> 23M

{{ 22600000 |千人:2 }} -> 22.60M

【讨论】:

  • 它工作得很好,但如果你有 1.565656 并使用 args 参数将数字固定到小数点后 2 位,它会执行一轮,结果是 1.6,所以要获得 1.5,你必须这样做。 return (input / Math.pow(1000, exp)).toFixed(args+1).slice(0, (args*-1)) + suffixes[exp - 1];
  • 这应该是公认的答案。
【解决方案2】:

这里我只是给你一个想法先创建
Html
{{number | shortNumber}}
您可以创建自己的custom pipe filter,在其中您可以在管道中传递您的号码,然后您可以执行如下代码,将此逻辑放入您的自定义管道中。

管道过滤器

getformat(){
    if(number == 0) {
    return 0;
}
else
{        
  // hundreds
  if(number <= 999){
    return number ;
  }
  // thousands
  else if(number >= 1000 && number <= 999999){
    return (number / 1000) + 'K';
  }
  // millions
  else if(number >= 1000000 && number <= 999999999){
    return (number / 1000000) + 'M';
  }
  // billions
  else if(number >= 1000000000 && number <= 999999999999){
    return (number / 1000000000) + 'B';
  }
  else
    return number ;
  }
}

你可以这样做。关于创建自定义管道你可以参考这个站点click here

【讨论】:

  • 这很有帮助,但数字也可能为负数。即负千、负、百万和负十亿
  • 这个管道示例将处理负数:medium.com/@thunderroid/…
【解决方案3】:

最简单的方法是制作管道和服务。您可以使用数字 js 库在服务中进行实际格式化,然后在管道中导入该服务并在转换方法中应用格式化。

import { Pipe, PipeTransform } from '@angular/core';
import { NumberFormatService } from '../utils/number-format.service';

@Pipe({
  name: 'numberFormat'
})
export class NumberFormatPipe implements PipeTransform {

  constructor(private nF: NumberFormatService) {}

  transform(value: any, args?: any): any {
    if(args == "commas"){
      return this.nF.addCommas(value);
    }
    else if(args == "kmb"){
      return this.nF.addKMB(value);
    }
    return value;
  }

}

import { Injectable } from '@angular/core';
import * as numeral from 'numeral';

@Injectable({
  providedIn: 'root'
})
export class NumberFormatService {

  constructor() { }

  public addCommas(val){
    return numeral(val).format('0,0');
  }

  public addKMB(val){
    return numeral(val).format('0[.]00a');
  }
}

html template file
{{dailyData.avgDaily | numberFormat: 'commas'}}
{{dailyData.avgDaily | numberFormat: 'kmb'}}
  1. 可以从官网link获取numeric js依赖文档。
  2. 您可以使用 npm install numeric --save 在 Angular 应用程序中安装 numericjs

【讨论】:

  • 创建服务而不是在管道本身内部执行 numeric.js 的基本原理是什么?它是否与并行执行/性能有关,或者它是否还通过服务使格式化逻辑可用于 Typescript 代码?
  • 管道基本上是在模板中使用的。创建服务的主要原因只是拆分管道和数据格式化逻辑。如果您创建一个服务,您还可以从其他组件、指令或服务本身重用该服务。但取决于您的要求,您不需要遵循任何严格的标准,我认为这不会影响任何事情。
【解决方案4】:

我写了下面的管道,它也会处理所有的负面情况(负数,字符串,空白)。 And works best in all of the cases. Complete Article here.

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'numberSuffix'
})
export class NumberSuffixPipe implements PipeTransform {
  transform(input: any, args?: any): any {
    let exp;
    const suffixes = ['K', 'M', 'B', 'T', 'P', 'E'];
    const isNagtiveValues = input < 0;
    if (Number.isNaN(input) || (input < 1000 && input >= 0) || !this.isNumeric(input) || (input < 0 && input > -1000)) {
      if (!!args && this.isNumeric(input) && !(input < 0) && input != 0) {
        return input.toFixed(args);
      } else {
        return input;
      }
    }

    if (!isNagtiveValues) {
      exp = Math.floor(Math.log(input) / Math.log(1000));

      return (input / Math.pow(1000, exp)).toFixed(args) + suffixes[exp - 1];
    } else {
      input = input * -1;

      exp = Math.floor(Math.log(input) / Math.log(1000));

      return (input * -1 / Math.pow(1000, exp)).toFixed(args) + suffixes[exp - 1];
    }
  }
  isNumeric(value): boolean {
    if (value < 0) value = value * -1;
    if (/^-{0,1}\d+$/.test(value)) {
      return true;
    } else if (/^\d+\.\d+$/.test(value)) {
      return true;
    } else {
      return false;
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多