The library provides three formatter classes for different numeric types:
DotNetIntegerFormatter - For bigint valuesDotNetFloatFormatter - For number valuesDotNetDecimalFormatter - For number values with high precisionStandard numeric format strings consist of a single format specifier and an optional precision specifier:
| Specifier | Description | Format | Example (1234.56) |
|---|---|---|---|
C |
Currency | C or C{n} |
$1,234.56 |
D |
Decimal (integers only) | D or D{n} |
1235 |
E |
Exponential | E or E{n} |
1.234560E+003 |
F |
Fixed-point | F or F{n} |
1234.56 |
G |
General | G or G{n} |
1234.56 |
N |
Number | N or N{n} |
1,234.56 |
P |
Percent | P or P{n} |
123,456.00% |
R |
Round-trip | R |
1234.56 |
X |
Hexadecimal | X or X{n} |
4D2 (for integer) |
B |
Binary | B or B{n} |
10011010010 (for integer) |
Where {n} is an optional precision specifier (number of decimal places or digits).
import { DotNetFloatFormatter, DotNetLocaleSettings } from '@pbkware/dot-net-date-number-formatting';
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
formatter.trySetFormat('C'); // Default precision (2)
console.log(formatter.toString(1234.56)); // "$1,234.56"
formatter.trySetFormat('C3'); // 3 decimal places
console.log(formatter.toString(1234.56)); // "$1,234.560"
formatter.trySetFormat('C0'); // No decimals
console.log(formatter.toString(1234.56)); // "$1,235"
For integers only. Pads with leading zeros if necessary:
import { DotNetIntegerFormatter, DotNetLocaleSettings } from '@pbkware/dot-net-date-number-formatting';
const formatter = new DotNetIntegerFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
formatter.trySetFormat('D');
console.log(formatter.toString(123n)); // "123"
formatter.trySetFormat('D8'); // Minimum 8 digits
console.log(formatter.toString(123n)); // "00000123"
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
formatter.trySetFormat('E'); // Default precision (6)
console.log(formatter.toString(1234.56)); // "1.234560E+003"
formatter.trySetFormat('E2'); // 2 decimal places
console.log(formatter.toString(1234.56)); // "1.23E+003"
formatter.trySetFormat('e3'); // Lowercase
console.log(formatter.toString(1234.56)); // "1.235e+003"
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
formatter.trySetFormat('F'); // Default precision (2)
console.log(formatter.toString(1234.56)); // "1234.56"
formatter.trySetFormat('F1'); // 1 decimal place
console.log(formatter.toString(1234.56)); // "1234.6"
formatter.trySetFormat('F4'); // 4 decimal places
console.log(formatter.toString(1234.56)); // "1234.5600"
Uses the more compact of fixed-point or scientific notation:
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
formatter.trySetFormat('G');
console.log(formatter.toString(1234.56)); // "1234.56"
console.log(formatter.toString(0.0000001)); // "1e-7"
console.log(formatter.toString(1234567890)); // "1.23456789e+9"
Includes thousands separators:
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
formatter.trySetFormat('N'); // Default precision (2)
console.log(formatter.toString(1234567.89)); // "1,234,567.89"
formatter.trySetFormat('N0'); // No decimals
console.log(formatter.toString(1234567.89)); // "1,234,568"
Multiplies by 100 and adds percent sign:
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
formatter.trySetFormat('P'); // Default precision (2)
console.log(formatter.toString(0.1234)); // "12.34%"
formatter.trySetFormat('P0'); // No decimals
console.log(formatter.toString(0.1234)); // "12%"
formatter.trySetFormat('P1'); // 1 decimal
console.log(formatter.toString(0.1234)); // "12.3%"
For integers only:
const formatter = new DotNetIntegerFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
formatter.trySetFormat('X'); // Uppercase
console.log(formatter.toString(255n)); // "FF"
formatter.trySetFormat('x'); // Lowercase
console.log(formatter.toString(255n)); // "ff"
formatter.trySetFormat('X8'); // Minimum 8 digits
console.log(formatter.toString(255n)); // "000000FF"
For integers only (.NET 8+ feature):
const formatter = new DotNetIntegerFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
formatter.trySetFormat('B');
console.log(formatter.toString(42n)); // "101010"
formatter.trySetFormat('B16'); // Minimum 16 digits
console.log(formatter.toString(42n)); // "0000000000101010"
Custom format strings provide fine-grained control over number formatting:
| Specifier | Description | Example |
|---|---|---|
0 |
Zero placeholder | 00.00 → 01.50 or 123.45 |
# |
Digit placeholder | ##.## → 1.5 or 123.45 |
. |
Decimal point | 0.00 → 1.50 |
, |
Thousands separator | #,##0 → 1,234 |
Zero Placeholder (0): Always displays a digit, using 0 if no digit is present.
Digit Placeholder (#): Only displays a digit if present, otherwise shows nothing.
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
// Zero placeholders
formatter.trySetFormat('0000.00');
console.log(formatter.toString(12.5)); // "0012.50"
console.log(formatter.toString(1234.5)); // "1234.50"
// Digit placeholders
formatter.trySetFormat('####.##');
console.log(formatter.toString(12.5)); // "12.5"
console.log(formatter.toString(1234.5)); // "1234.5"
// Thousands separator
formatter.trySetFormat('#,##0.00');
console.log(formatter.toString(1234.56)); // "1,234.56"
console.log(formatter.toString(12.56)); // "12.56"
| Specifier | Description | Example |
|---|---|---|
% |
Percentage placeholder | 0% → 50% |
‰ |
Per mille placeholder | 0‰ → 500‰ |
formatter.trySetFormat('0.00%');
console.log(formatter.toString(0.086)); // "8.60%"
formatter.trySetFormat('0.00‰');
console.log(formatter.toString(0.086)); // "86.00‰"
| Specifier | Description | Example |
|---|---|---|
E0, E+0, E-0 |
Exponential (uppercase) | 0.00E+00 → 1.23E+03 |
e0, e+0, e-0 |
Exponential (lowercase) | 0.00e+00 → 1.23e+03 |
formatter.trySetFormat('0.00E+00');
console.log(formatter.toString(1234.56)); // "1.23E+03"
formatter.trySetFormat('0.000e+00');
console.log(formatter.toString(1234.56)); // "1.235e+03"
Use semicolons to define separate formats for positive, negative, and zero values:
// Two sections: positive;negative
formatter.trySetFormat('#,##0.00;(#,##0.00)');
console.log(formatter.toString(1234.56)); // "1,234.56"
console.log(formatter.toString(-1234.56)); // "(1,234.56)"
// Three sections: positive;negative;zero
formatter.trySetFormat('#,##0.00;(#,##0.00);Zero');
console.log(formatter.toString(1234.56)); // "1,234.56"
console.log(formatter.toString(-1234.56)); // "(1,234.56)"
console.log(formatter.toString(0)); // "Zero"
Use commas at the end to scale numbers:
// Divide by thousands
formatter.trySetFormat('#,##0,');
console.log(formatter.toString(1234567)); // "1,235"
// Divide by millions
formatter.trySetFormat('#,##0,,');
console.log(formatter.toString(1234567890)); // "1,235"
| Specifier | Description | Example |
|---|---|---|
'text', "text" |
Literal string | "Value:"0 → Value:5 |
\ |
Escape character | \# → # |
formatter.trySetFormat('$#,##0.00');
console.log(formatter.toString(1234.56)); // "$1,234.56"
formatter.trySetFormat('"Total: "#,##0.00');
console.log(formatter.toString(1234.56)); // "Total: 1,234.56"
formatter.trySetFormat('\\##,##0');
console.log(formatter.toString(1234)); // "#1,234"
Number formatting respects locale settings for decimal and thousands separators:
import { DotNetFloatFormatter, DotNetLocaleSettings } from '@pbkware/dot-net-date-number-formatting';
const formatter = new DotNetFloatFormatter();
const value = 1234.56;
// US English
formatter.localeSettings = DotNetLocaleSettings.create('en-US');
formatter.trySetFormat('N2');
console.log(formatter.toString(value)); // "1,234.56"
// French
formatter.localeSettings = DotNetLocaleSettings.create('fr-FR');
formatter.trySetFormat('N2');
console.log(formatter.toString(value)); // "1 234,56"
// German
formatter.localeSettings = DotNetLocaleSettings.create('de-DE');
formatter.trySetFormat('N2');
console.log(formatter.toString(value)); // "1.234,56"