The library supports parsing numbers from strings using configurable style flags.
All number formatters (DotNetIntegerFormatter, DotNetFloatFormatter, DotNetDecimalFormatter) support parsing:
import { DotNetFloatFormatter, DotNetLocaleSettings } from '@pbkware/dot-net-date-number-formatting';
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
const result = formatter.tryFromString('1,234.56');
if (result.isOk()) {
console.log(result.value); // 1234.56
} else {
console.error(result.error);
}
Control which number formats are allowed during parsing using DotNetNumberStyleFlags:
| Flag | Description |
|---|---|
allowLeadingWhite |
Permit leading whitespace |
allowTrailingWhite |
Permit trailing whitespace |
allowLeadingSign |
Permit leading +/- sign |
allowTrailingSign |
Permit trailing +/- sign |
allowParentheses |
Permit parentheses for negatives |
allowDecimalPoint |
Permit decimal point |
allowThousands |
Permit thousands separator |
allowExponent |
Permit exponential notation (e/E) |
allowCurrencySymbol |
Permit currency symbol |
allowHexSpecifier |
Parse as hexadecimal |
import { DotNetFloatFormatter, DotNetNumberStyleFlags, DotNetLocaleSettings } from '@pbkware/dot-net-date-number-formatting';
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
// Configure allowed styles using bitwise OR
formatter.styles =
DotNetNumberStyleFlags.allowLeadingWhite |
DotNetNumberStyleFlags.allowTrailingWhite |
DotNetNumberStyleFlags.allowLeadingSign |
DotNetNumberStyleFlags.allowDecimalPoint;
// These will parse successfully
let result = formatter.tryFromString(' -123.45 ');
console.log(result.value); // -123.45
result = formatter.tryFromString('+456.78');
console.log(result.value); // 456.78
// This will fail (thousands not allowed)
result = formatter.tryFromString('1,234.56');
console.log(result.isErr()); // true
Use DotNetNumberStyles for common parsing scenarios:
No special styles - only basic digits:
import { DotNetNumberStyles } from '@pbkware/dot-net-date-number-formatting';
formatter.styles = DotNetNumberStyles.none;
// Only plain integers work
formatter.tryFromString('123'); // OK
formatter.tryFromString(' 123 '); // Error
formatter.tryFromString('+123'); // Error
Basic integer parsing with sign and whitespace:
formatter.styles = DotNetNumberStyles.integer;
// Includes: allowLeadingWhite, allowTrailingWhite, allowLeadingSign
formatter.tryFromString(' -123 '); // OK: -123
formatter.tryFromString('+456'); // OK: 456
formatter.tryFromString('123.45'); // Error (no decimal)
Standard number parsing:
formatter.styles = DotNetNumberStyles.number;
// Includes: allowLeadingWhite, allowTrailingWhite, allowLeadingSign,
// allowTrailingSign, allowDecimalPoint, allowThousands
formatter.tryFromString(' 1,234.56 '); // OK: 1234.56
formatter.tryFromString('-123.45'); // OK: -123.45
formatter.tryFromString('123.45+'); // OK: 123.45
formatter.tryFromString('$123.45'); // Error (no currency)
Floating-point parsing with exponent support:
formatter.styles = DotNetNumberStyles.float;
// Includes: allowLeadingWhite, allowTrailingWhite, allowLeadingSign,
// allowDecimalPoint, allowExponent
formatter.tryFromString('1.23e+10'); // OK: 12300000000
formatter.tryFromString('-4.56E-2'); // OK: -0.0456
formatter.tryFromString('1,234.56'); // Error (no thousands)
Currency parsing:
formatter.styles = DotNetNumberStyles.currency;
// Includes: allowLeadingWhite, allowTrailingWhite, allowLeadingSign,
// allowTrailingSign, allowDecimalPoint, allowThousands,
// allowCurrencySymbol, allowParentheses
formatter.tryFromString('$1,234.56'); // OK: 1234.56
formatter.tryFromString('($1,234.56)'); // OK: -1234.56
formatter.tryFromString(' $123.45 '); // OK: 123.45
All styles allowed (except hex):
formatter.styles = DotNetNumberStyles.any;
// All of these work
formatter.tryFromString('$1,234.56'); // OK
formatter.tryFromString('($123.45)'); // OK
formatter.tryFromString('1.23e+10'); // OK
formatter.tryFromString(' +123.45- '); // OK (contradictory signs handled)
Hexadecimal parsing:
import { DotNetIntegerFormatter, DotNetNumberStyles } from '@pbkware/dot-net-date-number-formatting';
const intFormatter = new DotNetIntegerFormatter();
intFormatter.styles = DotNetNumberStyles.hexNumber;
// Includes: allowLeadingWhite, allowTrailingWhite, allowHexSpecifier
const result = intFormatter.tryFromString(' FF ');
console.log(result.value); // 255n
intFormatter.tryFromString('0x1A'); // OK: 26n (0x prefix ignored)
intFormatter.tryFromString('ABCD'); // OK: 43981n
import { DotNetFloatFormatter, DotNetNumberStyleFlags, DotNetLocaleSettings } from '@pbkware/dot-net-date-number-formatting';
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
// Configure flexible parsing using bitwise OR
formatter.styles =
DotNetNumberStyleFlags.allowLeadingWhite |
DotNetNumberStyleFlags.allowTrailingWhite |
DotNetNumberStyleFlags.allowLeadingSign |
DotNetNumberStyleFlags.allowTrailingSign |
DotNetNumberStyleFlags.allowDecimalPoint |
DotNetNumberStyleFlags.allowThousands |
DotNetNumberStyleFlags.allowParentheses;
// All these formats parse successfully
const testValues = [
'1,234.56',
' 1234.56 ',
'+1234.56',
'1234.56-',
'(1234.56)', // Negative
];
testValues.forEach(str => {
const result = formatter.tryFromString(str);
if (result.isOk()) {
console.log(`"${str}" → ${result.value}`);
}
});
import { DotNetFloatFormatter, DotNetNumberStyles, DotNetLocaleSettings } from '@pbkware/dot-net-date-number-formatting';
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
formatter.styles = DotNetNumberStyles.currency;
// Parse currency values
const values = [
'$1,234.56', // 1234.56
'($1,234.56)', // -1234.56
'$ 123.45', // 123.45
' $1,000 ', // 1000
];
values.forEach(str => {
const result = formatter.tryFromString(str);
if (result.isOk()) {
console.log(`${str} → ${result.value}`);
}
});
formatter.styles = DotNetNumberStyles.float;
const scientificValues = [
'1.23e+10', // 12300000000
'-4.56E-2', // -0.0456
'7.89E3', // 7890
'+1.0e0', // 1
];
scientificValues.forEach(str => {
const result = formatter.tryFromString(str);
if (result.isOk()) {
console.log(`${str} → ${result.value}`);
}
});
import { DotNetIntegerFormatter, DotNetNumberStyles } from '@pbkware/dot-net-date-number-formatting';
const intFormatter = new DotNetIntegerFormatter();
intFormatter.styles = DotNetNumberStyles.hexNumber;
const hexValues = [
'FF', // 255
'0x1A', // 26
'ABCD', // 43981
'100', // 256
];
hexValues.forEach(str => {
const result = intFormatter.tryFromString(str);
if (result.isOk()) {
console.log(`${str} → ${result.value}`);
}
});
Always check the result when parsing:
const formatter = new DotNetFloatFormatter();
formatter.localeSettings = DotNetLocaleSettings.createInvariant();
formatter.styles = DotNetNumberStyles.number;
const result = formatter.tryFromString('invalid');
if (result.isErr()) {
console.error('Parse failed:', result.error);
// Access parseErrorText for more details
console.error('Details:', formatter.parseErrorText);
} else {
console.log('Parsed value:', result.value);
}
Parsing respects locale settings for decimal and thousands separators:
import { DotNetFloatFormatter, DotNetNumberStyles, DotNetLocaleSettings } from '@pbkware/dot-net-date-number-formatting';
const formatter = new DotNetFloatFormatter();
formatter.styles = DotNetNumberStyles.number;
// Parse US format
formatter.localeSettings = DotNetLocaleSettings.create('en-US');
console.log(formatter.tryFromString('1,234.56').value); // 1234.56
// Parse French format (space as thousands, comma as decimal)
formatter.localeSettings = DotNetLocaleSettings.create('fr-FR');
console.log(formatter.tryFromString('1 234,56').value); // 1234.56
// Parse German format (period as thousands, comma as decimal)
formatter.localeSettings = DotNetLocaleSettings.create('de-DE');
console.log(formatter.tryFromString('1.234,56').value); // 1234.56