@@ -5,6 +5,10 @@ import type {FormatToSizeArgs, FormatValuesArgs} from './common';
55import { formatNumber , roundToPrecision } from './dataFormatters' ;
66
77const sizes = {
8+ noUnit : {
9+ value : 1 ,
10+ label : '' ,
11+ } ,
812 thousand : {
913 value : 1_000 ,
1014 label : i18n ( 'label_thousand' ) ,
@@ -25,43 +29,19 @@ const sizes = {
2529
2630export type Digits = keyof typeof sizes ;
2731
28- /**
29- * This function is needed to keep more than 3 digits of the same size.
30- *
31- * @param significantDigits - number of digits above 3
32- * @returns size to format value to get required number of digits
33- *
34- * By default value converted to the next size when it's above 1000,
35- * so we have 900k and 1m. To extend it additional significantDigits could be set
36- *
37- * significantDigits value added above default 3
38- *
39- * significantDigits = 1 - 9 000k and 10m
40- *
41- * significantDigits = 2 - 90 000m and 100b
42- *
43- * significantDigits = 3 - 900 000b and 1000t
44- */
45- export const getNumberWithSignificantDigits = ( value : number , significantDigits : number ) => {
46- const multiplier = 10 ** significantDigits ;
47-
48- const thousandLevel = sizes . thousand . value * multiplier ;
49- const millionLevel = sizes . million . value * multiplier ;
50- const billionLevel = sizes . billion . value * multiplier ;
51- const trillionLevel = sizes . trillion . value * multiplier ;
52-
53- let size : Digits = 'thousand' ;
54-
55- if ( value > thousandLevel ) {
32+ export const getNumberSizeUnit = ( value : number ) => {
33+ let size : Digits = 'noUnit' ;
34+
35+ if ( value >= sizes . thousand . value ) {
5636 size = 'thousand' ;
5737 }
58- if ( value >= millionLevel ) {
38+ if ( value >= sizes . million . value ) {
5939 size = 'million' ;
6040 }
61- if ( value >= billionLevel ) {
41+ if ( value >= sizes . billion . value ) {
6242 size = 'billion' ;
6343 }
64- if ( value >= trillionLevel ) {
44+ if ( value >= sizes . trillion . value ) {
6545 size = 'trillion' ;
6646 }
6747
@@ -75,17 +55,18 @@ const formatToSize = ({value, size = 'thousand', precision = 0}: FormatToSizeArg
7555} ;
7656
7757const addSizeLabel = ( result : string , size : Digits , delimiter = UNBREAKABLE_GAP ) => {
78- return result + delimiter + sizes [ size ] . label ;
58+ const label = sizes [ size ] . label ;
59+ if ( ! label ) {
60+ return result ;
61+ }
62+
63+ return result + delimiter + label ;
7964} ;
8065
81- /**
82- * @param significantDigits - number of digits above 3
83- */
8466export const formatNumberWithDigits = ( {
8567 value,
8668 size,
8769 withSizeLabel = true ,
88- significantDigits = 0 ,
8970 delimiter,
9071 ...params
9172} : FormatValuesArgs < Digits > ) => {
@@ -95,7 +76,7 @@ export const formatNumberWithDigits = ({
9576
9677 const numValue = Number ( value ) ;
9778
98- const sizeToConvert = size ?? getNumberWithSignificantDigits ( numValue , significantDigits ) ;
79+ const sizeToConvert = size ?? getNumberSizeUnit ( numValue ) ;
9980
10081 const result = formatToSize ( { value : numValue , size : sizeToConvert , ...params } ) ;
10182
0 commit comments