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 ®ion) 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 ®ion, 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 ®ion, 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 ®ion, 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 ®ion, 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