diff --git a/i18nutil/Library_i18nutil.mk b/i18nutil/Library_i18nutil.mk index 8c0aaf0ef1eb..1c5837c30e16 100644 --- a/i18nutil/Library_i18nutil.mk +++ b/i18nutil/Library_i18nutil.mk @@ -21,6 +21,8 @@ $(eval $(call gb_Library_Library,i18nutil)) $(eval $(call gb_Library_use_externals,i18nutil,\ boost_headers \ icu_headers \ + icui18n \ + icuuc \ )) $(eval $(call gb_Library_use_custom_headers,i18nutil,\ @@ -34,6 +36,7 @@ $(eval $(call gb_Library_add_defs,i18nutil,\ )) $(eval $(call gb_Library_use_libraries,i18nutil,\ + i18nlangtag \ comphelper \ cppu \ sal \ diff --git a/i18nutil/source/utility/unicode.cxx b/i18nutil/source/utility/unicode.cxx index 009896987b6e..56daacdacd1a 100644 --- a/i18nutil/source/utility/unicode.cxx +++ b/i18nutil/source/utility/unicode.cxx @@ -17,10 +17,14 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include #include #include #include +#include +#include #include +#include #include "unicode_data.h" // Workaround for glibc braindamage: @@ -934,4 +938,26 @@ OString SAL_CALL unicode::getExemplarLanguageForUScriptCode(UScriptCode eScript) return sRet; } +//Format a number as a percentage according to the rules of the given +//language, e.g. 100 -> "100%" for en-US vs "100 %" for de-DE +OUString SAL_CALL unicode::formatPercent(double dNumber, + const LanguageTag &rLangTag) +{ + // get a currency formatter for this locale ID + UErrorCode errorCode=U_ZERO_ERROR; + icu::Locale aLocale = LanguageTagIcu::getIcuLocale(rLangTag); + boost::scoped_ptr xF( + NumberFormat::createPercentInstance(aLocale, errorCode)); + if(U_FAILURE(errorCode)) + { + SAL_WARN("i18n", "NumberFormat::createPercentInstance failed"); + return OUString::number(dNumber) + "%"; + } + + UnicodeString output; + xF->format(dNumber, output); + return OUString(reinterpret_cast(output.getBuffer()), + output.length()); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/i18nutil/unicode.hxx b/include/i18nutil/unicode.hxx index ae1ad060f2f2..e3210390e2eb 100644 --- a/include/i18nutil/unicode.hxx +++ b/include/i18nutil/unicode.hxx @@ -24,6 +24,8 @@ #include #include +class LanguageTag; + typedef struct _ScriptTypeList { sal_Int16 from; sal_Int16 to; @@ -54,6 +56,11 @@ public: //Return a language that can be written in a given ISO 15924 script code static OString SAL_CALL getExemplarLanguageForUScriptCode(UScriptCode eScript); + + //Format a number as a percentage according to the rules of the given + //language, e.g. 100 -> "100%" for en-US vs "100 %" for de-DE + static OUString SAL_CALL formatPercent(double dNumber, + const LanguageTag &rLangTag); }; #endif