• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef OHOS_GLOBAL_I18N_NUMBER_FORMAT_H
16 #define OHOS_GLOBAL_I18N_NUMBER_FORMAT_H
17 
18 #include <map>
19 #include <mutex>
20 #include <set>
21 #include <unordered_map>
22 #include <vector>
23 #include "unicode/numberformatter.h"
24 #include "unicode/locid.h"
25 #include "unicode/numfmt.h"
26 #include "unicode/unum.h"
27 #include "unicode/decimfmt.h"
28 #include "unicode/localebuilder.h"
29 #include "unicode/numsys.h"
30 #include "unicode/measfmt.h"
31 #include "unicode/measunit.h"
32 #include "unicode/measure.h"
33 #include "unicode/currunit.h"
34 #include "unicode/fmtable.h"
35 #include "unicode/ures.h"
36 #include "unicode/ulocdata.h"
37 #include "number_utils.h"
38 #include "number_utypes.h"
39 #include "locale_info.h"
40 #include "measure_data.h"
41 #include "relative_time_format.h"
42 #include "unicode/numberrangeformatter.h"
43 
44 namespace OHOS {
45 namespace Global {
46 namespace I18n {
47 class NumberFormat {
48 public:
49     NumberFormat(const std::vector<std::string> &localeTag, std::map<std::string, std::string> &configs);
50     virtual ~NumberFormat();
51     std::string Format(double number);
52     bool IsRelativeTimeFormat(double number);
53     icu::number::FormattedNumber FormatToFormattedNumber(double number);
54     icu::FormattedRelativeDateTime FormatToFormattedRelativeDateTime(double number);
55     std::string FormatRange(double start, double end);
56     void GetResolvedOptions(std::map<std::string, std::string> &map);
57     std::string GetCurrency() const;
58     std::string GetCurrencySign() const;
59     std::string GetStyle() const;
60     std::string GetNumberingSystem() const;
61     std::string GetUseGrouping() const;
62     std::string GetMinimumIntegerDigits() const;
63     std::string GetMinimumFractionDigits() const;
64     std::string GetMaximumFractionDigits() const;
65     std::string GetMinimumSignificantDigits() const;
66     std::string GetMaximumSignificantDigits() const;
67     std::string GetLocaleMatcher() const;
68 
69 private:
70     icu::Locale locale;
71     std::string currency;
72     std::string currencySign = "standard";
73     std::string currencyDisplayString;
74     std::string unit;
75     std::string unitDisplayString;
76     std::string styleString;
77     std::string numberingSystem;
78     std::string useGrouping;
79     std::string notationString;
80     std::string signDisplayString = "auto";
81     std::string compactDisplay;
82     std::string minimumIntegerDigits;
83     std::string minimumFractionDigits;
84     std::string maximumFractionDigits;
85     std::string minimumSignificantDigits;
86     std::string maximumSignificantDigits;
87     std::string localeBaseName;
88     std::string localeMatcher;
89     std::string unitUsage;
90     std::string unitType;
91     std::string unitMeasSys;
92     std::string roundingPriorityStr;
93     std::string roundingModeStr;
94     size_t roundingIncrement = 1;
95     bool createSuccess = false;
96     bool isSetFraction = false;
97     std::unique_ptr<LocaleInfo> localeInfo = nullptr;
98     std::unique_ptr<RelativeTimeFormat> relativeTimeFormat = nullptr;
99     icu::number::LocalizedNumberFormatter numberFormat;
100     icu::number::LocalizedNumberRangeFormatter numberRangeFormat;
101     icu::number::Notation notation = icu::number::Notation::simple();
102     UNumberRoundingPriority roundingPriority = UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_STRICT;
103     UNumberFormatRoundingMode roundingMode = UNumberFormatRoundingMode::UNUM_ROUND_HALFUP;
104     UNumberUnitWidth unitDisplay = UNumberUnitWidth::UNUM_UNIT_WIDTH_SHORT;
105     UNumberUnitWidth currencyDisplay = UNumberUnitWidth::UNUM_UNIT_WIDTH_SHORT;
106     UNumberSignDisplay signDisplay = UNumberSignDisplay::UNUM_SIGN_AUTO;
107     static const int MAX_UNIT_NUM = 500;
108     static const int DEFAULT_FRACTION_DIGITS = 3;
109     static const int DEFAULT_MAX_SIGNIFICANT_DIGITS = 21;
110     static const char *DEVICE_TYPE_NAME;
111     static const int BUFFER_LEN = 10;
112     static const int POW_BASE_NUMBER = 10;
113     static const int CURRENCY_LEN = 3;
114     static std::mutex numToCurrencyMutex;
115     static bool initISO4217;
116     static std::unordered_map<std::string, std::string> numToCurrency;
117     icu::MeasureUnit unitArray[MAX_UNIT_NUM];
118     static bool icuInitialized;
119     static bool Init();
120     static std::unordered_map<std::string, UNumberUnitWidth> unitStyle;
121     static std::unordered_map<std::string, UNumberUnitWidth> currencyStyle;
122     static std::unordered_map<std::string, UNumberSignDisplay> signAutoStyle;
123     static std::unordered_map<std::string, UNumberSignDisplay> signAccountingStyle;
124     static std::unordered_map<UMeasurementSystem, std::string> measurementSystem;
125     static std::unordered_map<std::string, UNumberUnitWidth> defaultUnitStyle;
126     static std::unordered_map<std::string, UNumberUnitWidth> defaultCurrencyStyle;
127     static std::unordered_map<std::string, UNumberRoundingPriority> roundingPriorityStyle;
128     static std::unordered_map<std::string, UNumberFormatRoundingMode> roundingModeStyle;
129     static std::vector<size_t> roundingIncrementList;
130     static std::map<std::string, std::string> RelativeTimeFormatConfigs;
131     static bool ReadISO4217Datas();
132     std::string GetCurrencyFromConfig(const std::string& currency);
133     void CreateRelativeTimeFormat(const std::string& locale);
134     void ParseConfigs(std::map<std::string, std::string> &configs);
135     void ParseDigitsConfigs(std::map<std::string, std::string> &configs);
136     void ParseRoundingConfigs(std::map<std::string, std::string> &configs);
137     void GetDigitsResolvedOptions(std::map<std::string, std::string> &map);
138     void InitProperties(icu::number::UnlocalizedNumberFormatter &formatter);
139     void InitUnitProperties(icu::number::UnlocalizedNumberFormatter &formatter);
140     void InitCurrencyProperties(icu::number::UnlocalizedNumberFormatter &formatter);
141     void InitPercentStyleProperties(icu::number::UnlocalizedNumberFormatter &formatter);
142     void InitUseGroupingProperties(icu::number::UnlocalizedNumberFormatter &formatter);
143     void InitNotationProperties(icu::number::UnlocalizedNumberFormatter &formatter);
144     void InitSignProperties(icu::number::UnlocalizedNumberFormatter &formatter);
145     void InitDigitsProperties(icu::number::UnlocalizedNumberFormatter &formatter);
146     void InitNumberFormat();
147     void SetUnit(std::string &preferredUnit);
148     void SetDefaultStyle();
149     void SetPrecisionWithByte(double number, const std::string& finalUnit);
150     void HandleRoundingPriority(icu::number::UnlocalizedNumberFormatter &formatter);
151     void SetRoundingProperties(icu::number::UnlocalizedNumberFormatter &formatter);
152     int32_t GetMinimumSignificantDigitsIntValue();
153     int32_t GetMaximumSignificantDigitsIntValue();
154     int32_t GetMaximumFractionDigitsValue();
155     int32_t GetMinimumFractionDigitsValue();
156 };
157 } // namespace I18n
158 } // namespace Global
159 } // namespace OHOS
160 #endif