aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app/shared/shared-main/angular/bytes.pipe.ts
blob: f4f473568b2f8526a303f182ccfb8cc915b4f086 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import { Pipe, PipeTransform } from '@angular/core'

// Thanks: https://github.com/danrevah/ngx-pipes/blob/master/src/ng-pipes/pipes/math/bytes.ts

@Pipe({ name: 'bytes' })
export class BytesPipe implements PipeTransform {
  private dictionary: Array<{ max: number; type: string }> = [
    { max: 1024, type: 'B' },
    { max: 1048576, type: 'KB' },
    { max: 1073741824, type: 'MB' },
    { max: 1.0995116e12, type: 'GB' }
  ]

  transform (value: number, precision?: number | undefined): string | number {
    const format = this.dictionary.find(d => value < d.max) || this.dictionary[this.dictionary.length - 1]
    const calc = value / (format.max / 1024)

    const num = precision === undefined
      ? calc
      : applyPrecision(calc, precision)

    return `${num} ${format.type}`
  }
}

function applyPrecision (num: number, precision: number) {
  if (precision <= 0) {
    return Math.round(num)
  }

  const tho = 10 ** precision

  return Math.round(num * tho) / tho
}