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)