1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 13:17:35 +00:00

LibJS: Explicitly handle postive/negative infinity in Intl.NumberFormat

This is a normative change in the Intl spec:
f0f66cf

Our implementation is unaffected by this change. LibUnicode pre-computes
positive, negative, and signless format patterns, so we already format
negative infinity correctly. Also, the CLDR does not contain specific
locale-dependent strings for negative infinity anyways.
This commit is contained in:
Timothy Flynn 2021-12-31 16:10:54 -05:00 committed by Linus Groh
parent 950784b5a6
commit a3149c11e5

View file

@ -608,12 +608,19 @@ Vector<PatternPartition> partition_number_pattern(NumberFormat& number_format, d
// a. Let n be an implementation- and locale-dependent (ILD) String value indicating the NaN value. // a. Let n be an implementation- and locale-dependent (ILD) String value indicating the NaN value.
formatted_string = Unicode::get_number_system_symbol(number_format.data_locale(), number_format.numbering_system(), Unicode::NumericSymbol::NaN).value_or("NaN"sv); formatted_string = Unicode::get_number_system_symbol(number_format.data_locale(), number_format.numbering_system(), Unicode::NumericSymbol::NaN).value_or("NaN"sv);
} }
// 3. Else if x is a non-finite Number, then // 3. Else if x is +∞, then
else if (!Value(number).is_finite_number()) { else if (Value(number).is_positive_infinity()) {
// a. Let n be an ILD String value indicating infinity. // a. Let n be an ILD String value indicating positive infinity.
formatted_string = Unicode::get_number_system_symbol(number_format.data_locale(), number_format.numbering_system(), Unicode::NumericSymbol::Infinity).value_or("infinity"sv); formatted_string = Unicode::get_number_system_symbol(number_format.data_locale(), number_format.numbering_system(), Unicode::NumericSymbol::Infinity).value_or("infinity"sv);
} }
// 4. Else, // 4. Else if x is -∞, then
else if (Value(number).is_negative_infinity()) {
// a. Let n be an ILD String value indicating negative infinity.
// NOTE: The CLDR does not contain unique strings for negative infinity. The negative sign will
// be inserted by the pattern returned from GetNumberFormatPattern.
formatted_string = Unicode::get_number_system_symbol(number_format.data_locale(), number_format.numbering_system(), Unicode::NumericSymbol::Infinity).value_or("infinity"sv);
}
// 5. Else,
else { else {
// a. If numberFormat.[[Style]] is "percent", let x be 100 × x. // a. If numberFormat.[[Style]] is "percent", let x be 100 × x.
if (number_format.style() == NumberFormat::Style::Percent) if (number_format.style() == NumberFormat::Style::Percent)
@ -637,18 +644,18 @@ Vector<PatternPartition> partition_number_pattern(NumberFormat& number_format, d
Unicode::NumberFormat found_pattern {}; Unicode::NumberFormat found_pattern {};
// 5. Let pattern be GetNumberFormatPattern(numberFormat, x). // 6. Let pattern be GetNumberFormatPattern(numberFormat, x).
auto pattern = get_number_format_pattern(number_format, number, found_pattern); auto pattern = get_number_format_pattern(number_format, number, found_pattern);
if (!pattern.has_value()) if (!pattern.has_value())
return {}; return {};
// 6. Let result be a new empty List. // 7. Let result be a new empty List.
Vector<PatternPartition> result; Vector<PatternPartition> result;
// 7. Let patternParts be PartitionPattern(pattern). // 8. Let patternParts be PartitionPattern(pattern).
auto pattern_parts = pattern->visit([](auto const& p) { return partition_pattern(p); }); auto pattern_parts = pattern->visit([](auto const& p) { return partition_pattern(p); });
// 8. For each Record { [[Type]], [[Value]] } patternPart of patternParts, do // 9. For each Record { [[Type]], [[Value]] } patternPart of patternParts, do
for (auto& pattern_part : pattern_parts) { for (auto& pattern_part : pattern_parts) {
// a. Let p be patternPart.[[Type]]. // a. Let p be patternPart.[[Type]].
auto part = pattern_part.type; auto part = pattern_part.type;
@ -729,7 +736,7 @@ Vector<PatternPartition> partition_number_pattern(NumberFormat& number_format, d
} }
} }
// 9. Return result. // 10. Return result.
return result; return result;
} }