1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/i18n/number_formatting.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/format_macros.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h"
921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/lazy_instance.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string_util.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/utf_string_conversions.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/numfmt.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/ustring.h"
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstruct NumberFormatWrapper {
2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  NumberFormatWrapper() {
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // There's no ICU call to destroy a NumberFormat object other than
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // operator delete, so use the default Delete, which calls operator delete.
2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // This can cause problems if a different allocator is used by this file
2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // than by ICU.
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode status = U_ZERO_ERROR;
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    number_format.reset(icu::NumberFormat::createInstance(status));
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    DCHECK(U_SUCCESS(status));
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_ptr<icu::NumberFormat> number_format;
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstatic LazyInstance<NumberFormatWrapper> g_number_format(LINKER_INITIALIZED);
3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstring16 FormatNumber(int64 number) {
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  icu::NumberFormat* number_format = g_number_format.Get().number_format.get();
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!number_format) {
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // As a fallback, just return the raw number in a string.
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return UTF8ToUTF16(StringPrintf("%" PRId64, number));
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  icu::UnicodeString ustr;
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  number_format->format(number, ustr);
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return string16(ustr.getBuffer(), static_cast<size_t>(ustr.length()));
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
52