NumberFormat.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*
  2. * Copyright (c) 2021-2024, Tim Flynn <trflynn89@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Optional.h>
  8. #include <AK/String.h>
  9. #include <AK/StringView.h>
  10. #include <AK/Variant.h>
  11. #include <AK/Vector.h>
  12. #include <LibUnicode/Forward.h>
  13. #include <LibUnicode/PluralRules.h>
  14. namespace Unicode {
  15. enum class NumberFormatStyle {
  16. Decimal,
  17. Percent,
  18. Currency,
  19. Unit,
  20. };
  21. NumberFormatStyle number_format_style_from_string(StringView);
  22. StringView number_format_style_to_string(NumberFormatStyle);
  23. enum class SignDisplay {
  24. Auto,
  25. Never,
  26. Always,
  27. ExceptZero,
  28. Negative,
  29. };
  30. SignDisplay sign_display_from_string(StringView);
  31. StringView sign_display_to_string(SignDisplay);
  32. enum class Notation {
  33. Standard,
  34. Scientific,
  35. Engineering,
  36. Compact,
  37. };
  38. Notation notation_from_string(StringView);
  39. StringView notation_to_string(Notation);
  40. enum class CompactDisplay {
  41. Short,
  42. Long,
  43. };
  44. CompactDisplay compact_display_from_string(StringView);
  45. StringView compact_display_to_string(CompactDisplay);
  46. enum class Grouping {
  47. Always,
  48. Auto,
  49. Min2,
  50. False,
  51. };
  52. Grouping grouping_from_string(StringView);
  53. StringView grouping_to_string(Grouping);
  54. enum class CurrencyDisplay {
  55. Code,
  56. Symbol,
  57. NarrowSymbol,
  58. Name,
  59. };
  60. CurrencyDisplay currency_display_from_string(StringView);
  61. StringView currency_display_to_string(CurrencyDisplay);
  62. enum class CurrencySign {
  63. Standard,
  64. Accounting,
  65. };
  66. CurrencySign currency_sign_from_string(StringView);
  67. StringView currency_sign_to_string(CurrencySign);
  68. struct DisplayOptions {
  69. NumberFormatStyle style { NumberFormatStyle::Decimal };
  70. SignDisplay sign_display { SignDisplay::Auto };
  71. Notation notation { Notation::Standard };
  72. Optional<CompactDisplay> compact_display;
  73. Grouping grouping { Grouping::Always };
  74. Optional<String> currency;
  75. Optional<CurrencyDisplay> currency_display;
  76. Optional<CurrencySign> currency_sign;
  77. Optional<String> unit;
  78. Optional<Style> unit_display;
  79. };
  80. enum class RoundingType {
  81. SignificantDigits,
  82. FractionDigits,
  83. MorePrecision,
  84. LessPrecision,
  85. };
  86. RoundingType rounding_type_from_string(StringView);
  87. StringView rounding_type_to_string(RoundingType);
  88. enum class RoundingMode {
  89. Ceil,
  90. Expand,
  91. Floor,
  92. HalfCeil,
  93. HalfEven,
  94. HalfExpand,
  95. HalfFloor,
  96. HalfTrunc,
  97. Trunc,
  98. };
  99. RoundingMode rounding_mode_from_string(StringView);
  100. StringView rounding_mode_to_string(RoundingMode);
  101. enum class TrailingZeroDisplay {
  102. Auto,
  103. StripIfInteger,
  104. };
  105. TrailingZeroDisplay trailing_zero_display_from_string(StringView);
  106. StringView trailing_zero_display_to_string(TrailingZeroDisplay);
  107. struct RoundingOptions {
  108. RoundingType type { RoundingType::MorePrecision };
  109. RoundingMode mode { RoundingMode::HalfExpand };
  110. TrailingZeroDisplay trailing_zero_display { TrailingZeroDisplay::Auto };
  111. Optional<int> min_significant_digits;
  112. Optional<int> max_significant_digits;
  113. Optional<int> min_fraction_digits;
  114. Optional<int> max_fraction_digits;
  115. int min_integer_digits { 0 };
  116. int rounding_increment { 1 };
  117. };
  118. class NumberFormat {
  119. public:
  120. static NonnullOwnPtr<NumberFormat> create(
  121. StringView locale,
  122. StringView numbering_system,
  123. DisplayOptions const&,
  124. RoundingOptions const&);
  125. virtual ~NumberFormat() = default;
  126. struct Partition {
  127. StringView type;
  128. String value;
  129. StringView source;
  130. };
  131. using Value = Variant<double, String>;
  132. virtual String format(Value const&) const = 0;
  133. virtual String format_to_decimal(Value const&) const = 0;
  134. virtual Vector<Partition> format_to_parts(Value const&) const = 0;
  135. virtual String format_range(Value const&, Value const&) const = 0;
  136. virtual Vector<Partition> format_range_to_parts(Value const&, Value const&) const = 0;
  137. virtual void create_plural_rules(PluralForm) = 0;
  138. virtual PluralCategory select_plural(double) const = 0;
  139. virtual PluralCategory select_plural_range(double, double) const = 0;
  140. virtual Vector<PluralCategory> available_plural_categories() const = 0;
  141. protected:
  142. NumberFormat() = default;
  143. };
  144. }