owlcub-academy/node_modules/@formatjs/ecma402-abstract/lib/NumberFormat/PartitionNumberPattern.js

127 lines
4.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Decimal from 'decimal.js';
import { invariant } from '../utils';
import { ComputeExponent } from './ComputeExponent';
import formatToParts from './format_to_parts';
import { FormatNumericToString } from './FormatNumericToString';
/**
* https://tc39.es/ecma402/#sec-partitionnumberpattern
*/
export function PartitionNumberPattern(internalSlots, _x) {
var _a;
var x = _x;
// IMPL: We need to record the magnitude of the number
var magnitude = 0;
// 2. Let dataLocaleData be internalSlots.[[dataLocaleData]].
var pl = internalSlots.pl, dataLocaleData = internalSlots.dataLocaleData, numberingSystem = internalSlots.numberingSystem;
// 3. Let symbols be dataLocaleData.[[numbers]].[[symbols]][internalSlots.[[numberingSystem]]].
var symbols = dataLocaleData.numbers.symbols[numberingSystem] ||
dataLocaleData.numbers.symbols[dataLocaleData.numbers.nu[0]];
// 4. Let exponent be 0.
var exponent = 0;
// 5. Let n be ! ToString(x).
var n;
// 6. If x is NaN, then
if (x.isNaN()) {
// 6.a. Let n be symbols.[[nan]].
n = symbols.nan;
}
else if (!x.isFinite()) {
// 7. Else if x is a non-finite Number, then
// 7.a. Let n be symbols.[[infinity]].
n = symbols.infinity;
}
else {
// 8. Else,
if (!x.isZero()) {
// 8.a. If x < 0, let x be -x.
invariant(x.isFinite(), 'Input must be a mathematical value');
// 8.b. If internalSlots.[[style]] is "percent", let x be 100 × x.
if (internalSlots.style == 'percent') {
x = x.times(100);
}
// 8.c. Let exponent be ComputeExponent(numberFormat, x).
;
_a = ComputeExponent(internalSlots, x), exponent = _a[0],
// IMPL: We need to record the magnitude of the number
magnitude = _a[1];
// 8.d. Let x be x × 10^(-exponent).
x = x.times(Decimal.pow(10, -exponent));
}
// 8.e. Let formatNumberResult be FormatNumericToString(internalSlots, x).
var formatNumberResult = FormatNumericToString(internalSlots, x);
// 8.f. Let n be formatNumberResult.[[formattedString]].
n = formatNumberResult.formattedString;
// 8.g. Let x be formatNumberResult.[[roundedNumber]].
x = formatNumberResult.roundedNumber;
}
// 9. Let sign be 0.
var sign;
// 10. If x is negative, then
var signDisplay = internalSlots.signDisplay;
switch (signDisplay) {
case 'never':
// 10.a. If internalSlots.[[signDisplay]] is "never", then
// 10.a.i. Let sign be 0.
sign = 0;
break;
case 'auto':
// 10.b. Else if internalSlots.[[signDisplay]] is "auto", then
if (x.isPositive() || x.isNaN()) {
// 10.b.i. If x is positive or x is NaN, let sign be 0.
sign = 0;
}
else {
// 10.b.ii. Else, let sign be -1.
sign = -1;
}
break;
case 'always':
// 10.c. Else if internalSlots.[[signDisplay]] is "always", then
if (x.isPositive() || x.isNaN()) {
// 10.c.i. If x is positive or x is NaN, let sign be 1.
sign = 1;
}
else {
// 10.c.ii. Else, let sign be -1.
sign = -1;
}
break;
case 'exceptZero':
// 10.d. Else if internalSlots.[[signDisplay]] is "exceptZero", then
if (x.isZero()) {
// 10.d.i. If x is 0, let sign be 0.
sign = 0;
}
else if (x.isNegative()) {
// 10.d.ii. Else if x is negative, let sign be -1.
sign = -1;
}
else {
// 10.d.iii. Else, let sign be 1.
sign = 1;
}
break;
default:
// 10.e. Else,
invariant(signDisplay === 'negative', 'signDisplay must be "negative"');
if (x.isNegative() && !x.isZero()) {
// 10.e.i. If x is negative and x is not 0, let sign be -1.
sign = -1;
}
else {
// 10.e.ii. Else, let sign be 0.
sign = 0;
}
break;
}
// 11. Return ? FormatNumberToParts(numberFormat, x, n, exponent, sign).
return formatToParts({
roundedNumber: x,
formattedString: n,
exponent: exponent,
// IMPL: We're returning this for our implementation of formatToParts
magnitude: magnitude,
sign: sign,
}, internalSlots.dataLocaleData, pl, internalSlots);
}