Here we are creating custom pipe to format large numbers (e.g., 1,000,000 → 1M).
pipe.ts
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'largeNumberFormat'
})
export class LargeNumberFormatPipe implements PipeTransform {
transform(value: number): string {
if (value >= 1000000) { // dividing number by 10L since 1M == 10L
return (value / 1000000).toFixed(1) + 'M'; // toFixed(1) rounding till one decimal value
} else if (value >= 1000) {
return (value / 1000).toFixed(1) + 'K';
} else {
return value.toString(); // returning number itself in string format if less than thousand.
}
}
}
Usage in component.html
<p>{{ 1000000 | largeNumberFormat }}</p> // Output: 1.0M
<p>{{ 1000 | largeNumberFormat }}</p> // Output: 1.0K
<p>{{ 500 | largeNumberFormat }}</p> // Output: 500
Important: By default pipe is pure, meaning they only execute when the input value changes
. If you want the pipe to execute on every change detection cycle
, you can make it impure
by setting the pure
property to false:
@Pipe({
name: 'largeNumberFormat',
pure: false
})
When is an impure pipe useful?
An impure pipe is useful when the pipe's output depends on something other than the input value, such as:
Current time: If you want to display the time elapsed since a certain date, you would need an impure pipe to update the output every second.
Random numbers: If you want to generate a random number based on the input value, an impure pipe would be necessary.
External data: If the pipe's output depends on external data that can change outside of the component's control, an impure pipe might be necessary.
However, keep in mind that **impure pipes can have performance implications**
, as they are executed on every change detection cycle. Therefore, use them judiciously and only when necessary.
📌📌 More Angular interview related stuff here:
Rxjs and Angular bonding
Top comments (0)