19596a2c1Sopenharmony_ci/*
29596a2c1Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
39596a2c1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
49596a2c1Sopenharmony_ci * you may not use this file except in compliance with the License.
59596a2c1Sopenharmony_ci * You may obtain a copy of the License at
69596a2c1Sopenharmony_ci *
79596a2c1Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
89596a2c1Sopenharmony_ci *
99596a2c1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
109596a2c1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
119596a2c1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129596a2c1Sopenharmony_ci * See the License for the specific language governing permissions and
139596a2c1Sopenharmony_ci * limitations under the License.
149596a2c1Sopenharmony_ci */
159596a2c1Sopenharmony_ci#include "measure_data.h"
169596a2c1Sopenharmony_ci#include <string>
179596a2c1Sopenharmony_ci#include <unordered_map>
189596a2c1Sopenharmony_ci#include <cmath>
199596a2c1Sopenharmony_ci#include "utils.h"
209596a2c1Sopenharmony_ci
219596a2c1Sopenharmony_cinamespace OHOS {
229596a2c1Sopenharmony_cinamespace Global {
239596a2c1Sopenharmony_cinamespace I18n {
249596a2c1Sopenharmony_ciusing namespace std;
259596a2c1Sopenharmony_ciconst double FT_TO_M = 0.3048;
269596a2c1Sopenharmony_ciconst double FT2_TO_M2 = FT_TO_M * FT_TO_M;
279596a2c1Sopenharmony_ciconst double FT3_TO_M3 = FT_TO_M * FT2_TO_M2;
289596a2c1Sopenharmony_ciconst double IN3_TO_M3 = FT3_TO_M3 / (12 * 12 * 12);
299596a2c1Sopenharmony_ciconst double GAL_IMP_TO_M3 = 0.00454609;
309596a2c1Sopenharmony_ciconst double GAL_TO_M3 = 231 * IN3_TO_M3;
319596a2c1Sopenharmony_ciconst int REGION_OFFSET = 7;
329596a2c1Sopenharmony_ciconst int BASE_VALUE_SIZE = 2;
339596a2c1Sopenharmony_ciconst int FACTOR_SIZE = 2;
349596a2c1Sopenharmony_ciconst int CHAR_OFFSET = 48;
359596a2c1Sopenharmony_ciconst int MAX_UNIT_NUM = 500;
369596a2c1Sopenharmony_ci
379596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_001 {
389596a2c1Sopenharmony_ci    { "area-land-agricult", { "hectare" } },
399596a2c1Sopenharmony_ci    { "area-land-commercl", { "hectare" } },
409596a2c1Sopenharmony_ci    { "area-land-residntl", { "hectare" } },
419596a2c1Sopenharmony_ci    { "length-person", { "centimeter" } },
429596a2c1Sopenharmony_ci    { "length-person-small", { "centimeter" } },
439596a2c1Sopenharmony_ci    { "length-rainfall", { "millimeter" } },
449596a2c1Sopenharmony_ci    { "length-road", { "meter" } },
459596a2c1Sopenharmony_ci    { "length-road-small", { "meter" } },
469596a2c1Sopenharmony_ci    { "length-snowfall", { "centimeter" } },
479596a2c1Sopenharmony_ci    { "length-vehicle", { "meter" } },
489596a2c1Sopenharmony_ci    { "length-visiblty", { "meter" } },
499596a2c1Sopenharmony_ci    { "length-visiblty-small", { "meter" } },
509596a2c1Sopenharmony_ci    { "speed-road-travel", { "kilometer-per-hour" } },
519596a2c1Sopenharmony_ci    { "speed-wind", { "kilometer-per-hour" } },
529596a2c1Sopenharmony_ci    { "temperature-person", { "celsius" } },
539596a2c1Sopenharmony_ci    { "temperature-weather", { "celsius" } },
549596a2c1Sopenharmony_ci    { "volume-vehicle-fuel", { "liter" } },
559596a2c1Sopenharmony_ci};
569596a2c1Sopenharmony_ci
579596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_DEFAULT_001 {
589596a2c1Sopenharmony_ci    { "length", { "kilometer", "meter", "centimeter" } },
599596a2c1Sopenharmony_ci    { "area", { "square-kilometer", "hectare", "square-meter", "square-centimeter" } },
609596a2c1Sopenharmony_ci    { "speed", { "kilometer-per-hour" } },
619596a2c1Sopenharmony_ci    { "temperature", { "celsius" } },
629596a2c1Sopenharmony_ci    { "volume", { "cubic-meter", "cubic-centimeter" } },
639596a2c1Sopenharmony_ci};
649596a2c1Sopenharmony_ci
659596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_AT {
669596a2c1Sopenharmony_ci    { "length-person", { "meter", "centimeter" } },
679596a2c1Sopenharmony_ci};
689596a2c1Sopenharmony_ci
699596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_BR {
709596a2c1Sopenharmony_ci    { "length-person-informal", { "meter", "centimeter" } },
719596a2c1Sopenharmony_ci    { "length-rainfall", { "centimeter" } },
729596a2c1Sopenharmony_ci};
739596a2c1Sopenharmony_ci
749596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_BS {
759596a2c1Sopenharmony_ci    { "temperature-weather", { "fahrenheit" } },
769596a2c1Sopenharmony_ci};
779596a2c1Sopenharmony_ci
789596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_CA {
799596a2c1Sopenharmony_ci    { "length-person", { "inch" } },
809596a2c1Sopenharmony_ci    { "length-person-informal", { "foot", "inch" } },
819596a2c1Sopenharmony_ci    { "length-person-small-informal", { "inch" } },
829596a2c1Sopenharmony_ci};
839596a2c1Sopenharmony_ci
849596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_CN {
859596a2c1Sopenharmony_ci    { "length-person-informal", { "meter", "centimeter" } },
869596a2c1Sopenharmony_ci};
879596a2c1Sopenharmony_ci
889596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_DE {
899596a2c1Sopenharmony_ci    { "length-person-informal", { "meter", "centimeter" } },
909596a2c1Sopenharmony_ci    { "length-visiblty", { "meter" } },
919596a2c1Sopenharmony_ci};
929596a2c1Sopenharmony_ci
939596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_GB {
949596a2c1Sopenharmony_ci    { "area-land-agricult", { "acre" } },
959596a2c1Sopenharmony_ci    { "area-land-commercl", { "acre" } },
969596a2c1Sopenharmony_ci    { "area-land-residntl", { "acre" } },
979596a2c1Sopenharmony_ci    { "length-person", { "inch" } },
989596a2c1Sopenharmony_ci    { "length-person-informal", { "foot", "inch" } },
999596a2c1Sopenharmony_ci    { "length-person-small-informal", { "inch" } },
1009596a2c1Sopenharmony_ci    { "length-road", { "yard" } },
1019596a2c1Sopenharmony_ci    { "length-road-small", { "yard" } },
1029596a2c1Sopenharmony_ci    { "length-vehicle", { "foot", "inch" } },
1039596a2c1Sopenharmony_ci    { "length-visiblty", { "mile", "foot" } },
1049596a2c1Sopenharmony_ci    { "length-visiblty-small", { "foot" } },
1059596a2c1Sopenharmony_ci    { "speed-road-travel", { "mile-per-hour" } },
1069596a2c1Sopenharmony_ci};
1079596a2c1Sopenharmony_ci
1089596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_DEFAULT_GB {
1099596a2c1Sopenharmony_ci    { "length", { "mile", "foot", "inch" } },
1109596a2c1Sopenharmony_ci    { "area", { "square-mile", "acre", "square-foot", "square-inch" } },
1119596a2c1Sopenharmony_ci    { "speed", { "mile-per-hour" } },
1129596a2c1Sopenharmony_ci    { "volume", { "cubic-foot", "cubic-inch" } },
1139596a2c1Sopenharmony_ci};
1149596a2c1Sopenharmony_ci
1159596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_KR {
1169596a2c1Sopenharmony_ci    { "speed-wind", { "meter-per-second" } },
1179596a2c1Sopenharmony_ci};
1189596a2c1Sopenharmony_ci
1199596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_MX {
1209596a2c1Sopenharmony_ci    { "length-person-informal", { "meter", "centimeter" } },
1219596a2c1Sopenharmony_ci    { "length-vehicle", { "meter", "centimeter" } },
1229596a2c1Sopenharmony_ci};
1239596a2c1Sopenharmony_ci
1249596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_NL {
1259596a2c1Sopenharmony_ci    { "length-person-informal", { "meter", "centimeter" } },
1269596a2c1Sopenharmony_ci    { "length-visiblty", { "meter" } },
1279596a2c1Sopenharmony_ci};
1289596a2c1Sopenharmony_ci
1299596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_NO {
1309596a2c1Sopenharmony_ci    { "length-person-informal", { "meter", "centimeter" } },
1319596a2c1Sopenharmony_ci    { "speed-wind", { "meter-per-second" } },
1329596a2c1Sopenharmony_ci};
1339596a2c1Sopenharmony_ci
1349596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_SE {
1359596a2c1Sopenharmony_ci    { "length-person", { "meter", "centimeter" } },
1369596a2c1Sopenharmony_ci    { "length-road", { "mile-scandinavian", "kilometer" } },
1379596a2c1Sopenharmony_ci    { "length-road-informal", { "mile-scandinavian" } },
1389596a2c1Sopenharmony_ci    { "speed-wind", { "meter-per-second" } },
1399596a2c1Sopenharmony_ci};
1409596a2c1Sopenharmony_ci
1419596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_US {
1429596a2c1Sopenharmony_ci    { "area-land-agricult", { "acre" } },
1439596a2c1Sopenharmony_ci    { "area-land-commercl", { "acre" } },
1449596a2c1Sopenharmony_ci    { "area-land-residntl", { "acre" } },
1459596a2c1Sopenharmony_ci    { "length-person", { "inch" } },
1469596a2c1Sopenharmony_ci    { "length-person-informal", { "foot", "inch" } },
1479596a2c1Sopenharmony_ci    { "length-person-small", { "inch" } },
1489596a2c1Sopenharmony_ci    { "length-rainfall", { "inch" } },
1499596a2c1Sopenharmony_ci    { "length-road", { "mile" } },
1509596a2c1Sopenharmony_ci    { "length-road-small", { "foot" } },
1519596a2c1Sopenharmony_ci    { "length-snowfall", { "inch" } },
1529596a2c1Sopenharmony_ci    { "length-vehicle", { "foot", "inch" } },
1539596a2c1Sopenharmony_ci    { "length-visiblty", { "mile", "foot" } },
1549596a2c1Sopenharmony_ci    { "length-visiblty-small", { "foot" } },
1559596a2c1Sopenharmony_ci    { "speed-road-travel", { "mile-per-hour" } },
1569596a2c1Sopenharmony_ci    { "speed-wind", { "mile-per-hour" } },
1579596a2c1Sopenharmony_ci    { "temperature-person", { "fahrenheit" } },
1589596a2c1Sopenharmony_ci    { "temperature-weather", { "fahrenheit" } },
1599596a2c1Sopenharmony_ci    { "volume-vehicle-fuel", { "gallon" } },
1609596a2c1Sopenharmony_ci};
1619596a2c1Sopenharmony_ci
1629596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<std::string>> USAGE_DEFAULT_US {
1639596a2c1Sopenharmony_ci    { "length", { "mile", "foot", "inch" } },
1649596a2c1Sopenharmony_ci    { "area", { "square-mile", "acre", "square-foot", "square-inch" } },
1659596a2c1Sopenharmony_ci    { "speed", { "mile-per-hour" } },
1669596a2c1Sopenharmony_ci    { "temperature", { "fahrenheit" } },
1679596a2c1Sopenharmony_ci    { "volume", { "cubic-foot", "cubic-inch" } },
1689596a2c1Sopenharmony_ci};
1699596a2c1Sopenharmony_ci
1709596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::vector<double>> CONVERT_FACTORS {
1719596a2c1Sopenharmony_ci    { "acre", { FT2_TO_M2 * 43560, 0 } },
1729596a2c1Sopenharmony_ci    { "hectare", { 10000, 0 } },
1739596a2c1Sopenharmony_ci    { "dunam", { 1000, 0 } },
1749596a2c1Sopenharmony_ci    { "fathom", { FT_TO_M * 6, 0 } },
1759596a2c1Sopenharmony_ci    { "foot", { FT_TO_M, 0 } },
1769596a2c1Sopenharmony_ci    { "furlong", { FT_TO_M * 660, 0 } },
1779596a2c1Sopenharmony_ci    { "inch", { FT_TO_M / 12, 0 } },
1789596a2c1Sopenharmony_ci    { "meter", { 1, 0 } },
1799596a2c1Sopenharmony_ci    { "mile", { FT_TO_M * 5280, 0 } },
1809596a2c1Sopenharmony_ci    { "mile-scandinavian", { 10000, 0 } },
1819596a2c1Sopenharmony_ci    { "nautical-mile", { 1852, 0 } },
1829596a2c1Sopenharmony_ci    { "point", { FT_TO_M / 864, 0 } },
1839596a2c1Sopenharmony_ci    { "yard", { FT_TO_M * 3, 0 } },
1849596a2c1Sopenharmony_ci    { "knot", { 1852 / 3600.0, 0 } },
1859596a2c1Sopenharmony_ci    { "kilometer-per-hour", { 1000 / 3600.0, 0 } },
1869596a2c1Sopenharmony_ci    { "celsius", { 1, 273.15 }},
1879596a2c1Sopenharmony_ci    { "fahrenheit", {5.0 / 9, 2298.35 / 9 }},
1889596a2c1Sopenharmony_ci    { "kelvin", { 1, 0 } },
1899596a2c1Sopenharmony_ci    { "acre-foot", { 43560 * FT3_TO_M3, 0 } },
1909596a2c1Sopenharmony_ci    { "bushel", { GAL_IMP_TO_M3 * 8, 0 } },
1919596a2c1Sopenharmony_ci    { "bushel-UK", { GAL_IMP_TO_M3 * 8, 0 } },
1929596a2c1Sopenharmony_ci    { "bushel-US", { IN3_TO_M3 * 2150.42, 0 } },
1939596a2c1Sopenharmony_ci    { "cup", { GAL_IMP_TO_M3 / 16, 0 } },
1949596a2c1Sopenharmony_ci    { "cup-UK", { GAL_IMP_TO_M3 / 16, 0 } },
1959596a2c1Sopenharmony_ci    { "cup-US", { GAL_TO_M3 / 16, 0 } },
1969596a2c1Sopenharmony_ci    { "cup-metric", {0.00025, 0 } },
1979596a2c1Sopenharmony_ci    { "fluid-ounce", { GAL_IMP_TO_M3 / 128, 0 } },
1989596a2c1Sopenharmony_ci    { "fluid-ounce-imperial", { GAL_IMP_TO_M3 / 160, 0 } },
1999596a2c1Sopenharmony_ci    { "gallon", { GAL_TO_M3, 0 } },
2009596a2c1Sopenharmony_ci    { "gallon-imperial", { GAL_IMP_TO_M3, 0 } },
2019596a2c1Sopenharmony_ci    { "liter", {0.001, 0 } },
2029596a2c1Sopenharmony_ci    { "pint-metric", { 0.0005, 0 } },
2039596a2c1Sopenharmony_ci    { "pint", { GAL_IMP_TO_M3 / 8, 0 } },
2049596a2c1Sopenharmony_ci    { "pint-UK", { GAL_IMP_TO_M3 / 8, 0 } },
2059596a2c1Sopenharmony_ci    { "pint-US", { GAL_TO_M3 / 8, 0 } },
2069596a2c1Sopenharmony_ci    { "quart", { GAL_IMP_TO_M3 / 4, 0 } },
2079596a2c1Sopenharmony_ci    { "quart-UK", { GAL_IMP_TO_M3 / 4, 0 } },
2089596a2c1Sopenharmony_ci    { "quart-US", { GAL_TO_M3 / 4, 0 } },
2099596a2c1Sopenharmony_ci    { "tablespoon", { GAL_IMP_TO_M3 / 256, 0 } },
2109596a2c1Sopenharmony_ci    { "tablespoon-UK", { GAL_IMP_TO_M3 / 256, 0 } },
2119596a2c1Sopenharmony_ci    { "tablespoon-US", { GAL_TO_M3 / 256, 0 } },
2129596a2c1Sopenharmony_ci    { "teaspoon", { GAL_IMP_TO_M3 / (16 * 48), 0 } },
2139596a2c1Sopenharmony_ci    { "teaspoon-UK", { GAL_IMP_TO_M3 / (16 * 48), 0 } },
2149596a2c1Sopenharmony_ci    { "teaspoon-US", { GAL_TO_M3 / (16 * 48), 0 } },
2159596a2c1Sopenharmony_ci    { "barrel", { GAL_IMP_TO_M3 * 36, 0 } },
2169596a2c1Sopenharmony_ci    { "barrel-UK", { GAL_IMP_TO_M3 * 36, 0 } },
2179596a2c1Sopenharmony_ci    { "barrel-US", { GAL_TO_M3 * 42, 0 } },
2189596a2c1Sopenharmony_ci    { "hour", { 3600, 0 } },
2199596a2c1Sopenharmony_ci    { "second", { 1, 0 } },
2209596a2c1Sopenharmony_ci};
2219596a2c1Sopenharmony_ci
2229596a2c1Sopenharmony_ciconst std::unordered_map<std::string, std::string> CONVERT_TO_UNIT {
2239596a2c1Sopenharmony_ci    { "acre", "square-meter" },
2249596a2c1Sopenharmony_ci    { "hectare", "square-meter" },
2259596a2c1Sopenharmony_ci    { "dunam", "square-meter" },
2269596a2c1Sopenharmony_ci    { "fathom", "meter" },
2279596a2c1Sopenharmony_ci    { "foot", "meter" },
2289596a2c1Sopenharmony_ci    { "furlong", "meter" },
2299596a2c1Sopenharmony_ci    { "inch", "meter" },
2309596a2c1Sopenharmony_ci    { "meter", "meter" },
2319596a2c1Sopenharmony_ci    { "mile", "meter" },
2329596a2c1Sopenharmony_ci    { "mile-scandinavian", "meter" },
2339596a2c1Sopenharmony_ci    { "nautical-mile", "meter" },
2349596a2c1Sopenharmony_ci    { "point", "meter" },
2359596a2c1Sopenharmony_ci    { "yard", "meter" },
2369596a2c1Sopenharmony_ci    { "knot", "meter-per-second" },
2379596a2c1Sopenharmony_ci    { "kilometer-per-hour", "meter-per-second" },
2389596a2c1Sopenharmony_ci    { "celsius", "kelvin" },
2399596a2c1Sopenharmony_ci    { "fahrenheit", "kelvin" },
2409596a2c1Sopenharmony_ci    { "kelvin", "kelvin" },
2419596a2c1Sopenharmony_ci    { "acre-foot", "cubic-meter" },
2429596a2c1Sopenharmony_ci    { "bushel", "cubic-meter" },
2439596a2c1Sopenharmony_ci    { "bushel-UK", "cubic-meter" },
2449596a2c1Sopenharmony_ci    { "bushel-US", "cubic-meter" },
2459596a2c1Sopenharmony_ci    { "cup", "cubic-meter" },
2469596a2c1Sopenharmony_ci    { "cup-UK", "cubic-meter" },
2479596a2c1Sopenharmony_ci    { "cup-US", "cubic-meter" },
2489596a2c1Sopenharmony_ci    { "cup-metric", "cubic-meter" },
2499596a2c1Sopenharmony_ci    { "fluid-ounce", "cubic-meter" },
2509596a2c1Sopenharmony_ci    { "fluid-ounce-imperial", "cubic-meter" },
2519596a2c1Sopenharmony_ci    { "gallon", "cubic-meter" },
2529596a2c1Sopenharmony_ci    { "gallon-imperial", "cubic-meter" },
2539596a2c1Sopenharmony_ci    { "liter", "cubic-meter" },
2549596a2c1Sopenharmony_ci    { "pint-metric", "cubic-meter" },
2559596a2c1Sopenharmony_ci    { "pint", "cubic-meter" },
2569596a2c1Sopenharmony_ci    { "pint-UK", "cubic-meter" },
2579596a2c1Sopenharmony_ci    { "pint-US", "cubic-meter" },
2589596a2c1Sopenharmony_ci    { "quart", "cubic-meter" },
2599596a2c1Sopenharmony_ci    { "quart-UK", "cubic-meter" },
2609596a2c1Sopenharmony_ci    { "quart-US", "cubic-meter" },
2619596a2c1Sopenharmony_ci    { "tablespoon", "cubic-meter" },
2629596a2c1Sopenharmony_ci    { "tablespoon-UK", "cubic-meter" },
2639596a2c1Sopenharmony_ci    { "tablespoon-US", "cubic-meter" },
2649596a2c1Sopenharmony_ci    { "teaspoon", "cubic-meter" },
2659596a2c1Sopenharmony_ci    { "teaspoon-UK", "cubic-meter" },
2669596a2c1Sopenharmony_ci    { "teaspoon-US", "cubic-meter" },
2679596a2c1Sopenharmony_ci    { "barrel", "cubic-meter" },
2689596a2c1Sopenharmony_ci    { "barrel-US", "cubic-meter" },
2699596a2c1Sopenharmony_ci    { "barrel-UK", "cubic-meter" },
2709596a2c1Sopenharmony_ci    { "hour", "second" },
2719596a2c1Sopenharmony_ci    { "second", "second" },
2729596a2c1Sopenharmony_ci};
2739596a2c1Sopenharmony_ci
2749596a2c1Sopenharmony_ciconst std::unordered_map<std::string, double> PREFIX_VALUE {
2759596a2c1Sopenharmony_ci    { "deci", pow(10, -1) },
2769596a2c1Sopenharmony_ci    { "centi", pow(10, -2) },
2779596a2c1Sopenharmony_ci    { "milli", pow(10, -3) },
2789596a2c1Sopenharmony_ci    { "micro", pow(10, -6) },
2799596a2c1Sopenharmony_ci    { "nano", pow(10, -9) },
2809596a2c1Sopenharmony_ci    { "pico", pow(10, -12) },
2819596a2c1Sopenharmony_ci    { "kilo", pow(10, 3) },
2829596a2c1Sopenharmony_ci    { "hecto", pow(10, 2) },
2839596a2c1Sopenharmony_ci    { "mega", pow(10, 6) },
2849596a2c1Sopenharmony_ci};
2859596a2c1Sopenharmony_ci
2869596a2c1Sopenharmony_ciconst std::vector<std::string> BYTE_VALUE {
2879596a2c1Sopenharmony_ci    "byte",
2889596a2c1Sopenharmony_ci    "kilobyte",
2899596a2c1Sopenharmony_ci    "megabyte",
2909596a2c1Sopenharmony_ci    "gigabyte",
2919596a2c1Sopenharmony_ci    "terabyte",
2929596a2c1Sopenharmony_ci    "petabyte"
2939596a2c1Sopenharmony_ci};
2949596a2c1Sopenharmony_ci
2959596a2c1Sopenharmony_ciconst std::vector<std::pair<std::string, double>> DATE_VALUE {
2969596a2c1Sopenharmony_ci    { "second", 1 },
2979596a2c1Sopenharmony_ci    { "minute", 60 },
2989596a2c1Sopenharmony_ci    { "hour", 60 },
2999596a2c1Sopenharmony_ci    { "day", 24},
3009596a2c1Sopenharmony_ci    { "month", 30 },
3019596a2c1Sopenharmony_ci    { "year", 365 / 30 }
3029596a2c1Sopenharmony_ci};
3039596a2c1Sopenharmony_ci
3049596a2c1Sopenharmony_ciconst std::unordered_map<std::string, double> POWER_VALUE {
3059596a2c1Sopenharmony_ci    { "square-", 2 },
3069596a2c1Sopenharmony_ci    { "cubic-", 3 },
3079596a2c1Sopenharmony_ci};
3089596a2c1Sopenharmony_ci
3099596a2c1Sopenharmony_ciuint32_t GetMask(const string &region)
3109596a2c1Sopenharmony_ci{
3119596a2c1Sopenharmony_ci    uint32_t firstChar = (region.c_str()[0] - CHAR_OFFSET);
3129596a2c1Sopenharmony_ci    uint32_t secondChar = (region.c_str()[1] - CHAR_OFFSET);
3139596a2c1Sopenharmony_ci    return (firstChar << REGION_OFFSET) | secondChar;
3149596a2c1Sopenharmony_ci}
3159596a2c1Sopenharmony_ci
3169596a2c1Sopenharmony_civoid GetDefaultPreferredUnit(const string &region, const string &type, vector<string> &units)
3179596a2c1Sopenharmony_ci{
3189596a2c1Sopenharmony_ci    switch (GetMask(region)) {
3199596a2c1Sopenharmony_ci        case 0x00000B92: {
3209596a2c1Sopenharmony_ci            if (USAGE_DEFAULT_GB.count(type) > 0) {
3219596a2c1Sopenharmony_ci                units.assign(USAGE_DEFAULT_GB.at(type).begin(), USAGE_DEFAULT_GB.at(type).end());
3229596a2c1Sopenharmony_ci            }
3239596a2c1Sopenharmony_ci            break;
3249596a2c1Sopenharmony_ci        }
3259596a2c1Sopenharmony_ci        case 0x000012A3: {
3269596a2c1Sopenharmony_ci            if (USAGE_DEFAULT_US.count(type) > 0) {
3279596a2c1Sopenharmony_ci                units.assign(USAGE_DEFAULT_US.at(type).begin(), USAGE_DEFAULT_US.at(type).end());
3289596a2c1Sopenharmony_ci            }
3299596a2c1Sopenharmony_ci            break;
3309596a2c1Sopenharmony_ci        }
3319596a2c1Sopenharmony_ci        default: {
3329596a2c1Sopenharmony_ci            if (USAGE_DEFAULT_001.count(type) > 0) {
3339596a2c1Sopenharmony_ci                units.assign(USAGE_DEFAULT_001.at(type).begin(), USAGE_DEFAULT_001.at(type).end());
3349596a2c1Sopenharmony_ci            }
3359596a2c1Sopenharmony_ci            break;
3369596a2c1Sopenharmony_ci        }
3379596a2c1Sopenharmony_ci    }
3389596a2c1Sopenharmony_ci}
3399596a2c1Sopenharmony_ci
3409596a2c1Sopenharmony_civoid GetFallbackPreferredUnit(const string &region, const string &usage, vector<string> &units)
3419596a2c1Sopenharmony_ci{
3429596a2c1Sopenharmony_ci    switch (GetMask(region)) {
3439596a2c1Sopenharmony_ci        case 0x00000EA8: {
3449596a2c1Sopenharmony_ci            if (USAGE_MX.count(usage) > 0) {
3459596a2c1Sopenharmony_ci                units.assign(USAGE_MX.at(usage).begin(), USAGE_MX.at(usage).end());
3469596a2c1Sopenharmony_ci                return;
3479596a2c1Sopenharmony_ci            }
3489596a2c1Sopenharmony_ci            break;
3499596a2c1Sopenharmony_ci        }
3509596a2c1Sopenharmony_ci        case 0x00000F1C: {
3519596a2c1Sopenharmony_ci            if (USAGE_NL.count(usage) > 0) {
3529596a2c1Sopenharmony_ci                units.assign(USAGE_NL.at(usage).begin(), USAGE_NL.at(usage).end());
3539596a2c1Sopenharmony_ci                return;
3549596a2c1Sopenharmony_ci            }
3559596a2c1Sopenharmony_ci            break;
3569596a2c1Sopenharmony_ci        }
3579596a2c1Sopenharmony_ci        case 0x00000F1F:
3589596a2c1Sopenharmony_ci        case 0x0000101C:
3599596a2c1Sopenharmony_ci        case 0x00001125: {
3609596a2c1Sopenharmony_ci            if (USAGE_NO.count(usage) > 0) {
3619596a2c1Sopenharmony_ci                units.assign(USAGE_NO.at(usage).begin(), USAGE_NO.at(usage).end());
3629596a2c1Sopenharmony_ci                return;
3639596a2c1Sopenharmony_ci            }
3649596a2c1Sopenharmony_ci            break;
3659596a2c1Sopenharmony_ci        }
3669596a2c1Sopenharmony_ci        case 0x00001195: {
3679596a2c1Sopenharmony_ci            if (USAGE_SE.count(usage) > 0) {
3689596a2c1Sopenharmony_ci                units.assign(USAGE_SE.at(usage).begin(), USAGE_SE.at(usage).end());
3699596a2c1Sopenharmony_ci                return;
3709596a2c1Sopenharmony_ci            }
3719596a2c1Sopenharmony_ci            break;
3729596a2c1Sopenharmony_ci        }
3739596a2c1Sopenharmony_ci        case 0x000012A3: {
3749596a2c1Sopenharmony_ci            if (USAGE_US.count(usage) > 0) {
3759596a2c1Sopenharmony_ci                units.assign(USAGE_US.at(usage).begin(), USAGE_US.at(usage).end());
3769596a2c1Sopenharmony_ci                return;
3779596a2c1Sopenharmony_ci            }
3789596a2c1Sopenharmony_ci            break;
3799596a2c1Sopenharmony_ci        }
3809596a2c1Sopenharmony_ci        default: {
3819596a2c1Sopenharmony_ci            if (USAGE_001.count(usage) > 0) {
3829596a2c1Sopenharmony_ci                units.assign(USAGE_001.at(usage).begin(), USAGE_001.at(usage).end());
3839596a2c1Sopenharmony_ci                return;
3849596a2c1Sopenharmony_ci            }
3859596a2c1Sopenharmony_ci            break;
3869596a2c1Sopenharmony_ci        }
3879596a2c1Sopenharmony_ci    }
3889596a2c1Sopenharmony_ci}
3899596a2c1Sopenharmony_ci
3909596a2c1Sopenharmony_civoid GetRestPreferredUnit(const string &region, const string &usage, vector<string> &units)
3919596a2c1Sopenharmony_ci{
3929596a2c1Sopenharmony_ci    switch (GetMask(region)) {
3939596a2c1Sopenharmony_ci        case 0x00000991:
3949596a2c1Sopenharmony_ci        case 0x00000C9E: {
3959596a2c1Sopenharmony_ci            if (USAGE_CA.count(usage) > 0) {
3969596a2c1Sopenharmony_ci                units.assign(USAGE_CA.at(usage).begin(), USAGE_CA.at(usage).end());
3979596a2c1Sopenharmony_ci                return;
3989596a2c1Sopenharmony_ci            }
3999596a2c1Sopenharmony_ci            break;
4009596a2c1Sopenharmony_ci        }
4019596a2c1Sopenharmony_ci        case 0x0000099E:
4029596a2c1Sopenharmony_ci        case 0x00000A1B:
4039596a2c1Sopenharmony_ci        case 0x00001024: {
4049596a2c1Sopenharmony_ci            if (USAGE_CN.count(usage) > 0) {
4059596a2c1Sopenharmony_ci                units.assign(USAGE_CN.at(usage).begin(), USAGE_CN.at(usage).end());
4069596a2c1Sopenharmony_ci                return;
4079596a2c1Sopenharmony_ci            }
4089596a2c1Sopenharmony_ci            break;
4099596a2c1Sopenharmony_ci        }
4109596a2c1Sopenharmony_ci        case 0x00000A15: {
4119596a2c1Sopenharmony_ci            if (USAGE_DE.count(usage) > 0) {
4129596a2c1Sopenharmony_ci                units.assign(USAGE_DE.at(usage).begin(), USAGE_DE.at(usage).end());
4139596a2c1Sopenharmony_ci                return;
4149596a2c1Sopenharmony_ci            }
4159596a2c1Sopenharmony_ci            break;
4169596a2c1Sopenharmony_ci        }
4179596a2c1Sopenharmony_ci        case 0x00000B92: {
4189596a2c1Sopenharmony_ci            if (USAGE_GB.count(usage) > 0) {
4199596a2c1Sopenharmony_ci                units.assign(USAGE_GB.at(usage).begin(), USAGE_GB.at(usage).end());
4209596a2c1Sopenharmony_ci                return;
4219596a2c1Sopenharmony_ci            }
4229596a2c1Sopenharmony_ci            break;
4239596a2c1Sopenharmony_ci        }
4249596a2c1Sopenharmony_ci        case 0x00000DA2: {
4259596a2c1Sopenharmony_ci            if (USAGE_KR.count(usage) > 0) {
4269596a2c1Sopenharmony_ci                units.assign(USAGE_KR.at(usage).begin(), USAGE_KR.at(usage).end());
4279596a2c1Sopenharmony_ci                return;
4289596a2c1Sopenharmony_ci            }
4299596a2c1Sopenharmony_ci            break;
4309596a2c1Sopenharmony_ci        }
4319596a2c1Sopenharmony_ci        default: {
4329596a2c1Sopenharmony_ci            GetFallbackPreferredUnit(region, usage, units);
4339596a2c1Sopenharmony_ci            break;
4349596a2c1Sopenharmony_ci        }
4359596a2c1Sopenharmony_ci    }
4369596a2c1Sopenharmony_ci    if (!units.size()) {
4379596a2c1Sopenharmony_ci        GetDefaultPreferredUnit(region, usage, units);
4389596a2c1Sopenharmony_ci    }
4399596a2c1Sopenharmony_ci}
4409596a2c1Sopenharmony_ci
4419596a2c1Sopenharmony_civoid GetPreferredUnit(const string &region, const string &usage, vector<string> &units)
4429596a2c1Sopenharmony_ci{
4439596a2c1Sopenharmony_ci    switch (GetMask(region)) {
4449596a2c1Sopenharmony_ci        case 0x000008A4:
4459596a2c1Sopenharmony_ci        case 0x00000915:
4469596a2c1Sopenharmony_ci        case 0x00000A2A:
4479596a2c1Sopenharmony_ci        case 0x00000A97:
4489596a2c1Sopenharmony_ci        case 0x00000AA3:
4499596a2c1Sopenharmony_ci        case 0x00000B22:
4509596a2c1Sopenharmony_ci        case 0x00000C1B:
4519596a2c1Sopenharmony_ci        case 0x00000C94:
4529596a2c1Sopenharmony_ci        case 0x00000C9C:
4539596a2c1Sopenharmony_ci        case 0x00000CA4:
4549596a2c1Sopenharmony_ci        case 0x00000D1F:
4559596a2c1Sopenharmony_ci        case 0x00000EA9:
4569596a2c1Sopenharmony_ci        case 0x00001191:
4579596a2c1Sopenharmony_ci        case 0x00001222:
4589596a2c1Sopenharmony_ci        case 0x0000131E: {
4599596a2c1Sopenharmony_ci            if (USAGE_AT.count(usage) > 0) {
4609596a2c1Sopenharmony_ci                units.assign(USAGE_AT.at(usage).begin(), USAGE_AT.at(usage).end());
4619596a2c1Sopenharmony_ci                return;
4629596a2c1Sopenharmony_ci            }
4639596a2c1Sopenharmony_ci            break;
4649596a2c1Sopenharmony_ci        }
4659596a2c1Sopenharmony_ci        case 0x00000922: {
4669596a2c1Sopenharmony_ci            if (USAGE_BR.count(usage) > 0) {
4679596a2c1Sopenharmony_ci                units.assign(USAGE_BR.at(usage).begin(), USAGE_BR.at(usage).end());
4689596a2c1Sopenharmony_ci                return;
4699596a2c1Sopenharmony_ci            }
4709596a2c1Sopenharmony_ci            break;
4719596a2c1Sopenharmony_ci        }
4729596a2c1Sopenharmony_ci        case 0x00000923:
4739596a2c1Sopenharmony_ci        case 0x0000092A:
4749596a2c1Sopenharmony_ci        case 0x00001022:
4759596a2c1Sopenharmony_ci        case 0x00001027: {
4769596a2c1Sopenharmony_ci            if (USAGE_BS.count(usage) > 0) {
4779596a2c1Sopenharmony_ci                units.assign(USAGE_BS.at(usage).begin(), USAGE_BS.at(usage).end());
4789596a2c1Sopenharmony_ci                return;
4799596a2c1Sopenharmony_ci            }
4809596a2c1Sopenharmony_ci            break;
4819596a2c1Sopenharmony_ci        }
4829596a2c1Sopenharmony_ci        default: {
4839596a2c1Sopenharmony_ci            GetRestPreferredUnit(region, usage, units);
4849596a2c1Sopenharmony_ci            break;
4859596a2c1Sopenharmony_ci        }
4869596a2c1Sopenharmony_ci    }
4879596a2c1Sopenharmony_ci    if (!units.size()) {
4889596a2c1Sopenharmony_ci        GetRestPreferredUnit(region, usage, units);
4899596a2c1Sopenharmony_ci    }
4909596a2c1Sopenharmony_ci}
4919596a2c1Sopenharmony_ci
4929596a2c1Sopenharmony_civoid ComputeFactorValue(const string &unit, const string &measSys, vector<double> &factors)
4939596a2c1Sopenharmony_ci{
4949596a2c1Sopenharmony_ci    string unitKey = unit + "-" + measSys;
4959596a2c1Sopenharmony_ci    if (CONVERT_FACTORS.count(unitKey) > 0) {
4969596a2c1Sopenharmony_ci        factors[0] = CONVERT_FACTORS.at(unitKey)[0];
4979596a2c1Sopenharmony_ci        factors[1] = CONVERT_FACTORS.at(unitKey)[1];
4989596a2c1Sopenharmony_ci        return;
4999596a2c1Sopenharmony_ci    }
5009596a2c1Sopenharmony_ci    if (CONVERT_FACTORS.count(unit) > 0) {
5019596a2c1Sopenharmony_ci        factors[0] = CONVERT_FACTORS.at(unit)[0];
5029596a2c1Sopenharmony_ci        factors[1] = CONVERT_FACTORS.at(unit)[1];
5039596a2c1Sopenharmony_ci    }
5049596a2c1Sopenharmony_ci}
5059596a2c1Sopenharmony_ci
5069596a2c1Sopenharmony_cidouble ComputeSIPrefixValue(const string &unit)
5079596a2c1Sopenharmony_ci{
5089596a2c1Sopenharmony_ci    for (auto& prefixValue : PREFIX_VALUE) {
5099596a2c1Sopenharmony_ci        if (!unit.rfind(prefixValue.first, 0)) {
5109596a2c1Sopenharmony_ci            return prefixValue.second;
5119596a2c1Sopenharmony_ci        }
5129596a2c1Sopenharmony_ci    }
5139596a2c1Sopenharmony_ci    return 0.0;
5149596a2c1Sopenharmony_ci}
5159596a2c1Sopenharmony_ci
5169596a2c1Sopenharmony_civoid ComputePowerValue(const string &unit, const string &measSys, vector<double> &factors)
5179596a2c1Sopenharmony_ci{
5189596a2c1Sopenharmony_ci    for (auto& powerValue : POWER_VALUE) {
5199596a2c1Sopenharmony_ci        if (!unit.rfind(powerValue.first, 0)) {
5209596a2c1Sopenharmony_ci            string baseUnit = unit.substr(powerValue.first.length());
5219596a2c1Sopenharmony_ci            double value = ComputeSIPrefixValue(baseUnit);
5229596a2c1Sopenharmony_ci            double compare = 0.0;
5239596a2c1Sopenharmony_ci            if (fabs(value - compare) < 1e-6) {
5249596a2c1Sopenharmony_ci                ComputeFactorValue(baseUnit, measSys, factors);
5259596a2c1Sopenharmony_ci            }
5269596a2c1Sopenharmony_ci            factors[0] = pow(factors[0], powerValue.second);
5279596a2c1Sopenharmony_ci        }
5289596a2c1Sopenharmony_ci    }
5299596a2c1Sopenharmony_ci}
5309596a2c1Sopenharmony_ci
5319596a2c1Sopenharmony_ciint ComputeValue(const string &unit, const string &measSys, vector<double> &factors)
5329596a2c1Sopenharmony_ci{
5339596a2c1Sopenharmony_ci    if (unit.find("-per-") != string::npos) {
5349596a2c1Sopenharmony_ci        vector<string> baseValues;
5359596a2c1Sopenharmony_ci        Split(unit, "-per-", baseValues);
5369596a2c1Sopenharmony_ci        if (baseValues.size() == BASE_VALUE_SIZE) {
5379596a2c1Sopenharmony_ci            vector<double> numerator = { 1.0, 0.0 };
5389596a2c1Sopenharmony_ci            int status = ComputeValue(baseValues[0], measSys, numerator);
5399596a2c1Sopenharmony_ci            if (!status) {
5409596a2c1Sopenharmony_ci                return 0;
5419596a2c1Sopenharmony_ci            }
5429596a2c1Sopenharmony_ci            vector<double> denominator = { 1.0, 0.0 };
5439596a2c1Sopenharmony_ci            status = ComputeValue(baseValues[1], measSys, denominator);
5449596a2c1Sopenharmony_ci            if (!status) {
5459596a2c1Sopenharmony_ci                return 0;
5469596a2c1Sopenharmony_ci            }
5479596a2c1Sopenharmony_ci            factors[0] = numerator[0] / denominator[0];
5489596a2c1Sopenharmony_ci            return 1;
5499596a2c1Sopenharmony_ci        }
5509596a2c1Sopenharmony_ci    }
5519596a2c1Sopenharmony_ci    double compare = 0.0;
5529596a2c1Sopenharmony_ci    factors[0] = ComputeSIPrefixValue(unit);
5539596a2c1Sopenharmony_ci    if (fabs(factors[0] - compare) < 1e-6) {
5549596a2c1Sopenharmony_ci        ComputePowerValue(unit, measSys, factors);
5559596a2c1Sopenharmony_ci    }
5569596a2c1Sopenharmony_ci    if (fabs(factors[0] - compare) < 1e-6) {
5579596a2c1Sopenharmony_ci        ComputeFactorValue(unit, measSys, factors);
5589596a2c1Sopenharmony_ci    }
5599596a2c1Sopenharmony_ci    if (fabs(factors[0] - compare) < 1e-6) {
5609596a2c1Sopenharmony_ci        factors[0] = 1.0;
5619596a2c1Sopenharmony_ci        return 0;
5629596a2c1Sopenharmony_ci    }
5639596a2c1Sopenharmony_ci    return 1;
5649596a2c1Sopenharmony_ci}
5659596a2c1Sopenharmony_ci
5669596a2c1Sopenharmony_cibool ConvertByte(double& number, std::string& unit)
5679596a2c1Sopenharmony_ci{
5689596a2c1Sopenharmony_ci    double tempNumber = number;
5699596a2c1Sopenharmony_ci    if (tempNumber < 0) {
5709596a2c1Sopenharmony_ci        tempNumber *= -1;
5719596a2c1Sopenharmony_ci    }
5729596a2c1Sopenharmony_ci    std::string tempUnit = unit;
5739596a2c1Sopenharmony_ci    int indexFirst = -1;
5749596a2c1Sopenharmony_ci    for (size_t i = 0; i < BYTE_VALUE.size(); i++) {
5759596a2c1Sopenharmony_ci        if (BYTE_VALUE[i] == tempUnit) {
5769596a2c1Sopenharmony_ci            indexFirst = static_cast<int>(i);
5779596a2c1Sopenharmony_ci            break;
5789596a2c1Sopenharmony_ci        }
5799596a2c1Sopenharmony_ci    }
5809596a2c1Sopenharmony_ci    bool status = (indexFirst >= 0);
5819596a2c1Sopenharmony_ci    size_t indexSecond = status ? static_cast<size_t>(indexFirst) : 0;
5829596a2c1Sopenharmony_ci    for (size_t i = indexSecond; i > 0; i--) {
5839596a2c1Sopenharmony_ci        if (tempNumber < 1) {
5849596a2c1Sopenharmony_ci            // 10 ^ 3 is the threshold for carry
5859596a2c1Sopenharmony_ci            tempNumber *= pow(10, 3);
5869596a2c1Sopenharmony_ci            tempUnit = BYTE_VALUE[i - 1];
5879596a2c1Sopenharmony_ci            indexSecond = i - 1;
5889596a2c1Sopenharmony_ci        }
5899596a2c1Sopenharmony_ci    }
5909596a2c1Sopenharmony_ci
5919596a2c1Sopenharmony_ci    for (size_t i = indexSecond + 1; i < BYTE_VALUE.size(); i++) {
5929596a2c1Sopenharmony_ci        // 900 is the threshold for carry
5939596a2c1Sopenharmony_ci        if (tempNumber > 900) {
5949596a2c1Sopenharmony_ci            // 10 ^ 3 is the threshold for carry
5959596a2c1Sopenharmony_ci            tempNumber /= pow(10, 3);
5969596a2c1Sopenharmony_ci            tempUnit = BYTE_VALUE[i];
5979596a2c1Sopenharmony_ci        } else {
5989596a2c1Sopenharmony_ci            break;
5999596a2c1Sopenharmony_ci        }
6009596a2c1Sopenharmony_ci    }
6019596a2c1Sopenharmony_ci
6029596a2c1Sopenharmony_ci    if (status) {
6039596a2c1Sopenharmony_ci        number = tempNumber;
6049596a2c1Sopenharmony_ci        unit = tempUnit;
6059596a2c1Sopenharmony_ci        return true;
6069596a2c1Sopenharmony_ci    }
6079596a2c1Sopenharmony_ci    return false;
6089596a2c1Sopenharmony_ci}
6099596a2c1Sopenharmony_ci
6109596a2c1Sopenharmony_cibool ConvertDate(double& number, std::string& unit)
6119596a2c1Sopenharmony_ci{
6129596a2c1Sopenharmony_ci    double tempNumber = number;
6139596a2c1Sopenharmony_ci    if (tempNumber < 0) {
6149596a2c1Sopenharmony_ci        tempNumber *= -1;
6159596a2c1Sopenharmony_ci    }
6169596a2c1Sopenharmony_ci    std::string tempUnit = unit;
6179596a2c1Sopenharmony_ci
6189596a2c1Sopenharmony_ci    int indexFirst = -1;
6199596a2c1Sopenharmony_ci    for (size_t i = 0; i < DATE_VALUE.size(); i++) {
6209596a2c1Sopenharmony_ci        if (DATE_VALUE[i].first == tempUnit) {
6219596a2c1Sopenharmony_ci            indexFirst = static_cast<int>(i);
6229596a2c1Sopenharmony_ci            break;
6239596a2c1Sopenharmony_ci        }
6249596a2c1Sopenharmony_ci    }
6259596a2c1Sopenharmony_ci    bool status = (indexFirst >= 0);
6269596a2c1Sopenharmony_ci    size_t indexSecond = status ? static_cast<size_t>(indexFirst) : 0;
6279596a2c1Sopenharmony_ci    for (size_t i = indexSecond; i > 0; i--) {
6289596a2c1Sopenharmony_ci        if (tempNumber < 1) {
6299596a2c1Sopenharmony_ci            tempNumber *= DATE_VALUE[i].second;
6309596a2c1Sopenharmony_ci            tempUnit = DATE_VALUE[i - 1].first;
6319596a2c1Sopenharmony_ci            indexSecond = i - 1;
6329596a2c1Sopenharmony_ci        }
6339596a2c1Sopenharmony_ci    }
6349596a2c1Sopenharmony_ci
6359596a2c1Sopenharmony_ci    for (size_t i = indexSecond + 1; i < DATE_VALUE.size(); i++) {
6369596a2c1Sopenharmony_ci        if ((tempNumber / DATE_VALUE[i].second) >= 1) {
6379596a2c1Sopenharmony_ci            tempNumber /= DATE_VALUE[i].second;
6389596a2c1Sopenharmony_ci            tempUnit = DATE_VALUE[i].first;
6399596a2c1Sopenharmony_ci        } else {
6409596a2c1Sopenharmony_ci            break;
6419596a2c1Sopenharmony_ci        }
6429596a2c1Sopenharmony_ci    }
6439596a2c1Sopenharmony_ci
6449596a2c1Sopenharmony_ci    if (status) {
6459596a2c1Sopenharmony_ci        number = floor(tempNumber);
6469596a2c1Sopenharmony_ci        number *= -1;
6479596a2c1Sopenharmony_ci        unit = tempUnit;
6489596a2c1Sopenharmony_ci        return true;
6499596a2c1Sopenharmony_ci    }
6509596a2c1Sopenharmony_ci    return false;
6519596a2c1Sopenharmony_ci}
6529596a2c1Sopenharmony_ci
6539596a2c1Sopenharmony_ciint Convert(double &value, const string &fromUnit, const string &fromMeasSys, const string &toUnit,
6549596a2c1Sopenharmony_ci    const string &toMeasSys)
6559596a2c1Sopenharmony_ci{
6569596a2c1Sopenharmony_ci    double baseResult = 0.0;
6579596a2c1Sopenharmony_ci    double result = 0.0;
6589596a2c1Sopenharmony_ci    vector<double> fromFactors = {0.0, 0.0};
6599596a2c1Sopenharmony_ci    string fromUnitType;
6609596a2c1Sopenharmony_ci    string toUnitType;
6619596a2c1Sopenharmony_ci    icu::MeasureUnit unitArray[MAX_UNIT_NUM];
6629596a2c1Sopenharmony_ci    UErrorCode icuStatus = U_ZERO_ERROR;
6639596a2c1Sopenharmony_ci    icu::MeasureUnit::getAvailable(unitArray, MAX_UNIT_NUM, icuStatus);
6649596a2c1Sopenharmony_ci    if (!U_SUCCESS(icuStatus)) {
6659596a2c1Sopenharmony_ci        return 0;
6669596a2c1Sopenharmony_ci    }
6679596a2c1Sopenharmony_ci    for (icu::MeasureUnit curUnit : unitArray) {
6689596a2c1Sopenharmony_ci        if (!strcmp(curUnit.getSubtype(), fromUnit.c_str())) {
6699596a2c1Sopenharmony_ci            fromUnitType = curUnit.getType();
6709596a2c1Sopenharmony_ci        }
6719596a2c1Sopenharmony_ci        if (!strcmp(curUnit.getSubtype(), toUnit.c_str())) {
6729596a2c1Sopenharmony_ci            toUnitType = curUnit.getType();
6739596a2c1Sopenharmony_ci        }
6749596a2c1Sopenharmony_ci    }
6759596a2c1Sopenharmony_ci    if (fromUnitType.empty() || toUnitType.empty() || strcmp(fromUnitType.c_str(), toUnitType.c_str())) {
6769596a2c1Sopenharmony_ci        return 0;
6779596a2c1Sopenharmony_ci    }
6789596a2c1Sopenharmony_ci    int status = ComputeValue(fromUnit, fromMeasSys, fromFactors);
6799596a2c1Sopenharmony_ci    if (!status) {
6809596a2c1Sopenharmony_ci        return 0;
6819596a2c1Sopenharmony_ci    }
6829596a2c1Sopenharmony_ci    vector<double> toFactors = {0.0, 0.0};
6839596a2c1Sopenharmony_ci    status = ComputeValue(toUnit, toMeasSys, toFactors);
6849596a2c1Sopenharmony_ci    if (!status) {
6859596a2c1Sopenharmony_ci        return 0;
6869596a2c1Sopenharmony_ci    }
6879596a2c1Sopenharmony_ci    if (fromFactors.size() == FACTOR_SIZE) {
6889596a2c1Sopenharmony_ci        baseResult = fromFactors[0] * value + fromFactors[1];
6899596a2c1Sopenharmony_ci    }
6909596a2c1Sopenharmony_ci    if (toFactors.size() == FACTOR_SIZE) {
6919596a2c1Sopenharmony_ci        result = (baseResult - toFactors[1]) / toFactors[0];
6929596a2c1Sopenharmony_ci    }
6939596a2c1Sopenharmony_ci    value = result;
6949596a2c1Sopenharmony_ci    return 1;
6959596a2c1Sopenharmony_ci}
6969596a2c1Sopenharmony_ci} // namespace I18n
6979596a2c1Sopenharmony_ci} // namespace Global
6989596a2c1Sopenharmony_ci} // namespace OHOS