JS provides powerful number formatting with the standard built-in object Intl.NumberFormat, but we find its API a little verbose and hard to grasp its full potential. We took inspiration from older libraries like numbro.js and numeral.js and built a string based pattern for interacting with Intl.NumberFormat. Tiny footprint, no dependencies, works on the browser or nodejs.
import nf from '@tuplo/numberfmt';
// numeric
nf(123_456, '0,0.00'); // → 123,456.00
// currency
nf(123_456, '0,0GBP'); // → £123,456
// digital units
nf(123_456, '0b'); // → 120.56kb
// with locale
nf(123_456, '0,0.00', { locale: 'ar-EG' }); // → ١٢٣٬٤٥٦٫٧٩
// functional programming, partial application
const nfp = nf.partial('0,0.00');
nfp(123_456); // → 123,456.00$ npm install @tuplo/numberfmt
# or with yarn
$ yarn add @tuplo/numberfmtAn optional set of options can be provided
nf(123_456, '0,0.00', {
locale: 'ar-EG',
numberingSystem: 'arab'
}); // → ١٢٣٬٤٥٦٫٧٩
string| optional | defaults to system locale
The BCP 47 language tag for the locale actually used.
string| optional | derives from locale
Examples: arab, fullwide, hant, latn.
| Character | Meaning | |
|---|---|---|
| 0 | digit | 1 |
| . | decimal separator | 1.2 |
| , | thousands group separator | 1,234 |
| [] | optional | |
| - | negative sign | -1 |
| () | negative sign (accounting) | (123) |
| % | percentage | 95% |
| o | ordinals | 1st |
| a | compact notation (short display) | 1K |
| A | compact notation (long display) | 1 thousand |
| e | exponential (scientific) | 1E4 |
| E | exponential (engineering) | 100E3 |
| b | bits | 1.23Mb |
| B | bytes | 1.23TB |
| m | length | 1.23km |
| k | mass | 1.23kg |
| USD | currency symbol | US$1,000 |
| s | currency narrow symbol | $1,000 |
| c | currency code | USD 1,000 |
| n | currency name | 1,000 US dollars |
| Value | Format | Result | |
|---|---|---|---|
| 123456 | 0,0 | 123,456 | thousands separator |
| 1234.5 | 0,0.0 | 1,234.5 | decimal separator |
| 1234.5 | 0,0.00 | 1,234.50 | fixed number of decimal digits |
| 123 | 0[.]0 | 123 | optional decimal separator |
| 123.4 | 0[.]0 | 123.4 | |
| 123.4 | 0[.]00 | 123.40 | |
| 123.45 | 0.00[0] | 123.45 | fixed and optional decimal digits |
| 123.456 | 0.00[0] | 123.456 | |
| -1 | -0 | -1 | negative sign |
| 1 | (0) | 1 | negative sign (accounting) |
| -1 | (0) | (1) |
| Value | Format | Result |
|---|---|---|
| 1 | 0% | 100% |
| -0.12 | 0% | -12% |
| 0.12345 | 0.00% | 12.34% |
| Value | Format | Result |
|---|---|---|
| 0 | 0o | 0th |
| 1 | 0o | 1st |
| 2 | 0o | 2nd |
| 3 | 0o | 3rd |
| 4 | 0o | 4th |
| 1234 | 0,0o | 1,234th |
| Value | Format | Result | |
|---|---|---|---|
| 123 | 0a | 123 | short display |
| 1234 | 0a | 1K | |
| 12345 | 0a | 12K | |
| 123456 | 0a | 123K | |
| 1234567 | 0a | 1M | |
| 1234567890 | 0a | 1B | |
| 1234567890123 | 0a | 1T | |
| 1234 | 0A | 1 thousand | long display |
| 1234567 | 0A | 1 million | |
| 1234567890 | 0A | 1 billion | |
| 1234567890123 | 0A | 1 trillion | |
| 1234567 | 0.0a | 1.2M | combined with numeric formats |
| 1234567 | 0.0A | 1.2 million |
| Value | Format | Result | |
|---|---|---|---|
| 1 | 0e | 1E0 | scientific (order-of-magnitude) |
| 10 | 0e | 1E1 | |
| 100 | 0e | 1E2 | |
| 1000 | 0e | 1E3 | |
| 10000 | 0e | 1E4 | |
| 1 | 0E | 1E0 | engineering (exponent of ten when divisible by three) |
| 10 | 0E | 10E0 | |
| 100 | 0E | 100E0 | |
| 1000 | 0E | 1E3 | |
| 10000 | 0E | 10E3 | |
| 100000 | 0E | 100E3 | |
| 12345678 | 0.0e | 1.2E7 | combined with numeric formats |
| 12345678 | 0.0E | 12.3E6 |
| Value | Format | Result | |
|---|---|---|---|
| 1 | 0b | 1bit | bits (narrow) |
| 1024 | 0b | 1kb | |
| 1048576 | 0b | 1Mb | |
| 1073741824 | 0b | 1Gb | |
| 1099511627776 | 0b | 1Tb | |
| 1 | 0B | 1B | bytes (narrow) |
| 1024 | 0B | 1kB | |
| 1048576 | 0B | 1MB | |
| 1073741824 | 0B | 1GB | |
| 1099511627776 | 0B | 1TB | |
| 1 | 0 b | 1 bit | bits (short) |
| 1024 | 0 b | 1 kb | |
| 1 | 0 B | 1 byte | bytes (short) |
| 1024 | 0 B | 1 kB | |
| 1524 | 0b | 1.49kb | 2 fraction digits |
| 1524 | 0B | 1.49kB |
| Value | Format | Result | |
|---|---|---|---|
| 0.001 | 0m | 1mm | value in meters, formatted to closest unit (narrow) |
| 0.01 | 0m | 1cm | |
| 1 | 0m | 1m | |
| 1000 | 0m | 1km | |
| 1200 | 0m | 1.2km | |
| 0.001 | 0 m | 1 mm | (short) |
| 0.01 | 0 m | 1 cm | |
| 1 | 0 m | 1 m | |
| 1000 | 0 m | 1 km | |
| 1200 | 0 m | 1.2 km |
| Value | Format | Result | |
|---|---|---|---|
| 1 | 0k | 1kg | narrow |
| 0.001 | 0k | 1g | |
| 1.23 | 0k | 1.23kg | |
| 1 | 0 k | 1 kg | short |
| 0.001 | 0 k | 1 g | |
| 1.23 | 0 k | 1.23 kg |
| Value | Format | Result | |
|---|---|---|---|
| 123 | GBP | £123 | symbol |
| 1234 | 0,0GBP | £1,234 | |
| 1234 | 0,0.00GBP | £1,234.00 | |
| 123 | EUR | €123 | |
| 123 | JPY | JP¥123 | |
| 123 | USD | US$123 | |
| 123 | CAD | CA$123 | |
| 1000 | 0,0GBPs | £1,000 | narrow symbol |
| 1000 | 0,0EURs | €1,000 | |
| 1000 | 0,0USDs | $1,000 | |
| 1000 | 0,0CADs | $1,000 | |
| 1000 | 0,0JPYs | ¥1,000 | |
| 1000 | 0,0GBPc | GBP 1,000 | ISO currency code |
| 1000 | 0,0EURc | EUR 1,000 | |
| 1000 | 0,0USDc | USD 1,000 | |
| 1000 | 0,0JPYc | JPY 1,000 | |
| 1000 | 0,0GBPn | 1,000 British pounds | currency name |
| 1000 | 0,0EURn | 1,000 euros | |
| 1000 | 0,0USDn | 1,000 US dollars | |
| 1000 | 0,0JPYn | 1,000 Japanese yen |
MIT