1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 19:27:44 +00:00

LibUnicode: Replace NumberFormat::Plurality with Unicode::PluralCategory

To prepare for using plural rules within number & duration format, this
removes the NumberFormat::Plurality enumeration.

This also adds PluralCategory::ExactlyZero & PluralCategory::ExactlyOne.
These are used in locales like French, where PluralCategory::One really
means any value from 0.00 to 1.99. PluralCategory::ExactlyOne means only
the value 1, as the name implies. These exact rules are not known by the
general plural rules, they are explicitly for number / currency format.
This commit is contained in:
Timothy Flynn 2022-07-08 10:16:43 -04:00 committed by Linus Groh
parent cc5c707649
commit 232df4196b
3 changed files with 26 additions and 40 deletions

View file

@ -11,6 +11,7 @@
#include <AK/StringView.h>
#include <AK/Vector.h>
#include <LibUnicode/Forward.h>
#include <LibUnicode/PluralRules.h>
namespace Unicode {
@ -36,19 +37,9 @@ enum class CompactNumberFormatType : u8 {
};
struct NumberFormat {
enum class Plurality : u8 {
Other,
Zero,
Single,
One,
Two,
Few,
Many,
};
u8 magnitude { 0 };
u8 exponent { 0 };
Plurality plurality { Plurality::Other };
PluralCategory plurality { PluralCategory::Other };
StringView zero_format {};
StringView positive_format {};
StringView negative_format {};
@ -94,20 +85,20 @@ Optional<FormatType> select_pattern_with_plurality(Vector<FormatType> const& for
};
if (number == 0) {
if (auto patterns = find_plurality(FormatType::Plurality::Zero); patterns.has_value())
if (auto patterns = find_plurality(PluralCategory::Zero); patterns.has_value())
return patterns;
} else if (number == 1) {
if (auto patterns = find_plurality(FormatType::Plurality::One); patterns.has_value())
if (auto patterns = find_plurality(PluralCategory::One); patterns.has_value())
return patterns;
} else if (number == 2) {
if (auto patterns = find_plurality(FormatType::Plurality::Two); patterns.has_value())
if (auto patterns = find_plurality(PluralCategory::Two); patterns.has_value())
return patterns;
} else if (number > 2) {
if (auto patterns = find_plurality(FormatType::Plurality::Many); patterns.has_value())
if (auto patterns = find_plurality(PluralCategory::Many); patterns.has_value())
return patterns;
}
return find_plurality(FormatType::Plurality::Other);
return find_plurality(PluralCategory::Other);
}
}

View file

@ -25,6 +25,10 @@ enum class PluralCategory : u8 {
Two,
Few,
Many,
// https://unicode.org/reports/tr35/tr35-numbers.html#Explicit_0_1_rules
ExactlyZero,
ExactlyOne,
};
// https://unicode.org/reports/tr35/tr35-numbers.html#Plural_Operand_Meanings
@ -81,6 +85,10 @@ constexpr PluralCategory plural_category_from_string(StringView category)
return PluralCategory::Few;
if (category == "many"sv)
return PluralCategory::Many;
if (category == "0"sv)
return PluralCategory::ExactlyZero;
if (category == "1"sv)
return PluralCategory::ExactlyOne;
VERIFY_NOT_REACHED();
}
@ -100,6 +108,10 @@ constexpr StringView plural_category_to_string(PluralCategory category)
return "few"sv;
case PluralCategory::Many:
return "many"sv;
case PluralCategory::ExactlyZero:
return "0"sv;
case PluralCategory::ExactlyOne:
return "1"sv;
}
VERIFY_NOT_REACHED();