@formatjs/ecma402-abstract 2.3.1 → 2.3.2

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.
Files changed (59) hide show
  1. package/262.d.ts +3 -2
  2. package/262.js +77 -15
  3. package/NumberFormat/ComputeExponent.d.ts +1 -3
  4. package/NumberFormat/ComputeExponent.js +7 -11
  5. package/NumberFormat/ComputeExponentForMagnitude.d.ts +1 -3
  6. package/NumberFormat/ComputeExponentForMagnitude.js +2 -5
  7. package/NumberFormat/FormatApproximately.d.ts +1 -3
  8. package/NumberFormat/FormatApproximately.js +1 -3
  9. package/NumberFormat/FormatNumeric.d.ts +3 -0
  10. package/NumberFormat/FormatNumeric.js +8 -0
  11. package/NumberFormat/FormatNumericToParts.js +1 -1
  12. package/NumberFormat/FormatNumericToString.d.ts +1 -1
  13. package/NumberFormat/FormatNumericToString.js +2 -1
  14. package/NumberFormat/InitializeNumberFormat.js +1 -1
  15. package/NumberFormat/PartitionNumberPattern.d.ts +2 -4
  16. package/NumberFormat/PartitionNumberPattern.js +53 -14
  17. package/NumberFormat/PartitionNumberRangePattern.js +27 -19
  18. package/NumberFormat/SetNumberFormatDigitOptions.js +73 -3
  19. package/NumberFormat/SetNumberFormatUnitOptions.d.ts +1 -3
  20. package/NumberFormat/SetNumberFormatUnitOptions.js +26 -15
  21. package/NumberFormat/ToRawFixed.d.ts +2 -3
  22. package/NumberFormat/ToRawFixed.js +39 -7
  23. package/NumberFormat/ToRawPrecision.d.ts +6 -0
  24. package/NumberFormat/ToRawPrecision.js +61 -19
  25. package/NumberFormat/format_to_parts.js +9 -4
  26. package/ToIntlMathematicalValue.d.ts +2 -0
  27. package/ToIntlMathematicalValue.js +31 -0
  28. package/index.d.ts +2 -0
  29. package/index.js +4 -1
  30. package/lib/262.d.ts +3 -2
  31. package/lib/262.js +76 -15
  32. package/lib/NumberFormat/ComputeExponent.d.ts +1 -3
  33. package/lib/NumberFormat/ComputeExponent.js +6 -11
  34. package/lib/NumberFormat/ComputeExponentForMagnitude.d.ts +1 -3
  35. package/lib/NumberFormat/ComputeExponentForMagnitude.js +2 -5
  36. package/lib/NumberFormat/FormatApproximately.d.ts +1 -3
  37. package/lib/NumberFormat/FormatApproximately.js +1 -3
  38. package/lib/NumberFormat/FormatNumeric.d.ts +3 -0
  39. package/lib/NumberFormat/FormatNumeric.js +5 -0
  40. package/lib/NumberFormat/FormatNumericToParts.js +1 -1
  41. package/lib/NumberFormat/FormatNumericToString.d.ts +1 -1
  42. package/lib/NumberFormat/FormatNumericToString.js +2 -1
  43. package/lib/NumberFormat/InitializeNumberFormat.js +1 -1
  44. package/lib/NumberFormat/PartitionNumberPattern.d.ts +2 -4
  45. package/lib/NumberFormat/PartitionNumberPattern.js +53 -14
  46. package/lib/NumberFormat/PartitionNumberRangePattern.js +27 -19
  47. package/lib/NumberFormat/SetNumberFormatDigitOptions.js +73 -3
  48. package/lib/NumberFormat/SetNumberFormatUnitOptions.d.ts +1 -3
  49. package/lib/NumberFormat/SetNumberFormatUnitOptions.js +26 -15
  50. package/lib/NumberFormat/ToRawFixed.d.ts +2 -3
  51. package/lib/NumberFormat/ToRawFixed.js +39 -7
  52. package/lib/NumberFormat/ToRawPrecision.d.ts +6 -0
  53. package/lib/NumberFormat/ToRawPrecision.js +62 -20
  54. package/lib/NumberFormat/format_to_parts.js +9 -4
  55. package/lib/ToIntlMathematicalValue.d.ts +2 -0
  56. package/lib/ToIntlMathematicalValue.js +27 -0
  57. package/lib/index.d.ts +2 -0
  58. package/lib/index.js +2 -0
  59. package/package.json +3 -3
package/index.d.ts CHANGED
@@ -16,6 +16,7 @@ export * from './NumberFormat/ComputeExponentForMagnitude';
16
16
  export * from './NumberFormat/CurrencyDigits';
17
17
  export { default as _formatToParts } from './NumberFormat/format_to_parts';
18
18
  export * from './NumberFormat/FormatApproximately';
19
+ export * from './NumberFormat/FormatNumeric';
19
20
  export * from './NumberFormat/FormatNumericRange';
20
21
  export * from './NumberFormat/FormatNumericRangeToParts';
21
22
  export * from './NumberFormat/FormatNumericToParts';
@@ -43,3 +44,4 @@ export * from './types/plural-rules';
43
44
  export * from './types/relative-time';
44
45
  export { createMemoizedDateTimeFormat, createMemoizedListFormat, createMemoizedLocale, createMemoizedNumberFormat, createMemoizedPluralRules, invariant, } from './utils';
45
46
  export { ZERO } from './constants';
47
+ export { ToIntlMathematicalValue } from './ToIntlMathematicalValue';
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ZERO = exports.invariant = exports.createMemoizedPluralRules = exports.createMemoizedNumberFormat = exports.createMemoizedLocale = exports.createMemoizedListFormat = exports.createMemoizedDateTimeFormat = exports.isMissingLocaleDataError = exports.setMultiInternalSlots = exports.setInternalSlot = exports.isLiteralPart = exports.getMultiInternalSlots = exports.getInternalSlot = exports.defineProperty = exports.createDataProperty = exports._formatToParts = void 0;
3
+ exports.ToIntlMathematicalValue = exports.ZERO = exports.invariant = exports.createMemoizedPluralRules = exports.createMemoizedNumberFormat = exports.createMemoizedLocale = exports.createMemoizedListFormat = exports.createMemoizedDateTimeFormat = exports.isMissingLocaleDataError = exports.setMultiInternalSlots = exports.setInternalSlot = exports.isLiteralPart = exports.getMultiInternalSlots = exports.getInternalSlot = exports.defineProperty = exports.createDataProperty = exports._formatToParts = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  tslib_1.__exportStar(require("./CanonicalizeLocaleList"), exports);
6
6
  tslib_1.__exportStar(require("./CanonicalizeTimeZoneName"), exports);
@@ -21,6 +21,7 @@ tslib_1.__exportStar(require("./NumberFormat/CurrencyDigits"), exports);
21
21
  var format_to_parts_1 = require("./NumberFormat/format_to_parts");
22
22
  Object.defineProperty(exports, "_formatToParts", { enumerable: true, get: function () { return tslib_1.__importDefault(format_to_parts_1).default; } });
23
23
  tslib_1.__exportStar(require("./NumberFormat/FormatApproximately"), exports);
24
+ tslib_1.__exportStar(require("./NumberFormat/FormatNumeric"), exports);
24
25
  tslib_1.__exportStar(require("./NumberFormat/FormatNumericRange"), exports);
25
26
  tslib_1.__exportStar(require("./NumberFormat/FormatNumericRangeToParts"), exports);
26
27
  tslib_1.__exportStar(require("./NumberFormat/FormatNumericToParts"), exports);
@@ -61,3 +62,5 @@ Object.defineProperty(exports, "createMemoizedPluralRules", { enumerable: true,
61
62
  Object.defineProperty(exports, "invariant", { enumerable: true, get: function () { return utils_2.invariant; } });
62
63
  var constants_1 = require("./constants");
63
64
  Object.defineProperty(exports, "ZERO", { enumerable: true, get: function () { return constants_1.ZERO; } });
65
+ var ToIntlMathematicalValue_1 = require("./ToIntlMathematicalValue");
66
+ Object.defineProperty(exports, "ToIntlMathematicalValue", { enumerable: true, get: function () { return ToIntlMathematicalValue_1.ToIntlMathematicalValue; } });
package/lib/262.d.ts CHANGED
@@ -7,12 +7,12 @@ export declare function ToString(o: unknown): string;
7
7
  * https://tc39.es/ecma262/#sec-tonumber
8
8
  * @param val
9
9
  */
10
- export declare function ToNumber(val: any): Decimal;
10
+ export declare function ToNumber(arg: any): Decimal;
11
11
  /**
12
12
  * https://tc39.es/ecma262/#sec-timeclip
13
13
  * @param time
14
14
  */
15
- export declare function TimeClip(time: number): number;
15
+ export declare function TimeClip(time: Decimal): Decimal;
16
16
  /**
17
17
  * https://tc39.es/ecma262/#sec-toobject
18
18
  * @param arg
@@ -90,3 +90,4 @@ export declare function OrdinaryHasInstance(C: Object, O: any, internalSlots?: {
90
90
  boundTargetFunction: any;
91
91
  }): boolean;
92
92
  export declare function msFromTime(t: number): number;
93
+ export declare function ToPrimitive<T extends 'string' | 'number' = 'string' | 'number'>(input: any, preferredType: T): string | number | boolean | undefined | null;
package/lib/262.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Decimal } from 'decimal.js';
2
2
  import { ZERO } from './constants';
3
+ import { invariant } from './utils';
3
4
  /**
4
5
  * https://tc39.es/ecma262/#sec-tostring
5
6
  */
@@ -14,20 +15,32 @@ export function ToString(o) {
14
15
  * https://tc39.es/ecma262/#sec-tonumber
15
16
  * @param val
16
17
  */
17
- export function ToNumber(val) {
18
- if (val === undefined) {
18
+ export function ToNumber(arg) {
19
+ if (typeof arg === 'number') {
20
+ return new Decimal(arg);
21
+ }
22
+ invariant(typeof arg !== 'bigint' && typeof arg !== 'symbol', 'BigInt and Symbol are not supported', TypeError);
23
+ if (arg === undefined) {
19
24
  return new Decimal(NaN);
20
25
  }
21
- if (val === null) {
26
+ if (arg === null || arg === 0) {
22
27
  return ZERO;
23
28
  }
24
- if (typeof val === 'boolean') {
25
- return new Decimal(val ? 1 : 0);
26
- }
27
- if (typeof val === 'symbol' || typeof val === 'bigint') {
28
- throw new TypeError('Cannot convert symbol/bigint to number');
29
- }
30
- return new Decimal(Number(val));
29
+ if (arg === true) {
30
+ return new Decimal(1);
31
+ }
32
+ if (typeof arg === 'string') {
33
+ try {
34
+ return new Decimal(arg);
35
+ }
36
+ catch (e) {
37
+ return new Decimal(NaN);
38
+ }
39
+ }
40
+ invariant(typeof arg === 'object', 'object expected', TypeError);
41
+ var primValue = ToPrimitive(arg, 'number');
42
+ invariant(typeof primValue !== 'object', 'object expected', TypeError);
43
+ return ToNumber(primValue);
31
44
  }
32
45
  /**
33
46
  * https://tc39.es/ecma262/#sec-tointeger
@@ -52,13 +65,13 @@ function ToInteger(n) {
52
65
  * @param time
53
66
  */
54
67
  export function TimeClip(time) {
55
- if (!isFinite(time)) {
56
- return NaN;
68
+ if (!time.isFinite()) {
69
+ return new Decimal(NaN);
57
70
  }
58
- if (Math.abs(time) > 8.64 * 1e15) {
59
- return NaN;
71
+ if (time.abs().greaterThan(8.64 * 1e15)) {
72
+ return new Decimal(NaN);
60
73
  }
61
- return ToInteger(time).toNumber();
74
+ return ToInteger(time);
62
75
  }
63
76
  /**
64
77
  * https://tc39.es/ecma262/#sec-toobject
@@ -330,3 +343,51 @@ export function OrdinaryHasInstance(C, O, internalSlots) {
330
343
  export function msFromTime(t) {
331
344
  return mod(t, MS_PER_SECOND);
332
345
  }
346
+ function OrdinaryToPrimitive(O, hint) {
347
+ var methodNames;
348
+ if (hint === 'string') {
349
+ methodNames = ['toString', 'valueOf'];
350
+ }
351
+ else {
352
+ methodNames = ['valueOf', 'toString'];
353
+ }
354
+ for (var _i = 0, methodNames_1 = methodNames; _i < methodNames_1.length; _i++) {
355
+ var name_1 = methodNames_1[_i];
356
+ var method = O[name_1];
357
+ if (IsCallable(method)) {
358
+ var result = method.call(O);
359
+ if (typeof result !== 'object') {
360
+ return result;
361
+ }
362
+ }
363
+ }
364
+ throw new TypeError('Cannot convert object to primitive value');
365
+ }
366
+ export function ToPrimitive(input, preferredType) {
367
+ if (typeof input === 'object' && input != null) {
368
+ var exoticToPrim = Symbol.toPrimitive in input ? input[Symbol.toPrimitive] : undefined;
369
+ var hint = void 0;
370
+ if (exoticToPrim !== undefined) {
371
+ if (preferredType === undefined) {
372
+ hint = 'default';
373
+ }
374
+ else if (preferredType === 'string') {
375
+ hint = 'string';
376
+ }
377
+ else {
378
+ invariant(preferredType === 'number', 'preferredType must be "string" or "number"');
379
+ hint = 'number';
380
+ }
381
+ var result = exoticToPrim.call(input, hint);
382
+ if (typeof result !== 'object') {
383
+ return result;
384
+ }
385
+ throw new TypeError('Cannot convert exotic object to primitive.');
386
+ }
387
+ if (preferredType === undefined) {
388
+ preferredType = 'number';
389
+ }
390
+ return OrdinaryToPrimitive(input, preferredType);
391
+ }
392
+ return input;
393
+ }
@@ -7,6 +7,4 @@ import { NumberFormatInternal } from '../types/number';
7
7
  *
8
8
  * NOT IN SPEC: it returns [exponent, magnitude].
9
9
  */
10
- export declare function ComputeExponent(numberFormat: Intl.NumberFormat, x: Decimal, { getInternalSlots, }: {
11
- getInternalSlots(nf: Intl.NumberFormat): NumberFormatInternal;
12
- }): [number, number];
10
+ export declare function ComputeExponent(internalSlots: NumberFormatInternal, x: Decimal): [number, number];
@@ -1,4 +1,4 @@
1
- import { TEN } from '../constants';
1
+ import Decimal from 'decimal.js';
2
2
  import { ComputeExponentForMagnitude } from './ComputeExponentForMagnitude';
3
3
  import { FormatNumericToString } from './FormatNumericToString';
4
4
  /**
@@ -8,8 +8,7 @@ import { FormatNumericToString } from './FormatNumericToString';
8
8
  *
9
9
  * NOT IN SPEC: it returns [exponent, magnitude].
10
10
  */
11
- export function ComputeExponent(numberFormat, x, _a) {
12
- var getInternalSlots = _a.getInternalSlots;
11
+ export function ComputeExponent(internalSlots, x) {
13
12
  if (x.isZero()) {
14
13
  return [0, 0];
15
14
  }
@@ -17,12 +16,10 @@ export function ComputeExponent(numberFormat, x, _a) {
17
16
  x = x.negated();
18
17
  }
19
18
  var magnitude = x.log(10).floor();
20
- var exponent = ComputeExponentForMagnitude(numberFormat, magnitude, {
21
- getInternalSlots: getInternalSlots,
22
- });
19
+ var exponent = ComputeExponentForMagnitude(internalSlots, magnitude);
23
20
  // Preserve more precision by doing multiplication when exponent is negative.
24
- x = x.times(TEN.pow(-exponent));
25
- var formatNumberResult = FormatNumericToString(getInternalSlots(numberFormat), x);
21
+ x = x.times(Decimal.pow(10, -exponent));
22
+ var formatNumberResult = FormatNumericToString(internalSlots, x);
26
23
  if (formatNumberResult.roundedNumber.isZero()) {
27
24
  return [exponent, magnitude.toNumber()];
28
25
  }
@@ -31,9 +28,7 @@ export function ComputeExponent(numberFormat, x, _a) {
31
28
  return [exponent, magnitude.toNumber()];
32
29
  }
33
30
  return [
34
- ComputeExponentForMagnitude(numberFormat, magnitude.plus(1), {
35
- getInternalSlots: getInternalSlots,
36
- }),
31
+ ComputeExponentForMagnitude(internalSlots, magnitude.plus(1)),
37
32
  magnitude.plus(1).toNumber(),
38
33
  ];
39
34
  }
@@ -5,6 +5,4 @@ import { NumberFormatInternal } from '../types/number';
5
5
  * number of the given magnitude (power of ten of the most significant digit) according to the
6
6
  * locale and the desired notation (scientific, engineering, or compact).
7
7
  */
8
- export declare function ComputeExponentForMagnitude(numberFormat: Intl.NumberFormat, magnitude: Decimal, { getInternalSlots, }: {
9
- getInternalSlots(nf: Intl.NumberFormat): NumberFormatInternal;
10
- }): number;
8
+ export declare function ComputeExponentForMagnitude(internalSlots: NumberFormatInternal, magnitude: Decimal): number;
@@ -1,5 +1,4 @@
1
1
  import Decimal from 'decimal.js';
2
- import { TEN } from '../constants';
3
2
  import { invariant } from '../utils';
4
3
  Decimal.set({
5
4
  toExpPos: 100,
@@ -9,9 +8,7 @@ Decimal.set({
9
8
  * number of the given magnitude (power of ten of the most significant digit) according to the
10
9
  * locale and the desired notation (scientific, engineering, or compact).
11
10
  */
12
- export function ComputeExponentForMagnitude(numberFormat, magnitude, _a) {
13
- var getInternalSlots = _a.getInternalSlots;
14
- var internalSlots = getInternalSlots(numberFormat);
11
+ export function ComputeExponentForMagnitude(internalSlots, magnitude) {
15
12
  var notation = internalSlots.notation, dataLocaleData = internalSlots.dataLocaleData, numberingSystem = internalSlots.numberingSystem;
16
13
  switch (notation) {
17
14
  case 'standard':
@@ -40,7 +37,7 @@ export function ComputeExponentForMagnitude(numberFormat, magnitude, _a) {
40
37
  if (!thresholdMap) {
41
38
  return 0;
42
39
  }
43
- var num = TEN.pow(magnitude).toString();
40
+ var num = Decimal.pow(10, magnitude).toString();
44
41
  var thresholds = Object.keys(thresholdMap); // TODO: this can be pre-processed
45
42
  if (num < thresholds[0]) {
46
43
  return 0;
@@ -2,6 +2,4 @@ import { NumberFormatInternal, NumberFormatPart } from '../types/number';
2
2
  /**
3
3
  * https://tc39.es/ecma402/#sec-formatapproximately
4
4
  */
5
- export declare function FormatApproximately(numberFormat: Intl.NumberFormat, result: NumberFormatPart[], { getInternalSlots, }: {
6
- getInternalSlots(nf: Intl.NumberFormat): NumberFormatInternal;
7
- }): NumberFormatPart[];
5
+ export declare function FormatApproximately(internalSlots: NumberFormatInternal, result: NumberFormatPart[]): NumberFormatPart[];
@@ -1,9 +1,7 @@
1
1
  /**
2
2
  * https://tc39.es/ecma402/#sec-formatapproximately
3
3
  */
4
- export function FormatApproximately(numberFormat, result, _a) {
5
- var getInternalSlots = _a.getInternalSlots;
6
- var internalSlots = getInternalSlots(numberFormat);
4
+ export function FormatApproximately(internalSlots, result) {
7
5
  var symbols = internalSlots.dataLocaleData.numbers.symbols[internalSlots.numberingSystem];
8
6
  var approximatelySign = symbols.approximatelySign;
9
7
  result.push({ type: 'approximatelySign', value: approximatelySign });
@@ -0,0 +1,3 @@
1
+ import Decimal from 'decimal.js';
2
+ import { NumberFormatInternal } from '../types/number';
3
+ export declare function FormatNumeric(internalSlots: NumberFormatInternal, x: Decimal): string;
@@ -0,0 +1,5 @@
1
+ import { PartitionNumberPattern } from './PartitionNumberPattern';
2
+ export function FormatNumeric(internalSlots, x) {
3
+ var parts = PartitionNumberPattern(internalSlots, x);
4
+ return parts.map(function (p) { return p.value; }).join('');
5
+ }
@@ -1,7 +1,7 @@
1
1
  import { ArrayCreate } from '../262';
2
2
  import { PartitionNumberPattern } from './PartitionNumberPattern';
3
3
  export function FormatNumericToParts(nf, x, implDetails) {
4
- var parts = PartitionNumberPattern(nf, x, implDetails);
4
+ var parts = PartitionNumberPattern(implDetails.getInternalSlots(nf), x);
5
5
  var result = ArrayCreate(0);
6
6
  for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {
7
7
  var part = parts_1[_i];
@@ -3,7 +3,7 @@ import { NumberFormatDigitInternalSlots } from '../types/number';
3
3
  /**
4
4
  * https://tc39.es/ecma402/#sec-formatnumberstring
5
5
  */
6
- export declare function FormatNumericToString(intlObject: Pick<NumberFormatDigitInternalSlots, 'roundingType' | 'minimumSignificantDigits' | 'maximumSignificantDigits' | 'minimumIntegerDigits' | 'minimumFractionDigits' | 'maximumFractionDigits' | 'roundingIncrement' | 'roundingMode' | 'trailingZeroDisplay'>, x: Decimal): {
6
+ export declare function FormatNumericToString(intlObject: Pick<NumberFormatDigitInternalSlots, 'roundingType' | 'minimumSignificantDigits' | 'maximumSignificantDigits' | 'minimumIntegerDigits' | 'minimumFractionDigits' | 'maximumFractionDigits' | 'roundingIncrement' | 'roundingMode' | 'trailingZeroDisplay'>, _x: Decimal): {
7
7
  roundedNumber: Decimal;
8
8
  formattedString: string;
9
9
  };
@@ -6,7 +6,8 @@ import { ToRawPrecision } from './ToRawPrecision';
6
6
  /**
7
7
  * https://tc39.es/ecma402/#sec-formatnumberstring
8
8
  */
9
- export function FormatNumericToString(intlObject, x) {
9
+ export function FormatNumericToString(intlObject, _x) {
10
+ var x = _x;
10
11
  var sign;
11
12
  // -0
12
13
  if (x.isZero() && x.isNegative()) {
@@ -35,7 +35,7 @@ export function InitializeNumberFormat(nf, locales, opts, _a) {
35
35
  internalSlots.dataLocale = r.dataLocale;
36
36
  internalSlots.numberingSystem = r.nu;
37
37
  internalSlots.dataLocaleData = dataLocaleData;
38
- SetNumberFormatUnitOptions(nf, options, { getInternalSlots: getInternalSlots });
38
+ SetNumberFormatUnitOptions(internalSlots, options);
39
39
  var style = internalSlots.style;
40
40
  var notation = GetOption(options, 'notation', 'string', ['standard', 'scientific', 'engineering', 'compact'], 'standard');
41
41
  internalSlots.notation = notation;
@@ -1,8 +1,6 @@
1
1
  import Decimal from 'decimal.js';
2
2
  import { NumberFormatInternal, NumberFormatPart } from '../types/number';
3
3
  /**
4
- * https://tc39.es/ecma402/#sec-formatnumberstring
4
+ * https://tc39.es/ecma402/#sec-partitionnumberpattern
5
5
  */
6
- export declare function PartitionNumberPattern(numberFormat: Intl.NumberFormat, x: Decimal, { getInternalSlots, }: {
7
- getInternalSlots(nf: Intl.NumberFormat): NumberFormatInternal;
8
- }): NumberFormatPart[];
6
+ export declare function PartitionNumberPattern(internalSlots: NumberFormatInternal, _x: Decimal): NumberFormatPart[];
@@ -1,87 +1,126 @@
1
- import { TEN } from '../constants';
1
+ import Decimal from 'decimal.js';
2
2
  import { invariant } from '../utils';
3
3
  import { ComputeExponent } from './ComputeExponent';
4
4
  import formatToParts from './format_to_parts';
5
5
  import { FormatNumericToString } from './FormatNumericToString';
6
6
  /**
7
- * https://tc39.es/ecma402/#sec-formatnumberstring
7
+ * https://tc39.es/ecma402/#sec-partitionnumberpattern
8
8
  */
9
- export function PartitionNumberPattern(numberFormat, x, _a) {
10
- var _b;
11
- var getInternalSlots = _a.getInternalSlots;
12
- var internalSlots = getInternalSlots(numberFormat);
9
+ export function PartitionNumberPattern(internalSlots, _x) {
10
+ var _a;
11
+ var x = _x;
12
+ // IMPL: We need to record the magnitude of the number
13
+ var magnitude = 0;
14
+ // 2. Let dataLocaleData be internalSlots.[[dataLocaleData]].
13
15
  var pl = internalSlots.pl, dataLocaleData = internalSlots.dataLocaleData, numberingSystem = internalSlots.numberingSystem;
16
+ // 3. Let symbols be dataLocaleData.[[numbers]].[[symbols]][internalSlots.[[numberingSystem]]].
14
17
  var symbols = dataLocaleData.numbers.symbols[numberingSystem] ||
15
18
  dataLocaleData.numbers.symbols[dataLocaleData.numbers.nu[0]];
16
- var magnitude = 0;
19
+ // 4. Let exponent be 0.
17
20
  var exponent = 0;
21
+ // 5. Let n be ! ToString(x).
18
22
  var n;
23
+ // 6. If x is NaN, then
19
24
  if (x.isNaN()) {
25
+ // 6.a. Let n be symbols.[[nan]].
20
26
  n = symbols.nan;
21
27
  }
22
28
  else if (!x.isFinite()) {
29
+ // 7. Else if x is a non-finite Number, then
30
+ // 7.a. Let n be symbols.[[infinity]].
23
31
  n = symbols.infinity;
24
32
  }
25
33
  else {
34
+ // 8. Else,
26
35
  if (!x.isZero()) {
36
+ // 8.a. If x < 0, let x be -x.
27
37
  invariant(x.isFinite(), 'Input must be a mathematical value');
38
+ // 8.b. If internalSlots.[[style]] is "percent", let x be 100 × x.
28
39
  if (internalSlots.style == 'percent') {
29
40
  x = x.times(100);
30
41
  }
42
+ // 8.c. Let exponent be ComputeExponent(numberFormat, x).
31
43
  ;
32
- _b = ComputeExponent(numberFormat, x, {
33
- getInternalSlots: getInternalSlots,
34
- }), exponent = _b[0], magnitude = _b[1];
35
- x = x.times(TEN.pow(-exponent));
44
+ _a = ComputeExponent(internalSlots, x), exponent = _a[0],
45
+ // IMPL: We need to record the magnitude of the number
46
+ magnitude = _a[1];
47
+ // 8.d. Let x be x × 10^(-exponent).
48
+ x = x.times(Decimal.pow(10, -exponent));
36
49
  }
50
+ // 8.e. Let formatNumberResult be FormatNumericToString(internalSlots, x).
37
51
  var formatNumberResult = FormatNumericToString(internalSlots, x);
52
+ // 8.f. Let n be formatNumberResult.[[formattedString]].
38
53
  n = formatNumberResult.formattedString;
54
+ // 8.g. Let x be formatNumberResult.[[roundedNumber]].
39
55
  x = formatNumberResult.roundedNumber;
40
56
  }
41
- // Based on https://tc39.es/ecma402/#sec-getnumberformatpattern
42
- // We need to do this before `x` is rounded.
57
+ // 9. Let sign be 0.
43
58
  var sign;
59
+ // 10. If x is negative, then
44
60
  var signDisplay = internalSlots.signDisplay;
45
61
  switch (signDisplay) {
46
62
  case 'never':
63
+ // 10.a. If internalSlots.[[signDisplay]] is "never", then
64
+ // 10.a.i. Let sign be 0.
47
65
  sign = 0;
48
66
  break;
49
67
  case 'auto':
68
+ // 10.b. Else if internalSlots.[[signDisplay]] is "auto", then
50
69
  if (x.isPositive() || x.isNaN()) {
70
+ // 10.b.i. If x is positive or x is NaN, let sign be 0.
51
71
  sign = 0;
52
72
  }
53
73
  else {
74
+ // 10.b.ii. Else, let sign be -1.
54
75
  sign = -1;
55
76
  }
56
77
  break;
57
78
  case 'always':
79
+ // 10.c. Else if internalSlots.[[signDisplay]] is "always", then
58
80
  if (x.isPositive() || x.isNaN()) {
81
+ // 10.c.i. If x is positive or x is NaN, let sign be 1.
59
82
  sign = 1;
60
83
  }
61
84
  else {
85
+ // 10.c.ii. Else, let sign be -1.
62
86
  sign = -1;
63
87
  }
64
88
  break;
65
89
  case 'exceptZero':
90
+ // 10.d. Else if internalSlots.[[signDisplay]] is "exceptZero", then
66
91
  if (x.isZero()) {
92
+ // 10.d.i. If x is 0, let sign be 0.
67
93
  sign = 0;
68
94
  }
69
95
  else if (x.isNegative()) {
96
+ // 10.d.ii. Else if x is negative, let sign be -1.
70
97
  sign = -1;
71
98
  }
72
99
  else {
100
+ // 10.d.iii. Else, let sign be 1.
73
101
  sign = 1;
74
102
  }
75
103
  break;
76
104
  default:
105
+ // 10.e. Else,
77
106
  invariant(signDisplay === 'negative', 'signDisplay must be "negative"');
78
107
  if (x.isNegative() && !x.isZero()) {
108
+ // 10.e.i. If x is negative and x is not 0, let sign be -1.
79
109
  sign = -1;
80
110
  }
81
111
  else {
112
+ // 10.e.ii. Else, let sign be 0.
82
113
  sign = 0;
83
114
  }
84
115
  break;
85
116
  }
86
- return formatToParts({ roundedNumber: x, formattedString: n, exponent: exponent, magnitude: magnitude, sign: sign }, internalSlots.dataLocaleData, pl, internalSlots);
117
+ // 11. Return ? FormatNumberToParts(numberFormat, x, n, exponent, sign).
118
+ return formatToParts({
119
+ roundedNumber: x,
120
+ formattedString: n,
121
+ exponent: exponent,
122
+ // IMPL: We're returning this for our implementation of formatToParts
123
+ magnitude: magnitude,
124
+ sign: sign,
125
+ }, internalSlots.dataLocaleData, pl, internalSlots);
87
126
  }
@@ -1,32 +1,40 @@
1
1
  import { invariant } from '../utils';
2
2
  import { CollapseNumberRange } from './CollapseNumberRange';
3
3
  import { FormatApproximately } from './FormatApproximately';
4
+ import { FormatNumeric } from './FormatNumeric';
4
5
  import { PartitionNumberPattern } from './PartitionNumberPattern';
5
6
  /**
6
7
  * https://tc39.es/ecma402/#sec-partitionnumberrangepattern
7
8
  */
8
9
  export function PartitionNumberRangePattern(numberFormat, x, y, _a) {
9
10
  var getInternalSlots = _a.getInternalSlots;
10
- invariant(!x.isNaN() && !y.isNaN(), 'Input must be a number');
11
- var result = [];
12
- var xResult = PartitionNumberPattern(numberFormat, x, { getInternalSlots: getInternalSlots });
13
- var yResult = PartitionNumberPattern(numberFormat, y, { getInternalSlots: getInternalSlots });
14
- if (xResult === yResult) {
15
- return FormatApproximately(numberFormat, xResult, { getInternalSlots: getInternalSlots });
16
- }
17
- for (var _i = 0, xResult_1 = xResult; _i < xResult_1.length; _i++) {
18
- var r = xResult_1[_i];
19
- r.source = 'startRange';
20
- }
21
- result = result.concat(xResult);
11
+ // 1. Assert: x and y are both mathematical values.
12
+ invariant(!x.isNaN() && !y.isNaN(), 'Input must be a number', RangeError);
22
13
  var internalSlots = getInternalSlots(numberFormat);
23
- var symbols = internalSlots.dataLocaleData.numbers.symbols[internalSlots.numberingSystem];
24
- result.push({ type: 'literal', value: symbols.rangeSign, source: 'shared' });
25
- for (var _b = 0, yResult_1 = yResult; _b < yResult_1.length; _b++) {
26
- var r = yResult_1[_b];
27
- r.source = 'endRange';
14
+ // 3. Let xResult be ? PartitionNumberPattern(numberFormat, x).
15
+ var xResult = PartitionNumberPattern(internalSlots, x);
16
+ // 4. Let yResult be ? PartitionNumberPattern(numberFormat, y).
17
+ var yResult = PartitionNumberPattern(internalSlots, y);
18
+ if (FormatNumeric(internalSlots, x) === FormatNumeric(internalSlots, y)) {
19
+ var appxResult = FormatApproximately(internalSlots, xResult);
20
+ appxResult.forEach(function (el) {
21
+ el.source = 'shared';
22
+ });
23
+ return appxResult;
28
24
  }
29
- result = result.concat(yResult);
25
+ var result = [];
26
+ xResult.forEach(function (el) {
27
+ el.source = 'startRange';
28
+ result.push(el);
29
+ });
30
+ // 9. Let symbols be internalSlots.[[dataLocaleData]].[[numbers]].[[symbols]][internalSlots.[[numberingSystem]]].
31
+ var rangeSeparator = internalSlots.dataLocaleData.numbers.symbols[internalSlots.numberingSystem]
32
+ .rangeSign;
33
+ result.push({ type: 'literal', value: rangeSeparator, source: 'shared' });
34
+ yResult.forEach(function (el) {
35
+ el.source = 'endRange';
36
+ result.push(el);
37
+ });
38
+ // 13. Return ? CollapseNumberRange(numberFormat, result).
30
39
  return CollapseNumberRange(numberFormat, result, { getInternalSlots: getInternalSlots });
31
- // TODO: Needs to implement Range Pattern Processing https://unicode-org.github.io/cldr/ldml/tr35-numbers.html#range-pattern-processing
32
40
  }