@internationalized/number 3.6.8 → 3.6.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/private/NumberFormatter.cjs +0 -42
- package/dist/private/NumberFormatter.cjs.map +1 -1
- package/dist/private/NumberFormatter.js +0 -44
- package/dist/private/NumberFormatter.js.map +1 -1
- package/dist/private/NumberFormatter.mjs +0 -42
- package/dist/private/NumberFormatter.mjs.map +1 -1
- package/package.json +2 -2
- package/src/NumberFormatter.ts +0 -53
|
@@ -22,27 +22,6 @@ try {
|
|
|
22
22
|
}).resolvedOptions().signDisplay === 'exceptZero';
|
|
23
23
|
// eslint-disable-next-line no-empty
|
|
24
24
|
} catch {}
|
|
25
|
-
let $7fe67f77592add0a$var$supportsUnit = false;
|
|
26
|
-
try {
|
|
27
|
-
$7fe67f77592add0a$var$supportsUnit = new Intl.NumberFormat('de-DE', {
|
|
28
|
-
style: 'unit',
|
|
29
|
-
unit: 'degree'
|
|
30
|
-
}).resolvedOptions().style === 'unit';
|
|
31
|
-
// eslint-disable-next-line no-empty
|
|
32
|
-
} catch {}
|
|
33
|
-
// Polyfill for units since Safari doesn't support them yet. See https://bugs.webkit.org/show_bug.cgi?id=215438.
|
|
34
|
-
// Currently only polyfilling the unit degree in narrow format for ColorSlider in our supported locales.
|
|
35
|
-
// Values were determined by switching to each locale manually in Chrome.
|
|
36
|
-
const $7fe67f77592add0a$var$UNITS = {
|
|
37
|
-
degree: {
|
|
38
|
-
narrow: {
|
|
39
|
-
default: "\xb0",
|
|
40
|
-
'ja-JP': " \u5EA6",
|
|
41
|
-
'zh-TW': "\u5EA6",
|
|
42
|
-
'sl-SI': " \xb0"
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
25
|
class $7fe67f77592add0a$export$cc77c4ff7e8673c5 {
|
|
47
26
|
constructor(locale, options = {}){
|
|
48
27
|
this.numberFormatter = $7fe67f77592add0a$var$getCachedNumberFormatter(locale, options);
|
|
@@ -55,12 +34,6 @@ class $7fe67f77592add0a$export$cc77c4ff7e8673c5 {
|
|
|
55
34
|
let res = '';
|
|
56
35
|
if (!$7fe67f77592add0a$var$supportsSignDisplay && this.options.signDisplay != null) res = $7fe67f77592add0a$export$711b50b3c525e0f2(this.numberFormatter, this.options.signDisplay, value);
|
|
57
36
|
else res = this.numberFormatter.format(value);
|
|
58
|
-
if (this.options.style === 'unit' && !$7fe67f77592add0a$var$supportsUnit) {
|
|
59
|
-
let { unit: unit, unitDisplay: unitDisplay = 'short', locale: locale } = this.resolvedOptions();
|
|
60
|
-
if (!unit) return res;
|
|
61
|
-
let values = $7fe67f77592add0a$var$UNITS[unit]?.[unitDisplay];
|
|
62
|
-
res += values[locale] || values.default;
|
|
63
|
-
}
|
|
64
37
|
return res;
|
|
65
38
|
}
|
|
66
39
|
/** Formats a number to an array of parts such as separators, digits, punctuation, and more. */ formatToParts(value) {
|
|
@@ -100,12 +73,6 @@ class $7fe67f77592add0a$export$cc77c4ff7e8673c5 {
|
|
|
100
73
|
...options,
|
|
101
74
|
signDisplay: this.options.signDisplay
|
|
102
75
|
};
|
|
103
|
-
if (!$7fe67f77592add0a$var$supportsUnit && this.options.style === 'unit') options = {
|
|
104
|
-
...options,
|
|
105
|
-
style: 'unit',
|
|
106
|
-
unit: this.options.unit,
|
|
107
|
-
unitDisplay: this.options.unitDisplay
|
|
108
|
-
};
|
|
109
76
|
return options;
|
|
110
77
|
}
|
|
111
78
|
}
|
|
@@ -115,15 +82,6 @@ function $7fe67f77592add0a$var$getCachedNumberFormatter(locale, options = {}) {
|
|
|
115
82
|
if (!locale.includes('-u-')) locale += '-u-';
|
|
116
83
|
locale += `-nu-${numberingSystem}`;
|
|
117
84
|
}
|
|
118
|
-
if (options.style === 'unit' && !$7fe67f77592add0a$var$supportsUnit) {
|
|
119
|
-
let { unit: unit, unitDisplay: unitDisplay = 'short' } = options;
|
|
120
|
-
if (!unit) throw new Error('unit option must be provided with style: "unit"');
|
|
121
|
-
if (!$7fe67f77592add0a$var$UNITS[unit]?.[unitDisplay]) throw new Error(`Unsupported unit ${unit} with unitDisplay = ${unitDisplay}`);
|
|
122
|
-
options = {
|
|
123
|
-
...options,
|
|
124
|
-
style: 'decimal'
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
85
|
let cacheKey = locale + (options ? Object.entries(options).sort((a, b)=>a[0] < b[0] ? -1 : 1).join() : '');
|
|
128
86
|
if ($7fe67f77592add0a$var$formatterCache.has(cacheKey)) return $7fe67f77592add0a$var$formatterCache.get(cacheKey);
|
|
129
87
|
let numberFormatter = new Intl.NumberFormat(locale, options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["packages/@internationalized/number/src/NumberFormatter.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nlet formatterCache = new Map<string, Intl.NumberFormat>();\n\nlet supportsSignDisplay = false;\ntry {\n supportsSignDisplay =\n new Intl.NumberFormat('de-DE', {signDisplay: 'exceptZero'}).resolvedOptions().signDisplay ===\n 'exceptZero';\n // eslint-disable-next-line no-empty\n} catch {}\n\nlet supportsUnit = false;\ntry {\n supportsUnit =\n new Intl.NumberFormat('de-DE', {style: 'unit', unit: 'degree'}).resolvedOptions().style ===\n 'unit';\n // eslint-disable-next-line no-empty\n} catch {}\n\n// Polyfill for units since Safari doesn't support them yet. See https://bugs.webkit.org/show_bug.cgi?id=215438.\n// Currently only polyfilling the unit degree in narrow format for ColorSlider in our supported locales.\n// Values were determined by switching to each locale manually in Chrome.\nconst UNITS = {\n degree: {\n narrow: {\n default: '°',\n 'ja-JP': ' 度',\n 'zh-TW': '度',\n 'sl-SI': ' °'\n // Arabic?? But Safari already doesn't use Arabic digits so might be ok...\n // https://bugs.webkit.org/show_bug.cgi?id=218139\n }\n }\n};\n\nexport interface NumberFormatOptions extends Intl.NumberFormatOptions {\n /** Overrides default numbering system for the current locale. */\n numberingSystem?: string;\n}\n\n/**\n * A wrapper around Intl.NumberFormat providing additional options, polyfills, and caching for\n * performance.\n */\nexport class NumberFormatter implements Intl.NumberFormat {\n private numberFormatter: Intl.NumberFormat;\n private options: NumberFormatOptions;\n\n constructor(locale: string, options: NumberFormatOptions = {}) {\n this.numberFormatter = getCachedNumberFormatter(locale, options);\n this.options = options;\n }\n\n /**\n * Formats a number value as a string, according to the locale and options provided to the\n * constructor.\n */\n format(value: number): string {\n let res = '';\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n res = numberFormatSignDisplayPolyfill(this.numberFormatter, this.options.signDisplay, value);\n } else {\n res = this.numberFormatter.format(value);\n }\n\n if (this.options.style === 'unit' && !supportsUnit) {\n let {unit, unitDisplay = 'short', locale} = this.resolvedOptions();\n if (!unit) {\n return res;\n }\n let values = UNITS[unit]?.[unitDisplay];\n res += values[locale] || values.default;\n }\n\n return res;\n }\n\n /** Formats a number to an array of parts such as separators, digits, punctuation, and more. */\n formatToParts(value: number): Intl.NumberFormatPart[] {\n // TODO: implement signDisplay for formatToParts\n return this.numberFormatter.formatToParts(value);\n }\n\n /** Formats a number range as a string. */\n formatRange(start: number, end: number): string {\n if (typeof this.numberFormatter.formatRange === 'function') {\n return this.numberFormatter.formatRange(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n // Very basic fallback for old browsers.\n return `${this.format(start)} – ${this.format(end)}`;\n }\n\n /** Formats a number range as an array of parts. */\n formatRangeToParts(start: number, end: number): Intl.NumberRangeFormatPart[] {\n if (typeof this.numberFormatter.formatRangeToParts === 'function') {\n return this.numberFormatter.formatRangeToParts(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n let startParts = this.numberFormatter.formatToParts(start);\n let endParts = this.numberFormatter.formatToParts(end);\n return [\n ...startParts.map(p => ({...p, source: 'startRange'}) as Intl.NumberRangeFormatPart),\n {type: 'literal', value: ' – ', source: 'shared'},\n ...endParts.map(p => ({...p, source: 'endRange'}) as Intl.NumberRangeFormatPart)\n ];\n }\n\n /** Returns the resolved formatting options based on the values passed to the constructor. */\n resolvedOptions(): Intl.ResolvedNumberFormatOptions {\n let options = this.numberFormatter.resolvedOptions();\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n options = {...options, signDisplay: this.options.signDisplay};\n }\n\n if (!supportsUnit && this.options.style === 'unit') {\n options = {\n ...options,\n style: 'unit',\n unit: this.options.unit,\n unitDisplay: this.options.unitDisplay\n };\n }\n\n return options;\n }\n}\n\nfunction getCachedNumberFormatter(\n locale: string,\n options: NumberFormatOptions = {}\n): Intl.NumberFormat {\n let {numberingSystem} = options;\n if (numberingSystem && locale.includes('-nu-')) {\n if (!locale.includes('-u-')) {\n locale += '-u-';\n }\n locale += `-nu-${numberingSystem}`;\n }\n\n if (options.style === 'unit' && !supportsUnit) {\n let {unit, unitDisplay = 'short'} = options;\n if (!unit) {\n throw new Error('unit option must be provided with style: \"unit\"');\n }\n if (!UNITS[unit]?.[unitDisplay]) {\n throw new Error(`Unsupported unit ${unit} with unitDisplay = ${unitDisplay}`);\n }\n options = {...options, style: 'decimal'};\n }\n\n let cacheKey =\n locale +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : '');\n if (formatterCache.has(cacheKey)) {\n return formatterCache.get(cacheKey)!;\n }\n\n let numberFormatter = new Intl.NumberFormat(locale, options);\n formatterCache.set(cacheKey, numberFormatter);\n return numberFormatter;\n}\n\n/** @private - Exported for tests */\nexport function numberFormatSignDisplayPolyfill(\n numberFormat: Intl.NumberFormat,\n signDisplay: string,\n num: number\n): string {\n if (signDisplay === 'auto') {\n return numberFormat.format(num);\n } else if (signDisplay === 'never') {\n return numberFormat.format(Math.abs(num));\n } else {\n let needsPositiveSign = false;\n if (signDisplay === 'always') {\n needsPositiveSign = num > 0 || Object.is(num, 0);\n } else if (signDisplay === 'exceptZero') {\n if (Object.is(num, -0) || Object.is(num, 0)) {\n num = Math.abs(num);\n } else {\n needsPositiveSign = num > 0;\n }\n }\n\n if (needsPositiveSign) {\n let negative = numberFormat.format(-num);\n let noSign = numberFormat.format(num);\n // ignore RTL/LTR marker character\n let minus = negative.replace(noSign, '').replace(/\\u200e|\\u061C/, '');\n if ([...minus].length !== 1) {\n console.warn('@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case');\n }\n let positive = negative.replace(noSign, '!!!').replace(minus, '+').replace('!!!', noSign);\n return positive;\n } else {\n return numberFormat.format(num);\n }\n }\n}\n"],"names":[],"version":3,"file":"NumberFormatter.cjs.map"}
|
|
1
|
+
{"mappings":"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","sources":["packages/@internationalized/number/src/NumberFormatter.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nlet formatterCache = new Map<string, Intl.NumberFormat>();\n\nlet supportsSignDisplay = false;\ntry {\n supportsSignDisplay =\n new Intl.NumberFormat('de-DE', {signDisplay: 'exceptZero'}).resolvedOptions().signDisplay ===\n 'exceptZero';\n // eslint-disable-next-line no-empty\n} catch {}\n\nexport interface NumberFormatOptions extends Intl.NumberFormatOptions {\n /** Overrides default numbering system for the current locale. */\n numberingSystem?: string;\n}\n\n/**\n * A wrapper around Intl.NumberFormat providing additional options, polyfills, and caching for\n * performance.\n */\nexport class NumberFormatter implements Intl.NumberFormat {\n private numberFormatter: Intl.NumberFormat;\n private options: NumberFormatOptions;\n\n constructor(locale: string, options: NumberFormatOptions = {}) {\n this.numberFormatter = getCachedNumberFormatter(locale, options);\n this.options = options;\n }\n\n /**\n * Formats a number value as a string, according to the locale and options provided to the\n * constructor.\n */\n format(value: number): string {\n let res = '';\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n res = numberFormatSignDisplayPolyfill(this.numberFormatter, this.options.signDisplay, value);\n } else {\n res = this.numberFormatter.format(value);\n }\n\n return res;\n }\n\n /** Formats a number to an array of parts such as separators, digits, punctuation, and more. */\n formatToParts(value: number): Intl.NumberFormatPart[] {\n // TODO: implement signDisplay for formatToParts\n return this.numberFormatter.formatToParts(value);\n }\n\n /** Formats a number range as a string. */\n formatRange(start: number, end: number): string {\n if (typeof this.numberFormatter.formatRange === 'function') {\n return this.numberFormatter.formatRange(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n // Very basic fallback for old browsers.\n return `${this.format(start)} – ${this.format(end)}`;\n }\n\n /** Formats a number range as an array of parts. */\n formatRangeToParts(start: number, end: number): Intl.NumberRangeFormatPart[] {\n if (typeof this.numberFormatter.formatRangeToParts === 'function') {\n return this.numberFormatter.formatRangeToParts(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n let startParts = this.numberFormatter.formatToParts(start);\n let endParts = this.numberFormatter.formatToParts(end);\n return [\n ...startParts.map(p => ({...p, source: 'startRange'}) as Intl.NumberRangeFormatPart),\n {type: 'literal', value: ' – ', source: 'shared'},\n ...endParts.map(p => ({...p, source: 'endRange'}) as Intl.NumberRangeFormatPart)\n ];\n }\n\n /** Returns the resolved formatting options based on the values passed to the constructor. */\n resolvedOptions(): Intl.ResolvedNumberFormatOptions {\n let options = this.numberFormatter.resolvedOptions();\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n options = {...options, signDisplay: this.options.signDisplay};\n }\n\n return options;\n }\n}\n\nfunction getCachedNumberFormatter(\n locale: string,\n options: NumberFormatOptions = {}\n): Intl.NumberFormat {\n let {numberingSystem} = options;\n if (numberingSystem && locale.includes('-nu-')) {\n if (!locale.includes('-u-')) {\n locale += '-u-';\n }\n locale += `-nu-${numberingSystem}`;\n }\n\n let cacheKey =\n locale +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : '');\n if (formatterCache.has(cacheKey)) {\n return formatterCache.get(cacheKey)!;\n }\n\n let numberFormatter = new Intl.NumberFormat(locale, options);\n formatterCache.set(cacheKey, numberFormatter);\n return numberFormatter;\n}\n\n/** @private - Exported for tests */\nexport function numberFormatSignDisplayPolyfill(\n numberFormat: Intl.NumberFormat,\n signDisplay: string,\n num: number\n): string {\n if (signDisplay === 'auto') {\n return numberFormat.format(num);\n } else if (signDisplay === 'never') {\n return numberFormat.format(Math.abs(num));\n } else {\n let needsPositiveSign = false;\n if (signDisplay === 'always') {\n needsPositiveSign = num > 0 || Object.is(num, 0);\n } else if (signDisplay === 'exceptZero') {\n if (Object.is(num, -0) || Object.is(num, 0)) {\n num = Math.abs(num);\n } else {\n needsPositiveSign = num > 0;\n }\n }\n\n if (needsPositiveSign) {\n let negative = numberFormat.format(-num);\n let noSign = numberFormat.format(num);\n // ignore RTL/LTR marker character\n let minus = negative.replace(noSign, '').replace(/\\u200e|\\u061C/, '');\n if ([...minus].length !== 1) {\n console.warn('@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case');\n }\n let positive = negative.replace(noSign, '!!!').replace(minus, '+').replace('!!!', noSign);\n return positive;\n } else {\n return numberFormat.format(num);\n }\n }\n}\n"],"names":[],"version":3,"file":"NumberFormatter.cjs.map"}
|
|
@@ -16,27 +16,6 @@ try {
|
|
|
16
16
|
}).resolvedOptions().signDisplay === 'exceptZero';
|
|
17
17
|
// eslint-disable-next-line no-empty
|
|
18
18
|
} catch {}
|
|
19
|
-
let $6c0bb0183c96ba81$var$supportsUnit = false;
|
|
20
|
-
try {
|
|
21
|
-
$6c0bb0183c96ba81$var$supportsUnit = new Intl.NumberFormat('de-DE', {
|
|
22
|
-
style: 'unit',
|
|
23
|
-
unit: 'degree'
|
|
24
|
-
}).resolvedOptions().style === 'unit';
|
|
25
|
-
// eslint-disable-next-line no-empty
|
|
26
|
-
} catch {}
|
|
27
|
-
// Polyfill for units since Safari doesn't support them yet. See https://bugs.webkit.org/show_bug.cgi?id=215438.
|
|
28
|
-
// Currently only polyfilling the unit degree in narrow format for ColorSlider in our supported locales.
|
|
29
|
-
// Values were determined by switching to each locale manually in Chrome.
|
|
30
|
-
const $6c0bb0183c96ba81$var$UNITS = {
|
|
31
|
-
degree: {
|
|
32
|
-
narrow: {
|
|
33
|
-
default: "\xb0",
|
|
34
|
-
'ja-JP': " \u5EA6",
|
|
35
|
-
'zh-TW': "\u5EA6",
|
|
36
|
-
'sl-SI': " \xb0"
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
19
|
class $6c0bb0183c96ba81$export$cc77c4ff7e8673c5 {
|
|
41
20
|
/**
|
|
42
21
|
* Formats a number value as a string, according to the locale and options provided to the
|
|
@@ -45,13 +24,6 @@ class $6c0bb0183c96ba81$export$cc77c4ff7e8673c5 {
|
|
|
45
24
|
let res = '';
|
|
46
25
|
if (!$6c0bb0183c96ba81$var$supportsSignDisplay && this.options.signDisplay != null) res = $6c0bb0183c96ba81$export$711b50b3c525e0f2(this.numberFormatter, this.options.signDisplay, value);
|
|
47
26
|
else res = this.numberFormatter.format(value);
|
|
48
|
-
if (this.options.style === 'unit' && !$6c0bb0183c96ba81$var$supportsUnit) {
|
|
49
|
-
var _UNITS_unit;
|
|
50
|
-
let { unit: unit, unitDisplay: unitDisplay = 'short', locale: locale } = this.resolvedOptions();
|
|
51
|
-
if (!unit) return res;
|
|
52
|
-
let values = (_UNITS_unit = $6c0bb0183c96ba81$var$UNITS[unit]) === null || _UNITS_unit === void 0 ? void 0 : _UNITS_unit[unitDisplay];
|
|
53
|
-
res += values[locale] || values.default;
|
|
54
|
-
}
|
|
55
27
|
return res;
|
|
56
28
|
}
|
|
57
29
|
/** Formats a number to an array of parts such as separators, digits, punctuation, and more. */ formatToParts(value) {
|
|
@@ -91,12 +63,6 @@ class $6c0bb0183c96ba81$export$cc77c4ff7e8673c5 {
|
|
|
91
63
|
...options,
|
|
92
64
|
signDisplay: this.options.signDisplay
|
|
93
65
|
};
|
|
94
|
-
if (!$6c0bb0183c96ba81$var$supportsUnit && this.options.style === 'unit') options = {
|
|
95
|
-
...options,
|
|
96
|
-
style: 'unit',
|
|
97
|
-
unit: this.options.unit,
|
|
98
|
-
unitDisplay: this.options.unitDisplay
|
|
99
|
-
};
|
|
100
66
|
return options;
|
|
101
67
|
}
|
|
102
68
|
constructor(locale, options = {}){
|
|
@@ -110,16 +76,6 @@ function $6c0bb0183c96ba81$var$getCachedNumberFormatter(locale, options = {}) {
|
|
|
110
76
|
if (!locale.includes('-u-')) locale += '-u-';
|
|
111
77
|
locale += `-nu-${numberingSystem}`;
|
|
112
78
|
}
|
|
113
|
-
if (options.style === 'unit' && !$6c0bb0183c96ba81$var$supportsUnit) {
|
|
114
|
-
var _UNITS_unit;
|
|
115
|
-
let { unit: unit, unitDisplay: unitDisplay = 'short' } = options;
|
|
116
|
-
if (!unit) throw new Error('unit option must be provided with style: "unit"');
|
|
117
|
-
if (!((_UNITS_unit = $6c0bb0183c96ba81$var$UNITS[unit]) === null || _UNITS_unit === void 0 ? void 0 : _UNITS_unit[unitDisplay])) throw new Error(`Unsupported unit ${unit} with unitDisplay = ${unitDisplay}`);
|
|
118
|
-
options = {
|
|
119
|
-
...options,
|
|
120
|
-
style: 'decimal'
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
79
|
let cacheKey = locale + (options ? Object.entries(options).sort((a, b)=>a[0] < b[0] ? -1 : 1).join() : '');
|
|
124
80
|
if ($6c0bb0183c96ba81$var$formatterCache.has(cacheKey)) return $6c0bb0183c96ba81$var$formatterCache.get(cacheKey);
|
|
125
81
|
let numberFormatter = new Intl.NumberFormat(locale, options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["packages/@internationalized/number/src/NumberFormatter.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nlet formatterCache = new Map<string, Intl.NumberFormat>();\n\nlet supportsSignDisplay = false;\ntry {\n supportsSignDisplay =\n new Intl.NumberFormat('de-DE', {signDisplay: 'exceptZero'}).resolvedOptions().signDisplay ===\n 'exceptZero';\n // eslint-disable-next-line no-empty\n} catch {}\n\nlet supportsUnit = false;\ntry {\n supportsUnit =\n new Intl.NumberFormat('de-DE', {style: 'unit', unit: 'degree'}).resolvedOptions().style ===\n 'unit';\n // eslint-disable-next-line no-empty\n} catch {}\n\n// Polyfill for units since Safari doesn't support them yet. See https://bugs.webkit.org/show_bug.cgi?id=215438.\n// Currently only polyfilling the unit degree in narrow format for ColorSlider in our supported locales.\n// Values were determined by switching to each locale manually in Chrome.\nconst UNITS = {\n degree: {\n narrow: {\n default: '°',\n 'ja-JP': ' 度',\n 'zh-TW': '度',\n 'sl-SI': ' °'\n // Arabic?? But Safari already doesn't use Arabic digits so might be ok...\n // https://bugs.webkit.org/show_bug.cgi?id=218139\n }\n }\n};\n\nexport interface NumberFormatOptions extends Intl.NumberFormatOptions {\n /** Overrides default numbering system for the current locale. */\n numberingSystem?: string;\n}\n\n/**\n * A wrapper around Intl.NumberFormat providing additional options, polyfills, and caching for\n * performance.\n */\nexport class NumberFormatter implements Intl.NumberFormat {\n private numberFormatter: Intl.NumberFormat;\n private options: NumberFormatOptions;\n\n constructor(locale: string, options: NumberFormatOptions = {}) {\n this.numberFormatter = getCachedNumberFormatter(locale, options);\n this.options = options;\n }\n\n /**\n * Formats a number value as a string, according to the locale and options provided to the\n * constructor.\n */\n format(value: number): string {\n let res = '';\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n res = numberFormatSignDisplayPolyfill(this.numberFormatter, this.options.signDisplay, value);\n } else {\n res = this.numberFormatter.format(value);\n }\n\n if (this.options.style === 'unit' && !supportsUnit) {\n let {unit, unitDisplay = 'short', locale} = this.resolvedOptions();\n if (!unit) {\n return res;\n }\n let values = UNITS[unit]?.[unitDisplay];\n res += values[locale] || values.default;\n }\n\n return res;\n }\n\n /** Formats a number to an array of parts such as separators, digits, punctuation, and more. */\n formatToParts(value: number): Intl.NumberFormatPart[] {\n // TODO: implement signDisplay for formatToParts\n return this.numberFormatter.formatToParts(value);\n }\n\n /** Formats a number range as a string. */\n formatRange(start: number, end: number): string {\n if (typeof this.numberFormatter.formatRange === 'function') {\n return this.numberFormatter.formatRange(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n // Very basic fallback for old browsers.\n return `${this.format(start)} – ${this.format(end)}`;\n }\n\n /** Formats a number range as an array of parts. */\n formatRangeToParts(start: number, end: number): Intl.NumberRangeFormatPart[] {\n if (typeof this.numberFormatter.formatRangeToParts === 'function') {\n return this.numberFormatter.formatRangeToParts(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n let startParts = this.numberFormatter.formatToParts(start);\n let endParts = this.numberFormatter.formatToParts(end);\n return [\n ...startParts.map(p => ({...p, source: 'startRange'}) as Intl.NumberRangeFormatPart),\n {type: 'literal', value: ' – ', source: 'shared'},\n ...endParts.map(p => ({...p, source: 'endRange'}) as Intl.NumberRangeFormatPart)\n ];\n }\n\n /** Returns the resolved formatting options based on the values passed to the constructor. */\n resolvedOptions(): Intl.ResolvedNumberFormatOptions {\n let options = this.numberFormatter.resolvedOptions();\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n options = {...options, signDisplay: this.options.signDisplay};\n }\n\n if (!supportsUnit && this.options.style === 'unit') {\n options = {\n ...options,\n style: 'unit',\n unit: this.options.unit,\n unitDisplay: this.options.unitDisplay\n };\n }\n\n return options;\n }\n}\n\nfunction getCachedNumberFormatter(\n locale: string,\n options: NumberFormatOptions = {}\n): Intl.NumberFormat {\n let {numberingSystem} = options;\n if (numberingSystem && locale.includes('-nu-')) {\n if (!locale.includes('-u-')) {\n locale += '-u-';\n }\n locale += `-nu-${numberingSystem}`;\n }\n\n if (options.style === 'unit' && !supportsUnit) {\n let {unit, unitDisplay = 'short'} = options;\n if (!unit) {\n throw new Error('unit option must be provided with style: \"unit\"');\n }\n if (!UNITS[unit]?.[unitDisplay]) {\n throw new Error(`Unsupported unit ${unit} with unitDisplay = ${unitDisplay}`);\n }\n options = {...options, style: 'decimal'};\n }\n\n let cacheKey =\n locale +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : '');\n if (formatterCache.has(cacheKey)) {\n return formatterCache.get(cacheKey)!;\n }\n\n let numberFormatter = new Intl.NumberFormat(locale, options);\n formatterCache.set(cacheKey, numberFormatter);\n return numberFormatter;\n}\n\n/** @private - Exported for tests */\nexport function numberFormatSignDisplayPolyfill(\n numberFormat: Intl.NumberFormat,\n signDisplay: string,\n num: number\n): string {\n if (signDisplay === 'auto') {\n return numberFormat.format(num);\n } else if (signDisplay === 'never') {\n return numberFormat.format(Math.abs(num));\n } else {\n let needsPositiveSign = false;\n if (signDisplay === 'always') {\n needsPositiveSign = num > 0 || Object.is(num, 0);\n } else if (signDisplay === 'exceptZero') {\n if (Object.is(num, -0) || Object.is(num, 0)) {\n num = Math.abs(num);\n } else {\n needsPositiveSign = num > 0;\n }\n }\n\n if (needsPositiveSign) {\n let negative = numberFormat.format(-num);\n let noSign = numberFormat.format(num);\n // ignore RTL/LTR marker character\n let minus = negative.replace(noSign, '').replace(/\\u200e|\\u061C/, '');\n if ([...minus].length !== 1) {\n console.warn('@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case');\n }\n let positive = negative.replace(noSign, '!!!').replace(minus, '+').replace('!!!', noSign);\n return positive;\n } else {\n return numberFormat.format(num);\n }\n }\n}\n"],"names":[],"version":3,"file":"NumberFormatter.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["packages/@internationalized/number/src/NumberFormatter.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nlet formatterCache = new Map<string, Intl.NumberFormat>();\n\nlet supportsSignDisplay = false;\ntry {\n supportsSignDisplay =\n new Intl.NumberFormat('de-DE', {signDisplay: 'exceptZero'}).resolvedOptions().signDisplay ===\n 'exceptZero';\n // eslint-disable-next-line no-empty\n} catch {}\n\nexport interface NumberFormatOptions extends Intl.NumberFormatOptions {\n /** Overrides default numbering system for the current locale. */\n numberingSystem?: string;\n}\n\n/**\n * A wrapper around Intl.NumberFormat providing additional options, polyfills, and caching for\n * performance.\n */\nexport class NumberFormatter implements Intl.NumberFormat {\n private numberFormatter: Intl.NumberFormat;\n private options: NumberFormatOptions;\n\n constructor(locale: string, options: NumberFormatOptions = {}) {\n this.numberFormatter = getCachedNumberFormatter(locale, options);\n this.options = options;\n }\n\n /**\n * Formats a number value as a string, according to the locale and options provided to the\n * constructor.\n */\n format(value: number): string {\n let res = '';\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n res = numberFormatSignDisplayPolyfill(this.numberFormatter, this.options.signDisplay, value);\n } else {\n res = this.numberFormatter.format(value);\n }\n\n return res;\n }\n\n /** Formats a number to an array of parts such as separators, digits, punctuation, and more. */\n formatToParts(value: number): Intl.NumberFormatPart[] {\n // TODO: implement signDisplay for formatToParts\n return this.numberFormatter.formatToParts(value);\n }\n\n /** Formats a number range as a string. */\n formatRange(start: number, end: number): string {\n if (typeof this.numberFormatter.formatRange === 'function') {\n return this.numberFormatter.formatRange(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n // Very basic fallback for old browsers.\n return `${this.format(start)} – ${this.format(end)}`;\n }\n\n /** Formats a number range as an array of parts. */\n formatRangeToParts(start: number, end: number): Intl.NumberRangeFormatPart[] {\n if (typeof this.numberFormatter.formatRangeToParts === 'function') {\n return this.numberFormatter.formatRangeToParts(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n let startParts = this.numberFormatter.formatToParts(start);\n let endParts = this.numberFormatter.formatToParts(end);\n return [\n ...startParts.map(p => ({...p, source: 'startRange'}) as Intl.NumberRangeFormatPart),\n {type: 'literal', value: ' – ', source: 'shared'},\n ...endParts.map(p => ({...p, source: 'endRange'}) as Intl.NumberRangeFormatPart)\n ];\n }\n\n /** Returns the resolved formatting options based on the values passed to the constructor. */\n resolvedOptions(): Intl.ResolvedNumberFormatOptions {\n let options = this.numberFormatter.resolvedOptions();\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n options = {...options, signDisplay: this.options.signDisplay};\n }\n\n return options;\n }\n}\n\nfunction getCachedNumberFormatter(\n locale: string,\n options: NumberFormatOptions = {}\n): Intl.NumberFormat {\n let {numberingSystem} = options;\n if (numberingSystem && locale.includes('-nu-')) {\n if (!locale.includes('-u-')) {\n locale += '-u-';\n }\n locale += `-nu-${numberingSystem}`;\n }\n\n let cacheKey =\n locale +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : '');\n if (formatterCache.has(cacheKey)) {\n return formatterCache.get(cacheKey)!;\n }\n\n let numberFormatter = new Intl.NumberFormat(locale, options);\n formatterCache.set(cacheKey, numberFormatter);\n return numberFormatter;\n}\n\n/** @private - Exported for tests */\nexport function numberFormatSignDisplayPolyfill(\n numberFormat: Intl.NumberFormat,\n signDisplay: string,\n num: number\n): string {\n if (signDisplay === 'auto') {\n return numberFormat.format(num);\n } else if (signDisplay === 'never') {\n return numberFormat.format(Math.abs(num));\n } else {\n let needsPositiveSign = false;\n if (signDisplay === 'always') {\n needsPositiveSign = num > 0 || Object.is(num, 0);\n } else if (signDisplay === 'exceptZero') {\n if (Object.is(num, -0) || Object.is(num, 0)) {\n num = Math.abs(num);\n } else {\n needsPositiveSign = num > 0;\n }\n }\n\n if (needsPositiveSign) {\n let negative = numberFormat.format(-num);\n let noSign = numberFormat.format(num);\n // ignore RTL/LTR marker character\n let minus = negative.replace(noSign, '').replace(/\\u200e|\\u061C/, '');\n if ([...minus].length !== 1) {\n console.warn('@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case');\n }\n let positive = negative.replace(noSign, '!!!').replace(minus, '+').replace('!!!', noSign);\n return positive;\n } else {\n return numberFormat.format(num);\n }\n }\n}\n"],"names":[],"version":3,"file":"NumberFormatter.js.map"}
|
|
@@ -16,27 +16,6 @@ try {
|
|
|
16
16
|
}).resolvedOptions().signDisplay === 'exceptZero';
|
|
17
17
|
// eslint-disable-next-line no-empty
|
|
18
18
|
} catch {}
|
|
19
|
-
let $1dfb119a85e764e5$var$supportsUnit = false;
|
|
20
|
-
try {
|
|
21
|
-
$1dfb119a85e764e5$var$supportsUnit = new Intl.NumberFormat('de-DE', {
|
|
22
|
-
style: 'unit',
|
|
23
|
-
unit: 'degree'
|
|
24
|
-
}).resolvedOptions().style === 'unit';
|
|
25
|
-
// eslint-disable-next-line no-empty
|
|
26
|
-
} catch {}
|
|
27
|
-
// Polyfill for units since Safari doesn't support them yet. See https://bugs.webkit.org/show_bug.cgi?id=215438.
|
|
28
|
-
// Currently only polyfilling the unit degree in narrow format for ColorSlider in our supported locales.
|
|
29
|
-
// Values were determined by switching to each locale manually in Chrome.
|
|
30
|
-
const $1dfb119a85e764e5$var$UNITS = {
|
|
31
|
-
degree: {
|
|
32
|
-
narrow: {
|
|
33
|
-
default: "\xb0",
|
|
34
|
-
'ja-JP': " \u5EA6",
|
|
35
|
-
'zh-TW': "\u5EA6",
|
|
36
|
-
'sl-SI': " \xb0"
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
19
|
class $1dfb119a85e764e5$export$cc77c4ff7e8673c5 {
|
|
41
20
|
constructor(locale, options = {}){
|
|
42
21
|
this.numberFormatter = $1dfb119a85e764e5$var$getCachedNumberFormatter(locale, options);
|
|
@@ -49,12 +28,6 @@ class $1dfb119a85e764e5$export$cc77c4ff7e8673c5 {
|
|
|
49
28
|
let res = '';
|
|
50
29
|
if (!$1dfb119a85e764e5$var$supportsSignDisplay && this.options.signDisplay != null) res = $1dfb119a85e764e5$export$711b50b3c525e0f2(this.numberFormatter, this.options.signDisplay, value);
|
|
51
30
|
else res = this.numberFormatter.format(value);
|
|
52
|
-
if (this.options.style === 'unit' && !$1dfb119a85e764e5$var$supportsUnit) {
|
|
53
|
-
let { unit: unit, unitDisplay: unitDisplay = 'short', locale: locale } = this.resolvedOptions();
|
|
54
|
-
if (!unit) return res;
|
|
55
|
-
let values = $1dfb119a85e764e5$var$UNITS[unit]?.[unitDisplay];
|
|
56
|
-
res += values[locale] || values.default;
|
|
57
|
-
}
|
|
58
31
|
return res;
|
|
59
32
|
}
|
|
60
33
|
/** Formats a number to an array of parts such as separators, digits, punctuation, and more. */ formatToParts(value) {
|
|
@@ -94,12 +67,6 @@ class $1dfb119a85e764e5$export$cc77c4ff7e8673c5 {
|
|
|
94
67
|
...options,
|
|
95
68
|
signDisplay: this.options.signDisplay
|
|
96
69
|
};
|
|
97
|
-
if (!$1dfb119a85e764e5$var$supportsUnit && this.options.style === 'unit') options = {
|
|
98
|
-
...options,
|
|
99
|
-
style: 'unit',
|
|
100
|
-
unit: this.options.unit,
|
|
101
|
-
unitDisplay: this.options.unitDisplay
|
|
102
|
-
};
|
|
103
70
|
return options;
|
|
104
71
|
}
|
|
105
72
|
}
|
|
@@ -109,15 +76,6 @@ function $1dfb119a85e764e5$var$getCachedNumberFormatter(locale, options = {}) {
|
|
|
109
76
|
if (!locale.includes('-u-')) locale += '-u-';
|
|
110
77
|
locale += `-nu-${numberingSystem}`;
|
|
111
78
|
}
|
|
112
|
-
if (options.style === 'unit' && !$1dfb119a85e764e5$var$supportsUnit) {
|
|
113
|
-
let { unit: unit, unitDisplay: unitDisplay = 'short' } = options;
|
|
114
|
-
if (!unit) throw new Error('unit option must be provided with style: "unit"');
|
|
115
|
-
if (!$1dfb119a85e764e5$var$UNITS[unit]?.[unitDisplay]) throw new Error(`Unsupported unit ${unit} with unitDisplay = ${unitDisplay}`);
|
|
116
|
-
options = {
|
|
117
|
-
...options,
|
|
118
|
-
style: 'decimal'
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
79
|
let cacheKey = locale + (options ? Object.entries(options).sort((a, b)=>a[0] < b[0] ? -1 : 1).join() : '');
|
|
122
80
|
if ($1dfb119a85e764e5$var$formatterCache.has(cacheKey)) return $1dfb119a85e764e5$var$formatterCache.get(cacheKey);
|
|
123
81
|
let numberFormatter = new Intl.NumberFormat(locale, options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["packages/@internationalized/number/src/NumberFormatter.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nlet formatterCache = new Map<string, Intl.NumberFormat>();\n\nlet supportsSignDisplay = false;\ntry {\n supportsSignDisplay =\n new Intl.NumberFormat('de-DE', {signDisplay: 'exceptZero'}).resolvedOptions().signDisplay ===\n 'exceptZero';\n // eslint-disable-next-line no-empty\n} catch {}\n\nlet supportsUnit = false;\ntry {\n supportsUnit =\n new Intl.NumberFormat('de-DE', {style: 'unit', unit: 'degree'}).resolvedOptions().style ===\n 'unit';\n // eslint-disable-next-line no-empty\n} catch {}\n\n// Polyfill for units since Safari doesn't support them yet. See https://bugs.webkit.org/show_bug.cgi?id=215438.\n// Currently only polyfilling the unit degree in narrow format for ColorSlider in our supported locales.\n// Values were determined by switching to each locale manually in Chrome.\nconst UNITS = {\n degree: {\n narrow: {\n default: '°',\n 'ja-JP': ' 度',\n 'zh-TW': '度',\n 'sl-SI': ' °'\n // Arabic?? But Safari already doesn't use Arabic digits so might be ok...\n // https://bugs.webkit.org/show_bug.cgi?id=218139\n }\n }\n};\n\nexport interface NumberFormatOptions extends Intl.NumberFormatOptions {\n /** Overrides default numbering system for the current locale. */\n numberingSystem?: string;\n}\n\n/**\n * A wrapper around Intl.NumberFormat providing additional options, polyfills, and caching for\n * performance.\n */\nexport class NumberFormatter implements Intl.NumberFormat {\n private numberFormatter: Intl.NumberFormat;\n private options: NumberFormatOptions;\n\n constructor(locale: string, options: NumberFormatOptions = {}) {\n this.numberFormatter = getCachedNumberFormatter(locale, options);\n this.options = options;\n }\n\n /**\n * Formats a number value as a string, according to the locale and options provided to the\n * constructor.\n */\n format(value: number): string {\n let res = '';\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n res = numberFormatSignDisplayPolyfill(this.numberFormatter, this.options.signDisplay, value);\n } else {\n res = this.numberFormatter.format(value);\n }\n\n if (this.options.style === 'unit' && !supportsUnit) {\n let {unit, unitDisplay = 'short', locale} = this.resolvedOptions();\n if (!unit) {\n return res;\n }\n let values = UNITS[unit]?.[unitDisplay];\n res += values[locale] || values.default;\n }\n\n return res;\n }\n\n /** Formats a number to an array of parts such as separators, digits, punctuation, and more. */\n formatToParts(value: number): Intl.NumberFormatPart[] {\n // TODO: implement signDisplay for formatToParts\n return this.numberFormatter.formatToParts(value);\n }\n\n /** Formats a number range as a string. */\n formatRange(start: number, end: number): string {\n if (typeof this.numberFormatter.formatRange === 'function') {\n return this.numberFormatter.formatRange(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n // Very basic fallback for old browsers.\n return `${this.format(start)} – ${this.format(end)}`;\n }\n\n /** Formats a number range as an array of parts. */\n formatRangeToParts(start: number, end: number): Intl.NumberRangeFormatPart[] {\n if (typeof this.numberFormatter.formatRangeToParts === 'function') {\n return this.numberFormatter.formatRangeToParts(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n let startParts = this.numberFormatter.formatToParts(start);\n let endParts = this.numberFormatter.formatToParts(end);\n return [\n ...startParts.map(p => ({...p, source: 'startRange'}) as Intl.NumberRangeFormatPart),\n {type: 'literal', value: ' – ', source: 'shared'},\n ...endParts.map(p => ({...p, source: 'endRange'}) as Intl.NumberRangeFormatPart)\n ];\n }\n\n /** Returns the resolved formatting options based on the values passed to the constructor. */\n resolvedOptions(): Intl.ResolvedNumberFormatOptions {\n let options = this.numberFormatter.resolvedOptions();\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n options = {...options, signDisplay: this.options.signDisplay};\n }\n\n if (!supportsUnit && this.options.style === 'unit') {\n options = {\n ...options,\n style: 'unit',\n unit: this.options.unit,\n unitDisplay: this.options.unitDisplay\n };\n }\n\n return options;\n }\n}\n\nfunction getCachedNumberFormatter(\n locale: string,\n options: NumberFormatOptions = {}\n): Intl.NumberFormat {\n let {numberingSystem} = options;\n if (numberingSystem && locale.includes('-nu-')) {\n if (!locale.includes('-u-')) {\n locale += '-u-';\n }\n locale += `-nu-${numberingSystem}`;\n }\n\n if (options.style === 'unit' && !supportsUnit) {\n let {unit, unitDisplay = 'short'} = options;\n if (!unit) {\n throw new Error('unit option must be provided with style: \"unit\"');\n }\n if (!UNITS[unit]?.[unitDisplay]) {\n throw new Error(`Unsupported unit ${unit} with unitDisplay = ${unitDisplay}`);\n }\n options = {...options, style: 'decimal'};\n }\n\n let cacheKey =\n locale +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : '');\n if (formatterCache.has(cacheKey)) {\n return formatterCache.get(cacheKey)!;\n }\n\n let numberFormatter = new Intl.NumberFormat(locale, options);\n formatterCache.set(cacheKey, numberFormatter);\n return numberFormatter;\n}\n\n/** @private - Exported for tests */\nexport function numberFormatSignDisplayPolyfill(\n numberFormat: Intl.NumberFormat,\n signDisplay: string,\n num: number\n): string {\n if (signDisplay === 'auto') {\n return numberFormat.format(num);\n } else if (signDisplay === 'never') {\n return numberFormat.format(Math.abs(num));\n } else {\n let needsPositiveSign = false;\n if (signDisplay === 'always') {\n needsPositiveSign = num > 0 || Object.is(num, 0);\n } else if (signDisplay === 'exceptZero') {\n if (Object.is(num, -0) || Object.is(num, 0)) {\n num = Math.abs(num);\n } else {\n needsPositiveSign = num > 0;\n }\n }\n\n if (needsPositiveSign) {\n let negative = numberFormat.format(-num);\n let noSign = numberFormat.format(num);\n // ignore RTL/LTR marker character\n let minus = negative.replace(noSign, '').replace(/\\u200e|\\u061C/, '');\n if ([...minus].length !== 1) {\n console.warn('@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case');\n }\n let positive = negative.replace(noSign, '!!!').replace(minus, '+').replace('!!!', noSign);\n return positive;\n } else {\n return numberFormat.format(num);\n }\n }\n}\n"],"names":[],"version":3,"file":"NumberFormatter.mjs.map"}
|
|
1
|
+
{"mappings":"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","sources":["packages/@internationalized/number/src/NumberFormatter.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nlet formatterCache = new Map<string, Intl.NumberFormat>();\n\nlet supportsSignDisplay = false;\ntry {\n supportsSignDisplay =\n new Intl.NumberFormat('de-DE', {signDisplay: 'exceptZero'}).resolvedOptions().signDisplay ===\n 'exceptZero';\n // eslint-disable-next-line no-empty\n} catch {}\n\nexport interface NumberFormatOptions extends Intl.NumberFormatOptions {\n /** Overrides default numbering system for the current locale. */\n numberingSystem?: string;\n}\n\n/**\n * A wrapper around Intl.NumberFormat providing additional options, polyfills, and caching for\n * performance.\n */\nexport class NumberFormatter implements Intl.NumberFormat {\n private numberFormatter: Intl.NumberFormat;\n private options: NumberFormatOptions;\n\n constructor(locale: string, options: NumberFormatOptions = {}) {\n this.numberFormatter = getCachedNumberFormatter(locale, options);\n this.options = options;\n }\n\n /**\n * Formats a number value as a string, according to the locale and options provided to the\n * constructor.\n */\n format(value: number): string {\n let res = '';\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n res = numberFormatSignDisplayPolyfill(this.numberFormatter, this.options.signDisplay, value);\n } else {\n res = this.numberFormatter.format(value);\n }\n\n return res;\n }\n\n /** Formats a number to an array of parts such as separators, digits, punctuation, and more. */\n formatToParts(value: number): Intl.NumberFormatPart[] {\n // TODO: implement signDisplay for formatToParts\n return this.numberFormatter.formatToParts(value);\n }\n\n /** Formats a number range as a string. */\n formatRange(start: number, end: number): string {\n if (typeof this.numberFormatter.formatRange === 'function') {\n return this.numberFormatter.formatRange(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n // Very basic fallback for old browsers.\n return `${this.format(start)} – ${this.format(end)}`;\n }\n\n /** Formats a number range as an array of parts. */\n formatRangeToParts(start: number, end: number): Intl.NumberRangeFormatPart[] {\n if (typeof this.numberFormatter.formatRangeToParts === 'function') {\n return this.numberFormatter.formatRangeToParts(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n let startParts = this.numberFormatter.formatToParts(start);\n let endParts = this.numberFormatter.formatToParts(end);\n return [\n ...startParts.map(p => ({...p, source: 'startRange'}) as Intl.NumberRangeFormatPart),\n {type: 'literal', value: ' – ', source: 'shared'},\n ...endParts.map(p => ({...p, source: 'endRange'}) as Intl.NumberRangeFormatPart)\n ];\n }\n\n /** Returns the resolved formatting options based on the values passed to the constructor. */\n resolvedOptions(): Intl.ResolvedNumberFormatOptions {\n let options = this.numberFormatter.resolvedOptions();\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n options = {...options, signDisplay: this.options.signDisplay};\n }\n\n return options;\n }\n}\n\nfunction getCachedNumberFormatter(\n locale: string,\n options: NumberFormatOptions = {}\n): Intl.NumberFormat {\n let {numberingSystem} = options;\n if (numberingSystem && locale.includes('-nu-')) {\n if (!locale.includes('-u-')) {\n locale += '-u-';\n }\n locale += `-nu-${numberingSystem}`;\n }\n\n let cacheKey =\n locale +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : '');\n if (formatterCache.has(cacheKey)) {\n return formatterCache.get(cacheKey)!;\n }\n\n let numberFormatter = new Intl.NumberFormat(locale, options);\n formatterCache.set(cacheKey, numberFormatter);\n return numberFormatter;\n}\n\n/** @private - Exported for tests */\nexport function numberFormatSignDisplayPolyfill(\n numberFormat: Intl.NumberFormat,\n signDisplay: string,\n num: number\n): string {\n if (signDisplay === 'auto') {\n return numberFormat.format(num);\n } else if (signDisplay === 'never') {\n return numberFormat.format(Math.abs(num));\n } else {\n let needsPositiveSign = false;\n if (signDisplay === 'always') {\n needsPositiveSign = num > 0 || Object.is(num, 0);\n } else if (signDisplay === 'exceptZero') {\n if (Object.is(num, -0) || Object.is(num, 0)) {\n num = Math.abs(num);\n } else {\n needsPositiveSign = num > 0;\n }\n }\n\n if (needsPositiveSign) {\n let negative = numberFormat.format(-num);\n let noSign = numberFormat.format(num);\n // ignore RTL/LTR marker character\n let minus = negative.replace(noSign, '').replace(/\\u200e|\\u061C/, '');\n if ([...minus].length !== 1) {\n console.warn('@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case');\n }\n let positive = negative.replace(noSign, '!!!').replace(minus, '+').replace('!!!', noSign);\n return positive;\n } else {\n return numberFormat.format(num);\n }\n }\n}\n"],"names":[],"version":3,"file":"NumberFormatter.mjs.map"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@internationalized/number",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.9",
|
|
4
4
|
"description": "Internationalized number formatting and parsing utilities",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"includeNodeModules": false
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "1abc52dd5ad238143f168912963ff3ad932547a4"
|
|
50
50
|
}
|
package/src/NumberFormatter.ts
CHANGED
|
@@ -20,30 +20,6 @@ try {
|
|
|
20
20
|
// eslint-disable-next-line no-empty
|
|
21
21
|
} catch {}
|
|
22
22
|
|
|
23
|
-
let supportsUnit = false;
|
|
24
|
-
try {
|
|
25
|
-
supportsUnit =
|
|
26
|
-
new Intl.NumberFormat('de-DE', {style: 'unit', unit: 'degree'}).resolvedOptions().style ===
|
|
27
|
-
'unit';
|
|
28
|
-
// eslint-disable-next-line no-empty
|
|
29
|
-
} catch {}
|
|
30
|
-
|
|
31
|
-
// Polyfill for units since Safari doesn't support them yet. See https://bugs.webkit.org/show_bug.cgi?id=215438.
|
|
32
|
-
// Currently only polyfilling the unit degree in narrow format for ColorSlider in our supported locales.
|
|
33
|
-
// Values were determined by switching to each locale manually in Chrome.
|
|
34
|
-
const UNITS = {
|
|
35
|
-
degree: {
|
|
36
|
-
narrow: {
|
|
37
|
-
default: '°',
|
|
38
|
-
'ja-JP': ' 度',
|
|
39
|
-
'zh-TW': '度',
|
|
40
|
-
'sl-SI': ' °'
|
|
41
|
-
// Arabic?? But Safari already doesn't use Arabic digits so might be ok...
|
|
42
|
-
// https://bugs.webkit.org/show_bug.cgi?id=218139
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
|
|
47
23
|
export interface NumberFormatOptions extends Intl.NumberFormatOptions {
|
|
48
24
|
/** Overrides default numbering system for the current locale. */
|
|
49
25
|
numberingSystem?: string;
|
|
@@ -74,15 +50,6 @@ export class NumberFormatter implements Intl.NumberFormat {
|
|
|
74
50
|
res = this.numberFormatter.format(value);
|
|
75
51
|
}
|
|
76
52
|
|
|
77
|
-
if (this.options.style === 'unit' && !supportsUnit) {
|
|
78
|
-
let {unit, unitDisplay = 'short', locale} = this.resolvedOptions();
|
|
79
|
-
if (!unit) {
|
|
80
|
-
return res;
|
|
81
|
-
}
|
|
82
|
-
let values = UNITS[unit]?.[unitDisplay];
|
|
83
|
-
res += values[locale] || values.default;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
53
|
return res;
|
|
87
54
|
}
|
|
88
55
|
|
|
@@ -132,15 +99,6 @@ export class NumberFormatter implements Intl.NumberFormat {
|
|
|
132
99
|
options = {...options, signDisplay: this.options.signDisplay};
|
|
133
100
|
}
|
|
134
101
|
|
|
135
|
-
if (!supportsUnit && this.options.style === 'unit') {
|
|
136
|
-
options = {
|
|
137
|
-
...options,
|
|
138
|
-
style: 'unit',
|
|
139
|
-
unit: this.options.unit,
|
|
140
|
-
unitDisplay: this.options.unitDisplay
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
|
|
144
102
|
return options;
|
|
145
103
|
}
|
|
146
104
|
}
|
|
@@ -157,17 +115,6 @@ function getCachedNumberFormatter(
|
|
|
157
115
|
locale += `-nu-${numberingSystem}`;
|
|
158
116
|
}
|
|
159
117
|
|
|
160
|
-
if (options.style === 'unit' && !supportsUnit) {
|
|
161
|
-
let {unit, unitDisplay = 'short'} = options;
|
|
162
|
-
if (!unit) {
|
|
163
|
-
throw new Error('unit option must be provided with style: "unit"');
|
|
164
|
-
}
|
|
165
|
-
if (!UNITS[unit]?.[unitDisplay]) {
|
|
166
|
-
throw new Error(`Unsupported unit ${unit} with unitDisplay = ${unitDisplay}`);
|
|
167
|
-
}
|
|
168
|
-
options = {...options, style: 'decimal'};
|
|
169
|
-
}
|
|
170
|
-
|
|
171
118
|
let cacheKey =
|
|
172
119
|
locale +
|
|
173
120
|
(options
|