Serenity Operating System
1/*
2 * Copyright (c) 2021-2023, Tim Flynn <trflynn89@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/Error.h>
10#include <AK/Optional.h>
11#include <AK/String.h>
12#include <AK/StringView.h>
13#include <AK/Vector.h>
14#include <LibLocale/Forward.h>
15#include <LibLocale/PluralRules.h>
16
17namespace Locale {
18
19struct NumberGroupings {
20 u8 minimum_grouping_digits { 0 };
21 u8 primary_grouping_size { 0 };
22 u8 secondary_grouping_size { 0 };
23};
24
25enum class StandardNumberFormatType : u8 {
26 Decimal,
27 Currency,
28 Accounting,
29 Percent,
30 Scientific,
31};
32
33enum class CompactNumberFormatType : u8 {
34 DecimalLong,
35 DecimalShort,
36 CurrencyUnit,
37 CurrencyShort,
38};
39
40struct NumberFormat {
41 u8 magnitude { 0 };
42 u8 exponent { 0 };
43 PluralCategory plurality { PluralCategory::Other };
44 StringView zero_format {};
45 StringView positive_format {};
46 StringView negative_format {};
47 Vector<StringView> identifiers {};
48};
49
50enum class NumericSymbol : u8 {
51 ApproximatelySign,
52 Decimal,
53 Exponential,
54 Group,
55 Infinity,
56 MinusSign,
57 NaN,
58 PercentSign,
59 PlusSign,
60 RangeSeparator,
61 TimeSeparator,
62};
63
64ErrorOr<Optional<StringView>> get_number_system_symbol(StringView locale, StringView system, NumericSymbol symbol);
65ErrorOr<Optional<NumberGroupings>> get_number_system_groupings(StringView locale, StringView system);
66
67Optional<ReadonlySpan<u32>> get_digits_for_number_system(StringView system);
68ErrorOr<String> replace_digits_for_number_system(StringView system, StringView number);
69
70ErrorOr<Optional<NumberFormat>> get_standard_number_system_format(StringView locale, StringView system, StandardNumberFormatType type);
71ErrorOr<Vector<NumberFormat>> get_compact_number_system_formats(StringView locale, StringView system, CompactNumberFormatType type);
72ErrorOr<Vector<NumberFormat>> get_unit_formats(StringView locale, StringView unit, Style style);
73
74ErrorOr<Optional<String>> augment_currency_format_pattern(StringView currency_display, StringView base_pattern);
75ErrorOr<Optional<String>> augment_range_pattern(StringView range_separator, StringView lower, StringView upper);
76
77}