Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Unified Diff: base/i18n/number_formatting.cc

Issue 1989563002: i18n of Zoom % to use locally correct numeric glyphs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/i18n/number_formatting.cc
diff --git a/base/i18n/number_formatting.cc b/base/i18n/number_formatting.cc
index 6f454a0848bdb3aa7fe0c1d3f5aafbb04be58030..4fc5d7e4d6bbe817d181acb3834b909fe0fcc248 100644
--- a/base/i18n/number_formatting.cc
+++ b/base/i18n/number_formatting.cc
@@ -23,28 +23,35 @@ namespace {
// A simple wrapper around icu::NumberFormat that allows for resetting it
// (as LazyInstance does not).
-struct NumberFormatWrapper {
- NumberFormatWrapper() {
- Reset();
- }
-
- void Reset() {
+struct FormatWrapper {
+ void Reset(UNumberFormatStyle kind) {
// There's no ICU call to destroy a NumberFormat object other than
// operator delete, so use the default Delete, which calls operator delete.
// This can cause problems if a different allocator is used by this file
// than by ICU.
UErrorCode status = U_ZERO_ERROR;
- number_format.reset(icu::NumberFormat::createInstance(status));
+ number_format.reset(icu::NumberFormat::createInstance(
+ icu::Locale::getDefault(), kind, status));
DCHECK(U_SUCCESS(status));
}
std::unique_ptr<icu::NumberFormat> number_format;
};
+struct NumberFormatWrapper : FormatWrapper {
+ NumberFormatWrapper() { Reset(UNUM_DECIMAL); }
+};
+
+struct PercentFormatWrapper : FormatWrapper {
+ PercentFormatWrapper() { Reset(UNUM_PERCENT); }
+};
+
LazyInstance<NumberFormatWrapper> g_number_format_int =
LAZY_INSTANCE_INITIALIZER;
LazyInstance<NumberFormatWrapper> g_number_format_float =
LAZY_INSTANCE_INITIALIZER;
+LazyInstance<PercentFormatWrapper> g_number_format_percent =
+ LAZY_INSTANCE_INITIALIZER;
} // namespace
@@ -78,11 +85,33 @@ string16 FormatDouble(double number, int fractional_digits) {
return string16(ustr.getBuffer(), static_cast<size_t>(ustr.length()));
}
+string16 FormatPercent(int number) {
+ return FormatPercentFromDouble(static_cast<double>(number) / 100.0, 0);
Greg Levin 2016/05/17 18:17:44 I don't totally understand why the NumberFormat ob
jungshik at Google 2016/05/17 23:58:42 Well, none of percent format used in our UI has fr
Greg Levin 2016/05/18 21:33:44 Sure. This function can just be return i18n::Mes
+}
+
+string16 FormatPercentFromDouble(double number, int fractional_digits) {
+ icu::NumberFormat* percent_format =
+ g_number_format_percent.Get().number_format.get();
+
+ if (!percent_format) {
+ // As a fallback, just return the default percent formatting in a string.
+ return UTF8ToUTF16(
+ StringPrintf("%.*f%%", fractional_digits, number * 100.0));
+ }
+ percent_format->setMaximumFractionDigits(fractional_digits);
+ percent_format->setMinimumFractionDigits(fractional_digits);
+ icu::UnicodeString ustr;
+ percent_format->format(number, ustr);
+
+ return string16(ustr.getBuffer(), static_cast<size_t>(ustr.length()));
+}
+
namespace testing {
void ResetFormatters() {
- g_number_format_int.Get().Reset();
- g_number_format_float.Get().Reset();
+ g_number_format_int.Get().Reset(UNUM_DECIMAL);
+ g_number_format_float.Get().Reset(UNUM_DECIMAL);
+ g_number_format_percent.Get().Reset(UNUM_PERCENT);
}
} // namespace testing

Powered by Google App Engine
This is Rietveld 408576698