Home | History | Annotate | Download | only in i18n
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/i18n/number_formatting.h"
      6 
      7 #include "base/format_macros.h"
      8 #include "base/logging.h"
      9 #include "base/lazy_instance.h"
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/string_util.h"
     12 #include "base/utf_string_conversions.h"
     13 #include "unicode/numfmt.h"
     14 #include "unicode/ustring.h"
     15 
     16 namespace base {
     17 
     18 namespace {
     19 
     20 struct NumberFormatWrapper {
     21   NumberFormatWrapper() {
     22     // There's no ICU call to destroy a NumberFormat object other than
     23     // operator delete, so use the default Delete, which calls operator delete.
     24     // This can cause problems if a different allocator is used by this file
     25     // than by ICU.
     26     UErrorCode status = U_ZERO_ERROR;
     27     number_format.reset(icu::NumberFormat::createInstance(status));
     28     DCHECK(U_SUCCESS(status));
     29   }
     30 
     31   scoped_ptr<icu::NumberFormat> number_format;
     32 };
     33 
     34 }  // namespace
     35 
     36 static LazyInstance<NumberFormatWrapper> g_number_format(LINKER_INITIALIZED);
     37 
     38 string16 FormatNumber(int64 number) {
     39   icu::NumberFormat* number_format = g_number_format.Get().number_format.get();
     40 
     41   if (!number_format) {
     42     // As a fallback, just return the raw number in a string.
     43     return UTF8ToUTF16(StringPrintf("%" PRId64, number));
     44   }
     45   icu::UnicodeString ustr;
     46   number_format->format(number, ustr);
     47 
     48   return string16(ustr.getBuffer(), static_cast<size_t>(ustr.length()));
     49 }
     50 
     51 }  // namespace base
     52