Browse Source

Add roundDown option to ShortNumberPipe

Add optional roundDown parameter that uses Math.floor instead of
Math.round when abbreviating numbers. This prevents values like
3993979 from rounding up to 4M, showing 3.9M instead.

Also improve typing: replace any with ShortNumberArgs interface
and ensure transform always returns string.
pull/15396/head
Vladyslav_Prykhodko 6 months ago
committed by Vladyslav Prykhodko
parent
commit
9aecf0ba87
  1. 22
      ui-ngx/src/app/shared/pipe/short-number.pipe.ts

22
ui-ngx/src/app/shared/pipe/short-number.pipe.ts

@ -16,20 +16,26 @@
import { Pipe, PipeTransform } from '@angular/core';
export interface ShortNumberArgs {
long?: boolean;
roundDown?: boolean;
}
@Pipe({
name: 'shortNumber',
standalone: false
name: 'shortNumber',
standalone: false
})
export class ShortNumberPipe implements PipeTransform {
transform(number: number, args?: any): any {
if (isNaN(number)) return 0;
if (number === null) return 0;
if (number === 0) return 0;
transform(number: number, args?: ShortNumberArgs): string {
if (isNaN(number)) return '0';
if (number === null) return '0';
if (number === 0) return '0';
let abs = Math.abs(number);
const rounder = Math.pow(10, 1);
const isNegative = number < 0;
const isLong = args && args.long;
const isLong = args?.long;
const roundDown = args?.roundDown;
let key = '';
const powers = [
@ -42,7 +48,7 @@ export class ShortNumberPipe implements PipeTransform {
for (let i = 0; i < powers.length; i++) {
let reduced = abs / powers[i].value;
reduced = Math.round(reduced * rounder) / rounder;
reduced = (roundDown ? Math.floor : Math.round)(reduced * rounder) / rounder;
if (reduced >= 1) {
abs = reduced;
key = isLong ? powers[i].longKey : powers[i].key;

Loading…
Cancel
Save