mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-02-09 17:25:04 +00:00
This uses ICU for all of the Intl.PluralRules prototypes, which lets us remove all data from our plural rules generator. Plural rules depend directly on internal data from the number formatter, so rather than creating a separate Locale::PluralRules class (which will make accessing that data awkward), this adds plural rules APIs to the existing Locale::NumberFormat.
176 lines
4.1 KiB
C++
176 lines
4.1 KiB
C++
/*
|
|
* Copyright (c) 2021-2024, Tim Flynn <trflynn89@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Optional.h>
|
|
#include <AK/String.h>
|
|
#include <AK/StringView.h>
|
|
#include <AK/Variant.h>
|
|
#include <AK/Vector.h>
|
|
#include <LibLocale/Forward.h>
|
|
#include <LibLocale/PluralRules.h>
|
|
|
|
namespace Locale {
|
|
|
|
enum class NumberFormatStyle {
|
|
Decimal,
|
|
Percent,
|
|
Currency,
|
|
Unit,
|
|
};
|
|
NumberFormatStyle number_format_style_from_string(StringView);
|
|
StringView number_format_style_to_string(NumberFormatStyle);
|
|
|
|
enum class SignDisplay {
|
|
Auto,
|
|
Never,
|
|
Always,
|
|
ExceptZero,
|
|
Negative,
|
|
};
|
|
SignDisplay sign_display_from_string(StringView);
|
|
StringView sign_display_to_string(SignDisplay);
|
|
|
|
enum class Notation {
|
|
Standard,
|
|
Scientific,
|
|
Engineering,
|
|
Compact,
|
|
};
|
|
Notation notation_from_string(StringView);
|
|
StringView notation_to_string(Notation);
|
|
|
|
enum class CompactDisplay {
|
|
Short,
|
|
Long,
|
|
};
|
|
CompactDisplay compact_display_from_string(StringView);
|
|
StringView compact_display_to_string(CompactDisplay);
|
|
|
|
enum class Grouping {
|
|
Always,
|
|
Auto,
|
|
Min2,
|
|
False,
|
|
};
|
|
Grouping grouping_from_string(StringView);
|
|
StringView grouping_to_string(Grouping);
|
|
|
|
enum class CurrencyDisplay {
|
|
Code,
|
|
Symbol,
|
|
NarrowSymbol,
|
|
Name,
|
|
};
|
|
CurrencyDisplay currency_display_from_string(StringView);
|
|
StringView currency_display_to_string(CurrencyDisplay);
|
|
|
|
enum class CurrencySign {
|
|
Standard,
|
|
Accounting,
|
|
};
|
|
CurrencySign currency_sign_from_string(StringView);
|
|
StringView currency_sign_to_string(CurrencySign);
|
|
|
|
struct DisplayOptions {
|
|
NumberFormatStyle style { NumberFormatStyle::Decimal };
|
|
SignDisplay sign_display { SignDisplay::Auto };
|
|
|
|
Notation notation { Notation::Standard };
|
|
Optional<CompactDisplay> compact_display;
|
|
|
|
Grouping grouping { Grouping::Always };
|
|
|
|
Optional<String> currency;
|
|
Optional<CurrencyDisplay> currency_display;
|
|
Optional<CurrencySign> currency_sign;
|
|
|
|
Optional<String> unit;
|
|
Optional<Style> unit_display;
|
|
};
|
|
|
|
enum class RoundingType {
|
|
SignificantDigits,
|
|
FractionDigits,
|
|
MorePrecision,
|
|
LessPrecision,
|
|
};
|
|
RoundingType rounding_type_from_string(StringView);
|
|
StringView rounding_type_to_string(RoundingType);
|
|
|
|
enum class RoundingMode {
|
|
Ceil,
|
|
Expand,
|
|
Floor,
|
|
HalfCeil,
|
|
HalfEven,
|
|
HalfExpand,
|
|
HalfFloor,
|
|
HalfTrunc,
|
|
Trunc,
|
|
};
|
|
RoundingMode rounding_mode_from_string(StringView);
|
|
StringView rounding_mode_to_string(RoundingMode);
|
|
|
|
enum class TrailingZeroDisplay {
|
|
Auto,
|
|
StripIfInteger,
|
|
};
|
|
TrailingZeroDisplay trailing_zero_display_from_string(StringView);
|
|
StringView trailing_zero_display_to_string(TrailingZeroDisplay);
|
|
|
|
struct RoundingOptions {
|
|
RoundingType type { RoundingType::MorePrecision };
|
|
RoundingMode mode { RoundingMode::HalfExpand };
|
|
TrailingZeroDisplay trailing_zero_display { TrailingZeroDisplay::Auto };
|
|
|
|
Optional<int> min_significant_digits;
|
|
Optional<int> max_significant_digits;
|
|
|
|
Optional<int> min_fraction_digits;
|
|
Optional<int> max_fraction_digits;
|
|
|
|
int min_integer_digits { 0 };
|
|
int rounding_increment { 1 };
|
|
};
|
|
|
|
class NumberFormat {
|
|
public:
|
|
static NonnullOwnPtr<NumberFormat> create(
|
|
StringView locale,
|
|
StringView numbering_system,
|
|
DisplayOptions const&,
|
|
RoundingOptions const&);
|
|
|
|
virtual ~NumberFormat() = default;
|
|
|
|
struct Partition {
|
|
StringView type;
|
|
String value;
|
|
StringView source;
|
|
};
|
|
|
|
using Value = Variant<double, String>;
|
|
|
|
virtual String format(Value const&) const = 0;
|
|
virtual String format_to_decimal(Value const&) const = 0;
|
|
virtual Vector<Partition> format_to_parts(Value const&) const = 0;
|
|
|
|
virtual String format_range(Value const&, Value const&) const = 0;
|
|
virtual Vector<Partition> format_range_to_parts(Value const&, Value const&) const = 0;
|
|
|
|
virtual void create_plural_rules(PluralForm) = 0;
|
|
virtual PluralCategory select_plural(double) const = 0;
|
|
virtual PluralCategory select_plural_range(double, double) const = 0;
|
|
virtual Vector<PluralCategory> available_plural_categories() const = 0;
|
|
|
|
protected:
|
|
NumberFormat() = default;
|
|
};
|
|
|
|
}
|