From 58676b5a3238963b45fb6cfeb6e2b691fb9df0eb Mon Sep 17 00:00:00 2001 From: Alexander Shalamov Date: Mon, 23 Sep 2019 17:22:38 +0300 Subject: [core][android][darwin] Move number format to i18n --- include/mbgl/i18n/number_format.hpp | 15 +++++ include/mbgl/util/platform.hpp | 3 - next/platform/android/android.cmake | 8 +-- next/platform/ios/ios.cmake | 1 + next/platform/linux/linux.cmake | 4 +- next/platform/macos/macos.cmake | 1 + next/platform/qt/qt.cmake | 2 +- platform/android/core-files.json | 7 +- platform/android/src/i18n/number_format.cpp | 80 +++++++++++++++++++++++ platform/android/src/i18n/number_format_jni.hpp | 29 +++++++++ platform/android/src/jni_native.cpp | 2 +- platform/android/src/text/format_number.cpp | 81 ------------------------ platform/android/src/text/format_number_jni.hpp | 29 --------- platform/darwin/src/number_format.mm | 36 +++++++++++ platform/darwin/src/string_nsstring.mm | 31 +-------- platform/default/src/mbgl/i18n/format_number.cpp | 39 ++++++++++++ platform/default/src/mbgl/i18n/number_format.cpp | 41 ++++++++++++ platform/default/src/mbgl/util/format_number.cpp | 39 ------------ platform/ios/core-files.json | 1 + platform/linux/config.cmake | 12 ++-- platform/macos/core-files.json | 1 + platform/qt/src/format_number.cpp | 26 -------- platform/qt/src/number_format.cpp | 26 ++++++++ src/core-files.json | 2 + src/mbgl/style/expression/number_format.cpp | 4 +- 25 files changed, 294 insertions(+), 226 deletions(-) create mode 100644 include/mbgl/i18n/number_format.hpp create mode 100644 platform/android/src/i18n/number_format.cpp create mode 100644 platform/android/src/i18n/number_format_jni.hpp delete mode 100644 platform/android/src/text/format_number.cpp delete mode 100644 platform/android/src/text/format_number_jni.hpp create mode 100644 platform/darwin/src/number_format.mm create mode 100644 platform/default/src/mbgl/i18n/format_number.cpp create mode 100644 platform/default/src/mbgl/i18n/number_format.cpp delete mode 100644 platform/default/src/mbgl/util/format_number.cpp delete mode 100644 platform/qt/src/format_number.cpp create mode 100644 platform/qt/src/number_format.cpp diff --git a/include/mbgl/i18n/number_format.hpp b/include/mbgl/i18n/number_format.hpp new file mode 100644 index 0000000000..cb1e94c7bd --- /dev/null +++ b/include/mbgl/i18n/number_format.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include + +namespace mbgl { +namespace platform { + +std::string formatNumber(double number, + const std::string& localeId, + const std::string& currency, + uint8_t minFractionDigits, + uint8_t maxFractionDigits); + +} // namespace platform +} // namespace mbgl diff --git a/include/mbgl/util/platform.hpp b/include/mbgl/util/platform.hpp index 2e11e5f186..3544659740 100644 --- a/include/mbgl/util/platform.hpp +++ b/include/mbgl/util/platform.hpp @@ -16,9 +16,6 @@ std::string lowercase(const std::string &string); // Gets the name of the current thread. std::string getCurrentThreadName(); -std::string formatNumber(double number, const std::string& localeId, const std::string& currency, - uint8_t minFractionDigits, uint8_t maxFractionDigits); - // Set the name of the current thread, truncated at 15. void setCurrentThreadName(const std::string& name); diff --git a/next/platform/android/android.cmake b/next/platform/android/android.cmake index edc74576dc..507c1baef0 100644 --- a/next/platform/android/android.cmake +++ b/next/platform/android/android.cmake @@ -85,6 +85,10 @@ target_sources( ${MBGL_ROOT}/platform/android/src/gson/json_primitive.cpp ${MBGL_ROOT}/platform/android/src/gson/json_primitive.hpp ${MBGL_ROOT}/platform/android/src/http_file_source.cpp + ${MBGL_ROOT}/platform/android/src/i18n/collator.cpp + ${MBGL_ROOT}/platform/android/src/i18n/collator_jni.hpp + ${MBGL_ROOT}/platform/android/src/i18n/number_format.cpp + ${MBGL_ROOT}/platform/android/src/i18n/number_format_jni.hpp ${MBGL_ROOT}/platform/android/src/image.cpp ${MBGL_ROOT}/platform/android/src/java/util.cpp ${MBGL_ROOT}/platform/android/src/java/util.hpp @@ -187,10 +191,6 @@ target_sources( ${MBGL_ROOT}/platform/android/src/style/transition_options.hpp ${MBGL_ROOT}/platform/android/src/style/value.cpp ${MBGL_ROOT}/platform/android/src/style/value.hpp - ${MBGL_ROOT}/platform/android/src/i18n/collator.cpp - ${MBGL_ROOT}/platform/android/src/i18n/collator_jni.hpp - ${MBGL_ROOT}/platform/android/src/text/format_number.cpp - ${MBGL_ROOT}/platform/android/src/text/format_number_jni.hpp ${MBGL_ROOT}/platform/android/src/text/local_glyph_rasterizer.cpp ${MBGL_ROOT}/platform/android/src/text/local_glyph_rasterizer_jni.hpp ${MBGL_ROOT}/platform/android/src/thread.cpp diff --git a/next/platform/ios/ios.cmake b/next/platform/ios/ios.cmake index 507150fc9a..7a729d996a 100644 --- a/next/platform/ios/ios.cmake +++ b/next/platform/ios/ios.cmake @@ -15,6 +15,7 @@ target_sources( ${MBGL_ROOT}/platform/darwin/src/local_glyph_rasterizer.mm ${MBGL_ROOT}/platform/darwin/src/logging_nslog.mm ${MBGL_ROOT}/platform/darwin/src/nsthread.mm + ${MBGL_ROOT}/platform/darwin/src/number_format.mm ${MBGL_ROOT}/platform/darwin/src/reachability.m ${MBGL_ROOT}/platform/darwin/src/run_loop.cpp ${MBGL_ROOT}/platform/darwin/src/string_nsstring.mm diff --git a/next/platform/linux/linux.cmake b/next/platform/linux/linux.cmake index 993d3512e3..18531a2856 100644 --- a/next/platform/linux/linux.cmake +++ b/next/platform/linux/linux.cmake @@ -15,6 +15,8 @@ target_sources( ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_backend.cpp ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_frontend.cpp ${MBGL_ROOT}/platform/default/src/mbgl/gl/headless_backend.cpp + ${MBGL_ROOT}/platform/default/src/mbgl/i18n/collator.cpp + ${MBGL_ROOT}/platform/default/src/mbgl/i18n/number_format.cpp ${MBGL_ROOT}/platform/default/src/mbgl/layermanager/layer_manager.cpp ${MBGL_ROOT}/platform/default/src/mbgl/storage/asset_file_source.cpp ${MBGL_ROOT}/platform/default/src/mbgl/storage/default_file_source.cpp @@ -29,11 +31,9 @@ target_sources( ${MBGL_ROOT}/platform/default/src/mbgl/storage/online_file_source.cpp ${MBGL_ROOT}/platform/default/src/mbgl/storage/sqlite3.cpp ${MBGL_ROOT}/platform/default/src/mbgl/text/bidi.cpp - ${MBGL_ROOT}/platform/default/src/mbgl/i18n/collator.cpp ${MBGL_ROOT}/platform/default/src/mbgl/text/local_glyph_rasterizer.cpp ${MBGL_ROOT}/platform/default/src/mbgl/util/async_task.cpp ${MBGL_ROOT}/platform/default/src/mbgl/util/compression.cpp - ${MBGL_ROOT}/platform/default/src/mbgl/util/format_number.cpp ${MBGL_ROOT}/platform/default/src/mbgl/util/image.cpp ${MBGL_ROOT}/platform/default/src/mbgl/util/jpeg_reader.cpp ${MBGL_ROOT}/platform/default/src/mbgl/util/logging_stderr.cpp diff --git a/next/platform/macos/macos.cmake b/next/platform/macos/macos.cmake index d0aad9c3dc..a0dcb9a829 100644 --- a/next/platform/macos/macos.cmake +++ b/next/platform/macos/macos.cmake @@ -83,6 +83,7 @@ target_sources( ${MBGL_ROOT}/platform/darwin/src/local_glyph_rasterizer.mm ${MBGL_ROOT}/platform/darwin/src/logging_nslog.mm ${MBGL_ROOT}/platform/darwin/src/nsthread.mm + ${MBGL_ROOT}/platform/darwin/src/number_format.mm ${MBGL_ROOT}/platform/darwin/src/reachability.m ${MBGL_ROOT}/platform/darwin/src/run_loop.cpp ${MBGL_ROOT}/platform/darwin/src/string_nsstring.mm diff --git a/next/platform/qt/qt.cmake b/next/platform/qt/qt.cmake index 59aa00788f..b902388565 100644 --- a/next/platform/qt/qt.cmake +++ b/next/platform/qt/qt.cmake @@ -45,7 +45,7 @@ target_sources( ${MBGL_ROOT}/platform/default/src/mbgl/util/compression.cpp ${MBGL_ROOT}/platform/qt/src/async_task.cpp ${MBGL_ROOT}/platform/qt/src/async_task_impl.hpp - ${MBGL_ROOT}/platform/qt/src/format_number.cpp + ${MBGL_ROOT}/platform/qt/src/number_format.cpp ${MBGL_ROOT}/platform/qt/src/gl_functions.cpp ${MBGL_ROOT}/platform/qt/src/headless_backend_qt.cpp ${MBGL_ROOT}/platform/qt/src/http_file_source.cpp diff --git a/platform/android/core-files.json b/platform/android/core-files.json index 4057b21000..e442883e47 100644 --- a/platform/android/core-files.json +++ b/platform/android/core-files.json @@ -34,6 +34,8 @@ "platform/android/src/gson/json_element.cpp", "platform/android/src/gson/json_object.cpp", "platform/android/src/gson/json_primitive.cpp", + "platform/android/src/i18n/collator.cpp", + "platform/android/src/i18n/number_format.cpp", "platform/android/src/image.cpp", "platform/android/src/java/util.cpp", "platform/android/src/java_types.cpp", @@ -80,9 +82,7 @@ "platform/android/src/style/sources/vector_source.cpp", "platform/android/src/style/transition_options.cpp", "platform/android/src/style/value.cpp", - "platform/android/src/i18n/collator.cpp", "platform/android/src/text/local_glyph_rasterizer.cpp", - "platform/android/src/text/format_number.cpp", "platform/android/src/gl_functions.cpp", "platform/android/src/thread.cpp", "platform/android/src/timer.cpp", @@ -143,6 +143,8 @@ "java_types.hpp": "platform/android/src/java_types.hpp", "jni.hpp": "platform/android/src/jni.hpp", "jni_native.hpp": "platform/android/src/jni_native.hpp", + "i18n/collator_jni.hpp": "platform/android/src/i18n/collator_jni.hpp", + "i18n/number_format_jni.hpp": "platform/android/src/i18n/number_format_jni.hpp", "logger.hpp": "platform/android/src/logger.hpp", "map/camera_position.hpp": "platform/android/src/map/camera_position.hpp", "map/image.hpp": "platform/android/src/map/image.hpp", @@ -185,7 +187,6 @@ "style/sources/vector_source.hpp": "platform/android/src/style/sources/vector_source.hpp", "style/transition_options.hpp": "platform/android/src/style/transition_options.hpp", "style/value.hpp": "platform/android/src/style/value.hpp", - "text/collator_jni.hpp": "platform/android/src/i18n/collator_jni.hpp", "text/local_glyph_rasterizer_jni.hpp": "platform/android/src/text/local_glyph_rasterizer_jni.hpp" } } diff --git a/platform/android/src/i18n/number_format.cpp b/platform/android/src/i18n/number_format.cpp new file mode 100644 index 0000000000..c8e0b70562 --- /dev/null +++ b/platform/android/src/i18n/number_format.cpp @@ -0,0 +1,80 @@ +#include +#include + +#include + +#include "../attach_env.hpp" +#include "number_format_jni.hpp" + +namespace mbgl { +namespace android { + +void NumberFormat::registerNative(jni::JNIEnv& env) { + jni::Class::Singleton(env); +} + +jni::Local> NumberFormat::getInstance(jni::JNIEnv& env, const jni::Object& locale) { + static auto& javaClass = jni::Class::Singleton(env); + static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "getInstance"); + return javaClass.Call(env, method, locale); +} + +jni::Local> NumberFormat::getCurrencyInstance(jni::JNIEnv& env, const jni::Object& locale) { + static auto& javaClass = jni::Class::Singleton(env); + static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "getCurrencyInstance"); + return javaClass.Call(env, method, locale); +} + +jni::Local NumberFormat::format(jni::JNIEnv& env, const jni::Object& nf, jni::jdouble number) { + static auto& javaClass = jni::Class::Singleton(env); + static auto method = javaClass.GetMethod(env, "format"); + return nf.Call(env, method, number); +} + +void NumberFormat::setMinimumFractionDigits(jni::JNIEnv& env, const jni::Object& nf, jni::jint value) { + static auto& javaClass = jni::Class::Singleton(env); + static auto method = javaClass.GetMethod(env, "setMinimumFractionDigits"); + return nf.Call(env, method, value); +} + +void NumberFormat::setMaximumFractionDigits(jni::JNIEnv& env, const jni::Object& nf, jni::jint value) { + static auto& javaClass = jni::Class::Singleton(env); + static auto method = javaClass.GetMethod(env, "setMaximumFractionDigits"); + return nf.Call(env, method, value); +} + +} // namespace android + +namespace platform { + +std::string formatNumber(double number, const std::string& localeId, const std::string& currency, + uint8_t minFractionDigits, uint8_t maxFractionDigits) { + + auto env{ android::AttachEnv() }; + + jni::Global> locale; + LanguageTag languageTag = !localeId.empty() ? LanguageTag::fromBCP47(localeId) : LanguageTag(); + if (!languageTag.language) { + locale = jni::NewGlobal(*env, android::Locale::getDefault(*env)); + } else if (!languageTag.region) { + locale = jni::NewGlobal(*env, android::Locale::New(*env, jni::Make(*env, *languageTag.language))); + } else { + locale = jni::NewGlobal(*env, android::Locale::New(*env, jni::Make(*env, *languageTag.language), + jni::Make(*env, *languageTag.region))); + } + + jni::Global> formatter; + if (currency.empty()) { + formatter = jni::NewGlobal(*env, android::NumberFormat::getInstance(*env, locale)); + android::NumberFormat::setMinimumFractionDigits(*env, formatter, static_cast(minFractionDigits)); + android::NumberFormat::setMaximumFractionDigits(*env, formatter, static_cast(maxFractionDigits)); + } else { + formatter = jni::NewGlobal(*env, android::NumberFormat::getCurrencyInstance(*env, locale)); + } + + auto result = android::NumberFormat::format(*env, formatter, static_cast(number)); + return jni::Make(*env, result); +} + +} // namespace platform +} // namespace mbgl diff --git a/platform/android/src/i18n/number_format_jni.hpp b/platform/android/src/i18n/number_format_jni.hpp new file mode 100644 index 0000000000..1720038925 --- /dev/null +++ b/platform/android/src/i18n/number_format_jni.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include + +#include "collator_jni.hpp" + +/* + android::NumberFormat is the JNI wrapper + of java/text/NumberFormat. + */ + +namespace mbgl { +namespace android { + +class NumberFormat { +public: + static constexpr auto Name() { return "java/text/NumberFormat"; }; + + static jni::Local> getInstance(jni::JNIEnv&, const jni::Object&); + static jni::Local> getCurrencyInstance(jni::JNIEnv&, const jni::Object&); + static jni::Local format(jni::JNIEnv&, const jni::Object&, jni::jdouble); + static void setMinimumFractionDigits(jni::JNIEnv&, const jni::Object&, jni::jint); + static void setMaximumFractionDigits(jni::JNIEnv&, const jni::Object&, jni::jint); + + static void registerNative(jni::JNIEnv&); +}; + +} // namespace android +} // namespace mbgl diff --git a/platform/android/src/jni_native.cpp b/platform/android/src/jni_native.cpp index 966dc6a007..9fe14f8f1f 100644 --- a/platform/android/src/jni_native.cpp +++ b/platform/android/src/jni_native.cpp @@ -51,9 +51,9 @@ #include "snapshotter/map_snapshot.hpp" #endif #include "i18n/collator_jni.hpp" +#include "i18n/number_format_jni.hpp" #include "logger.hpp" #include "text/local_glyph_rasterizer_jni.hpp" -#include "text/format_number_jni.hpp" namespace mbgl { namespace android { diff --git a/platform/android/src/text/format_number.cpp b/platform/android/src/text/format_number.cpp deleted file mode 100644 index 3a41175ecc..0000000000 --- a/platform/android/src/text/format_number.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include -#include - -#include - -#include "../attach_env.hpp" -#include "format_number_jni.hpp" - -namespace mbgl { -namespace android { - -void NumberFormat::registerNative(jni::JNIEnv& env) { - jni::Class::Singleton(env); -} - -jni::Local> NumberFormat::getInstance(jni::JNIEnv& env, const jni::Object& locale) { - static auto& javaClass = jni::Class::Singleton(env); - static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "getInstance"); - return javaClass.Call(env, method, locale); -} - -jni::Local> NumberFormat::getCurrencyInstance(jni::JNIEnv& env, const jni::Object& locale) { - static auto& javaClass = jni::Class::Singleton(env); - static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "getCurrencyInstance"); - return javaClass.Call(env, method, locale); -} - -jni::Local NumberFormat::format(jni::JNIEnv& env, const jni::Object& nf, jni::jdouble number) { - static auto& javaClass = jni::Class::Singleton(env); - static auto method = javaClass.GetMethod(env, "format"); - return nf.Call(env, method, number); -} - -void NumberFormat::setMinimumFractionDigits(jni::JNIEnv& env, const jni::Object& nf, jni::jint value) { - static auto& javaClass = jni::Class::Singleton(env); - static auto method = javaClass.GetMethod(env, "setMinimumFractionDigits"); - return nf.Call(env, method, value); -} - -void NumberFormat::setMaximumFractionDigits(jni::JNIEnv& env, const jni::Object& nf, jni::jint value) { - static auto& javaClass = jni::Class::Singleton(env); - static auto method = javaClass.GetMethod(env, "setMaximumFractionDigits"); - return nf.Call(env, method, value); -} - -} // namespace android - -namespace platform { - -std::string formatNumber(double number, const std::string& localeId, const std::string& currency, - uint8_t minFractionDigits, uint8_t maxFractionDigits) { - - auto env{ android::AttachEnv() }; - - jni::Global> locale; - LanguageTag languageTag = !localeId.empty() ? LanguageTag::fromBCP47(localeId) : LanguageTag(); - if (!languageTag.language) { - locale = jni::NewGlobal(*env, android::Locale::getDefault(*env)); - } else if (!languageTag.region) { - locale = jni::NewGlobal(*env, android::Locale::New(*env, jni::Make(*env, *languageTag.language))); - } else { - locale = jni::NewGlobal(*env, android::Locale::New(*env, jni::Make(*env, *languageTag.language), - jni::Make(*env, *languageTag.region))); - } - - jni::Global> formatter; - if (currency.empty()) { - formatter = jni::NewGlobal(*env, android::NumberFormat::getInstance(*env, locale)); - android::NumberFormat::setMinimumFractionDigits(*env, formatter, static_cast(minFractionDigits)); - android::NumberFormat::setMaximumFractionDigits(*env, formatter, static_cast(maxFractionDigits)); - } else { - formatter = jni::NewGlobal(*env, android::NumberFormat::getCurrencyInstance(*env, locale)); - } - - auto result = android::NumberFormat::format(*env, formatter, static_cast(number)); - return jni::Make(*env, result); -} - -} // namespace platform -} // namespace mbgl diff --git a/platform/android/src/text/format_number_jni.hpp b/platform/android/src/text/format_number_jni.hpp deleted file mode 100644 index 1b63012c6e..0000000000 --- a/platform/android/src/text/format_number_jni.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include - -#include "../i18n/collator_jni.hpp" - -/* - android::NumberFormat is the JNI wrapper - of java/text/NumberFormat. - */ - -namespace mbgl { -namespace android { - -class NumberFormat { -public: - static constexpr auto Name() { return "java/text/NumberFormat"; }; - - static jni::Local> getInstance(jni::JNIEnv&, const jni::Object&); - static jni::Local> getCurrencyInstance(jni::JNIEnv&, const jni::Object&); - static jni::Local format(jni::JNIEnv&, const jni::Object&, jni::jdouble); - static void setMinimumFractionDigits(jni::JNIEnv&, const jni::Object&, jni::jint); - static void setMaximumFractionDigits(jni::JNIEnv&, const jni::Object&, jni::jint); - - static void registerNative(jni::JNIEnv&); -}; - -} // namespace android -} // namespace mbgl diff --git a/platform/darwin/src/number_format.mm b/platform/darwin/src/number_format.mm new file mode 100644 index 0000000000..86f16eb6dd --- /dev/null +++ b/platform/darwin/src/number_format.mm @@ -0,0 +1,36 @@ +#import + +#include + +namespace mbgl { +namespace platform { + +std::string formatNumber(double number, const std::string& localeId, const std::string& currency, + uint8_t minFractionDigits, uint8_t maxFractionDigits) { + + static NSNumberFormatter *numberFormatter; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + numberFormatter = [[NSNumberFormatter alloc] init]; + }); + + numberFormatter.locale = !localeId.empty() ? [NSLocale localeWithLocaleIdentifier:@(localeId.c_str())] : nil; + numberFormatter.currencyCode = !currency.empty() ? @(currency.c_str()) : nil; + if (currency.empty()) { + numberFormatter.minimumFractionDigits = minFractionDigits; + numberFormatter.maximumFractionDigits = maxFractionDigits; + numberFormatter.numberStyle = NSNumberFormatterDecimalStyle; + } else { + // Reset fraction digits to NSNumberFormatter's default values, so that the + // system will choose formatting based on number formatter locale. + numberFormatter.minimumFractionDigits = 0; + numberFormatter.maximumFractionDigits = 0; + numberFormatter.numberStyle = NSNumberFormatterCurrencyStyle; + } + NSString *formatted = [numberFormatter stringFromNumber:@(number)]; + std::string result = std::string([formatted UTF8String]); + return result; +} + +} // namespace platform +} // namespace mbgl diff --git a/platform/darwin/src/string_nsstring.mm b/platform/darwin/src/string_nsstring.mm index 382a2acf33..d7c81236ef 100644 --- a/platform/darwin/src/string_nsstring.mm +++ b/platform/darwin/src/string_nsstring.mm @@ -27,32 +27,5 @@ std::string lowercase(const std::string &string) { return result; } -std::string formatNumber(double number, const std::string& localeId, const std::string& currency, - uint8_t minFractionDigits, uint8_t maxFractionDigits) { - - static NSNumberFormatter *numberFormatter; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - numberFormatter = [[NSNumberFormatter alloc] init]; - }); - - numberFormatter.locale = !localeId.empty() ? [NSLocale localeWithLocaleIdentifier:@(localeId.c_str())] : nil; - numberFormatter.currencyCode = !currency.empty() ? @(currency.c_str()) : nil; - if (currency.empty()) { - numberFormatter.minimumFractionDigits = minFractionDigits; - numberFormatter.maximumFractionDigits = maxFractionDigits; - numberFormatter.numberStyle = NSNumberFormatterDecimalStyle; - } else { - // Reset fraction digits to NSNumberFormatter's default values, so that the - // system will choose formatting based on number formatter locale. - numberFormatter.minimumFractionDigits = 0; - numberFormatter.maximumFractionDigits = 0; - numberFormatter.numberStyle = NSNumberFormatterCurrencyStyle; - } - NSString *formatted = [numberFormatter stringFromNumber:@(number)]; - std::string result = std::string([formatted UTF8String]); - return result; -} - -} -} +} // namespace platform +} // namespace mbgl diff --git a/platform/default/src/mbgl/i18n/format_number.cpp b/platform/default/src/mbgl/i18n/format_number.cpp new file mode 100644 index 0000000000..7b6f24221d --- /dev/null +++ b/platform/default/src/mbgl/i18n/format_number.cpp @@ -0,0 +1,39 @@ +#include + +#include + +namespace mbgl { +namespace platform { + +std::string formatNumber(double number, const std::string& localeId, const std::string& currency, + uint8_t minFractionDigits, uint8_t maxFractionDigits) { + + UErrorCode status = U_ZERO_ERROR; + icu::UnicodeString ustr; + std::string formatted; + + icu::Locale locale = icu::Locale(localeId.c_str()); + // Print the value as currency + if (!currency.empty()) { + icu::UnicodeString ucurrency = icu::UnicodeString::fromUTF8(currency); + ustr = icu::number::NumberFormatter::with() + .unit(icu::CurrencyUnit(ucurrency.getBuffer(), status)) + .locale(locale) + .formatDouble(number, status) + .toString(); + } else { + ustr = icu::number::NumberFormatter::with() +#if U_ICU_VERSION_MAJOR_NUM >= 62 + .precision(icu::number::Precision::minMaxFraction(minFractionDigits, maxFractionDigits)) +#else + .rounding(icu::number::Rounder::minMaxFraction(minFractionDigits, maxFractionDigits)) +#endif + .locale(locale) + .formatDouble(number, status) + .toString(); + } + return ustr.toUTF8String(formatted); +} + +} // namespace platform +} // namespace mbgl diff --git a/platform/default/src/mbgl/i18n/number_format.cpp b/platform/default/src/mbgl/i18n/number_format.cpp new file mode 100644 index 0000000000..7f2bc5a5ef --- /dev/null +++ b/platform/default/src/mbgl/i18n/number_format.cpp @@ -0,0 +1,41 @@ +#include + +#include + +namespace mbgl { +namespace platform { + +std::string formatNumber(double number, + const std::string& localeId, + const std::string& currency, + uint8_t minFractionDigits, + uint8_t maxFractionDigits) { + UErrorCode status = U_ZERO_ERROR; + icu::UnicodeString ustr; + std::string formatted; + + icu::Locale locale = icu::Locale(localeId.c_str()); + // Print the value as currency + if (!currency.empty()) { + icu::UnicodeString ucurrency = icu::UnicodeString::fromUTF8(currency); + ustr = icu::number::NumberFormatter::with() + .unit(icu::CurrencyUnit(ucurrency.getBuffer(), status)) + .locale(locale) + .formatDouble(number, status) + .toString(); + } else { + ustr = icu::number::NumberFormatter::with() +#if U_ICU_VERSION_MAJOR_NUM >= 62 + .precision(icu::number::Precision::minMaxFraction(minFractionDigits, maxFractionDigits)) +#else + .rounding(icu::number::Rounder::minMaxFraction(minFractionDigits, maxFractionDigits)) +#endif + .locale(locale) + .formatDouble(number, status) + .toString(); + } + return ustr.toUTF8String(formatted); +} + +} // namespace platform +} // namespace mbgl diff --git a/platform/default/src/mbgl/util/format_number.cpp b/platform/default/src/mbgl/util/format_number.cpp deleted file mode 100644 index d1b51e11a1..0000000000 --- a/platform/default/src/mbgl/util/format_number.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include - -#include - -namespace mbgl { -namespace platform { - -std::string formatNumber(double number, const std::string& localeId, const std::string& currency, - uint8_t minFractionDigits, uint8_t maxFractionDigits) { - - UErrorCode status = U_ZERO_ERROR; - icu::UnicodeString ustr; - std::string formatted; - - icu::Locale locale = icu::Locale(localeId.c_str()); - // Print the value as currency - if (!currency.empty()) { - icu::UnicodeString ucurrency = icu::UnicodeString::fromUTF8(currency); - ustr = icu::number::NumberFormatter::with() - .unit(icu::CurrencyUnit(ucurrency.getBuffer(), status)) - .locale(locale) - .formatDouble(number, status) - .toString(); - } else { - ustr = icu::number::NumberFormatter::with() -#if U_ICU_VERSION_MAJOR_NUM >= 62 - .precision(icu::number::Precision::minMaxFraction(minFractionDigits, maxFractionDigits)) -#else - .rounding(icu::number::Rounder::minMaxFraction(minFractionDigits, maxFractionDigits)) -#endif - .locale(locale) - .formatDouble(number, status) - .toString(); - } - return ustr.toUTF8String(formatted); -} - -} // namespace platform -} // namespace mbgl diff --git a/platform/ios/core-files.json b/platform/ios/core-files.json index c4930b1667..7c916b027b 100644 --- a/platform/ios/core-files.json +++ b/platform/ios/core-files.json @@ -7,6 +7,7 @@ "platform/darwin/src/image.mm", "platform/darwin/src/local_glyph_rasterizer.mm", "platform/darwin/src/logging_nslog.mm", + "platform/darwin/src/number_format.mm", "platform/darwin/src/nsthread.mm", "platform/darwin/src/reachability.m", "platform/darwin/src/string_nsstring.mm", diff --git a/platform/linux/config.cmake b/platform/linux/config.cmake index 01c46c9fcb..26de2430ce 100644 --- a/platform/linux/config.cmake +++ b/platform/linux/config.cmake @@ -45,17 +45,17 @@ macro(mbgl_platform_core) PRIVATE platform/linux/src/gl_functions.cpp # Misc + PRIVATE platform/default/src/mbgl/i18n/collator.cpp + PRIVATE platform/default/src/mbgl/i18n/number_format.cpp + PRIVATE platform/default/src/mbgl/text/bidi.cpp + PRIVATE platform/default/src/mbgl/text/local_glyph_rasterizer.cpp + PRIVATE platform/default/src/mbgl/layermanager/layer_manager.cpp PRIVATE platform/default/src/mbgl/util/compression.cpp PRIVATE platform/default/src/mbgl/util/logging_stderr.cpp PRIVATE platform/default/src/mbgl/util/string_stdlib.cpp PRIVATE platform/default/src/mbgl/util/thread.cpp - PRIVATE platform/default/src/mbgl/text/bidi.cpp - PRIVATE platform/default/src/mbgl/i18n/collator.cpp - PRIVATE platform/default/src/mbgl/layermanager/layer_manager.cpp - PRIVATE platform/default/src/mbgl/text/local_glyph_rasterizer.cpp PRIVATE platform/default/src/mbgl/util/thread_local.cpp PRIVATE platform/default/src/mbgl/util/utf.cpp - PRIVATE platform/default/src/mbgl/util/format_number.cpp # Image handling PRIVATE platform/default/src/mbgl/util/image.cpp @@ -86,7 +86,7 @@ macro(mbgl_platform_core) target_add_mason_package(mbgl-core PRIVATE icu) # Ignore warning caused by ICU header unistr.h in some CI environments - set_source_files_properties(platform/default/src/mbgl/util/format_number.cpp PROPERTIES COMPILE_FLAGS -Wno-error=shadow) + set_source_files_properties(platform/default/src/mbgl/i18n/number_format.cpp PROPERTIES COMPILE_FLAGS -Wno-error=shadow) # Link all ICU libraries (by default only libicuuc is linked) find_library(LIBICUI18N NAMES icui18n HINTS ${MASON_PACKAGE_icu_INCLUDE_DIRS}/../lib) diff --git a/platform/macos/core-files.json b/platform/macos/core-files.json index 21b0e698f0..b0536c4863 100644 --- a/platform/macos/core-files.json +++ b/platform/macos/core-files.json @@ -7,6 +7,7 @@ "platform/darwin/src/local_glyph_rasterizer.mm", "platform/darwin/src/logging_nslog.mm", "platform/darwin/src/nsthread.mm", + "platform/darwin/src/number_format.mm", "platform/darwin/src/reachability.m", "platform/darwin/src/string_nsstring.mm", "platform/default/src/mbgl/gfx/headless_backend.cpp", diff --git a/platform/qt/src/format_number.cpp b/platform/qt/src/format_number.cpp deleted file mode 100644 index b6fe3558e6..0000000000 --- a/platform/qt/src/format_number.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include - -#include -#include - -namespace mbgl { -namespace platform { - -std::string formatNumber(double number, const std::string& localeId, const std::string& currency, - uint8_t minFractionDigits, uint8_t maxFractionDigits) { - - QString formatted; - // Qt Locale::toString() API takes only one precision argument - (void)minFractionDigits; - QLocale locale = QLocale(QString::fromStdString(localeId)); - - if (!currency.empty()) { - formatted = locale.toCurrencyString(number); - } else { - formatted = locale.toString(number, 'f', maxFractionDigits); - } - return formatted.toStdString(); -} - -} // namespace platform -} // namespace mbgl diff --git a/platform/qt/src/number_format.cpp b/platform/qt/src/number_format.cpp new file mode 100644 index 0000000000..b6fe3558e6 --- /dev/null +++ b/platform/qt/src/number_format.cpp @@ -0,0 +1,26 @@ +#include + +#include +#include + +namespace mbgl { +namespace platform { + +std::string formatNumber(double number, const std::string& localeId, const std::string& currency, + uint8_t minFractionDigits, uint8_t maxFractionDigits) { + + QString formatted; + // Qt Locale::toString() API takes only one precision argument + (void)minFractionDigits; + QLocale locale = QLocale(QString::fromStdString(localeId)); + + if (!currency.empty()) { + formatted = locale.toCurrencyString(number); + } else { + formatted = locale.toString(number, 'f', maxFractionDigits); + } + return formatted.toStdString(); +} + +} // namespace platform +} // namespace mbgl diff --git a/src/core-files.json b/src/core-files.json index 2f609e92ec..a460ab86df 100644 --- a/src/core-files.json +++ b/src/core-files.json @@ -333,6 +333,8 @@ "mbgl/gfx/renderer_backend.hpp": "include/mbgl/gfx/renderer_backend.hpp", "mbgl/gl/renderable_resource.hpp": "include/mbgl/gl/renderable_resource.hpp", "mbgl/gl/renderer_backend.hpp": "include/mbgl/gl/renderer_backend.hpp", + "mbgl/i18n/collator.hpp": "include/mbgl/i18n/collator.hpp", + "mbgl/i18n/number_format.hpp": "include/mbgl/i18n/number_format.hpp", "mbgl/layermanager/background_layer_factory.hpp": "include/mbgl/layermanager/background_layer_factory.hpp", "mbgl/layermanager/circle_layer_factory.hpp": "include/mbgl/layermanager/circle_layer_factory.hpp", "mbgl/layermanager/custom_layer_factory.hpp": "include/mbgl/layermanager/custom_layer_factory.hpp", diff --git a/src/mbgl/style/expression/number_format.cpp b/src/mbgl/style/expression/number_format.cpp index e31a9ce398..c2de032ff4 100644 --- a/src/mbgl/style/expression/number_format.cpp +++ b/src/mbgl/style/expression/number_format.cpp @@ -1,6 +1,6 @@ -#include +#include #include -#include +#include namespace mbgl { namespace style { -- cgit v1.2.1