number_formatting.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1// Copyright (c) 2008 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/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
16namespace base {
17
18namespace {
19
20struct 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
36static LazyInstance<NumberFormatWrapper> g_number_format(LINKER_INITIALIZED);
37
38string16 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