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