diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-09-23 17:22:38 +0300 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-09-26 10:55:47 +0300 |
commit | e5cdc4ecf362dadf2da148a22cf97aaf3c9c4ecf (patch) | |
tree | ebae02fa6a6da0f4c81cb72df87c6d7359c17acd /platform/android/src/i18n/number_format.cpp | |
parent | 9c8295c6a64b6f5b2c9b67fd01633a156481a3c8 (diff) | |
download | qtlocation-mapboxgl-e5cdc4ecf362dadf2da148a22cf97aaf3c9c4ecf.tar.gz |
[core][android][darwin] Move number format to i18n
Diffstat (limited to 'platform/android/src/i18n/number_format.cpp')
-rw-r--r-- | platform/android/src/i18n/number_format.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
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 <mbgl/i18n/number_format.hpp> +#include <mbgl/text/language_tag.hpp> + +#include <jni/jni.hpp> + +#include "../attach_env.hpp" +#include "number_format_jni.hpp" + +namespace mbgl { +namespace android { + +void NumberFormat::registerNative(jni::JNIEnv& env) { + jni::Class<NumberFormat>::Singleton(env); +} + +jni::Local<jni::Object<NumberFormat>> NumberFormat::getInstance(jni::JNIEnv& env, const jni::Object<Locale>& locale) { + static auto& javaClass = jni::Class<NumberFormat>::Singleton(env); + static auto method = javaClass.GetStaticMethod<jni::Object<NumberFormat> (jni::Object<Locale>)>(env, "getInstance"); + return javaClass.Call(env, method, locale); +} + +jni::Local<jni::Object<NumberFormat>> NumberFormat::getCurrencyInstance(jni::JNIEnv& env, const jni::Object<Locale>& locale) { + static auto& javaClass = jni::Class<NumberFormat>::Singleton(env); + static auto method = javaClass.GetStaticMethod<jni::Object<NumberFormat> (jni::Object<Locale>)>(env, "getCurrencyInstance"); + return javaClass.Call(env, method, locale); +} + +jni::Local<jni::String> NumberFormat::format(jni::JNIEnv& env, const jni::Object<NumberFormat>& nf, jni::jdouble number) { + static auto& javaClass = jni::Class<NumberFormat>::Singleton(env); + static auto method = javaClass.GetMethod<jni::String (jni::jdouble)>(env, "format"); + return nf.Call(env, method, number); +} + +void NumberFormat::setMinimumFractionDigits(jni::JNIEnv& env, const jni::Object<NumberFormat>& nf, jni::jint value) { + static auto& javaClass = jni::Class<NumberFormat>::Singleton(env); + static auto method = javaClass.GetMethod<void (jni::jint)>(env, "setMinimumFractionDigits"); + return nf.Call(env, method, value); +} + +void NumberFormat::setMaximumFractionDigits(jni::JNIEnv& env, const jni::Object<NumberFormat>& nf, jni::jint value) { + static auto& javaClass = jni::Class<NumberFormat>::Singleton(env); + static auto method = javaClass.GetMethod<void (jni::jint)>(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<jni::Object<android::Locale>> 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<jni::String>(*env, *languageTag.language))); + } else { + locale = jni::NewGlobal(*env, android::Locale::New(*env, jni::Make<jni::String>(*env, *languageTag.language), + jni::Make<jni::String>(*env, *languageTag.region))); + } + + jni::Global<jni::Object<android::NumberFormat>> formatter; + if (currency.empty()) { + formatter = jni::NewGlobal(*env, android::NumberFormat::getInstance(*env, locale)); + android::NumberFormat::setMinimumFractionDigits(*env, formatter, static_cast<jni::jint>(minFractionDigits)); + android::NumberFormat::setMaximumFractionDigits(*env, formatter, static_cast<jni::jint>(maxFractionDigits)); + } else { + formatter = jni::NewGlobal(*env, android::NumberFormat::getCurrencyInstance(*env, locale)); + } + + auto result = android::NumberFormat::format(*env, formatter, static_cast<jni::jdouble>(number)); + return jni::Make<std::string>(*env, result); +} + +} // namespace platform +} // namespace mbgl |