diff --git a/deps/v8/AUTHORS b/deps/v8/AUTHORS index 4f853c275bc249..72c23bcc83e0b7 100644 --- a/deps/v8/AUTHORS +++ b/deps/v8/AUTHORS @@ -44,6 +44,7 @@ Bert Belder Burcu Dogan Caitlin Potter Craig Schlenter +Chris Nardi Christopher A. Taylor Daniel Andersson Daniel James diff --git a/deps/v8/src/i18n.cc b/deps/v8/src/i18n.cc index 1d735c97f1f048..c10890e89e5937 100644 --- a/deps/v8/src/i18n.cc +++ b/deps/v8/src/i18n.cc @@ -258,7 +258,24 @@ icu::DecimalFormat* CreateICUNumberFormat( #endif number_format = static_cast( - icu::NumberFormat::createInstance(icu_locale, format_style, status)); + icu::NumberFormat::createInstance(icu_locale, format_style, status)); + + if (U_FAILURE(status)) { + delete number_format; + return NULL; + } + + UErrorCode status_digits = U_ZERO_ERROR; + uint32_t fraction_digits = ucurr_getDefaultFractionDigits( + currency.getTerminatedBuffer(), &status_digits); + if (U_SUCCESS(status_digits)) { + number_format->setMinimumFractionDigits(fraction_digits); + number_format->setMaximumFractionDigits(fraction_digits); + } else { + // Set min & max to default values (previously in i18n.js) + number_format->setMinimumFractionDigits(0); + number_format->setMaximumFractionDigits(3); + } } else if (style == UNICODE_STRING_SIMPLE("percent")) { number_format = static_cast( icu::NumberFormat::createPercentInstance(icu_locale, status)); diff --git a/deps/v8/src/i18n.js b/deps/v8/src/i18n.js index 79e988062e9425..01e2fb65eb163a 100644 --- a/deps/v8/src/i18n.js +++ b/deps/v8/src/i18n.js @@ -1099,11 +1099,20 @@ function initializeNumberFormat(numberFormat, locales, options) { var mnid = getNumberOption(options, 'minimumIntegerDigits', 1, 21, 1); defineWEProperty(internalOptions, 'minimumIntegerDigits', mnid); - var mnfd = getNumberOption(options, 'minimumFractionDigits', 0, 20, 0); - defineWEProperty(internalOptions, 'minimumFractionDigits', mnfd); + var mnfd = options['minimumFractionDigits']; + var mxfd = options['maximumFractionDigits']; + if (!IS_UNDEFINED(mnfd) || internalOptions.style !== 'currency') { + mnfd = getNumberOption(options, 'minimumFractionDigits', 0, 20, 0); + defineWEProperty(internalOptions, 'minimumFractionDigits', mnfd); + } - var mxfd = getNumberOption(options, 'maximumFractionDigits', mnfd, 20, 3); - defineWEProperty(internalOptions, 'maximumFractionDigits', mxfd); + if (!IS_UNDEFINED(mxfd) || internalOptions.style !== 'currency') { + var min_mxfd = internalOptions.style === 'percent' ? 0 : 3; + mnfd = IS_UNDEFINED(mnfd) ? 0 : mnfd; + fallback_limit = (mnfd > min_mxfd) ? mnfd : min_mxfd; + mxfd = getNumberOption(options, 'maximumFractionDigits', mnfd, 20, fallback_limit); + defineWEProperty(internalOptions, 'maximumFractionDigits', mxfd); + } var mnsd = options['minimumSignificantDigits']; var mxsd = options['maximumSignificantDigits']; @@ -1157,8 +1166,6 @@ function initializeNumberFormat(numberFormat, locales, options) { internalOptions, resolved); - // We can't get information about number or currency style from ICU, so we - // assume user request was fulfilled. if (internalOptions.style === 'currency') { ObjectDefineProperty(resolved, 'currencyDisplay', {value: currencyDisplay, writable: true}); diff --git a/deps/v8/test/intl/number-format/check-minimum-fraction-digits.js b/deps/v8/test/intl/number-format/check-minimum-fraction-digits.js new file mode 100755 index 00000000000000..b7d41dfca1a030 --- /dev/null +++ b/deps/v8/test/intl/number-format/check-minimum-fraction-digits.js @@ -0,0 +1,57 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Make sure minimumFractionDigits and maximumFractionDigits are honored + +var nf = new Intl.NumberFormat("en-us", { useGrouping: false, minimumFractionDigits: 4, maximumFractionDigits: 8}); + +assertEquals("12345.6789", nf.format(12345.6789)); +assertEquals("12345.678912", nf.format(12345.678912)); +assertEquals("12345.6700", nf.format(12345.67)); +assertEquals("12345.67891234", nf.format(12345.6789123421)); + +nf = new Intl.NumberFormat("en-us", { useGrouping: false, minimumFractionDigits: 4, maximumFractionDigits: 8, style: 'percent'}); + +assertEquals("12345.6789%", nf.format(123.456789)); +assertEquals("12345.678912%", nf.format(123.45678912)); +assertEquals("12345.6700%", nf.format(123.4567)); +assertEquals("12345.67891234%", nf.format(123.456789123421)); + +nf = new Intl.NumberFormat('en', {minimumFractionDigits: 4, maximumFractionDigits: 8, style: 'currency', currency: 'USD'}); + +assertEquals("$54,306.404797", nf.format(54306.4047970)); +assertEquals("$54,306.4000", nf.format(54306.4)); +assertEquals("$54,306.40000001", nf.format(54306.400000011)); + +// Ensure that appropriate defaults exist when minimum and maximum are not specified + +nf = new Intl.NumberFormat("en-us", { useGrouping: false }); + +assertEquals("12345.679", nf.format(12345.6789)); +assertEquals("12345.679", nf.format(12345.678912)); +assertEquals("12345.67", nf.format(12345.6700)); +assertEquals("12345", nf.format(12345)); +assertEquals("12345.679", nf.format(12345.6789123421)); + +nf = new Intl.NumberFormat("en-us", { useGrouping: false, style: 'percent'}); + +assertEquals("12346%", nf.format(123.456789)); +assertEquals("12346%", nf.format(123.45678912)); +assertEquals("12346%", nf.format(123.456700)); +assertEquals("12346%", nf.format(123.456789123421)); +assertEquals("12345%", nf.format(123.45)); + +// For currency, the minimum or the maximum can be overwritten individually + +nf = new Intl.NumberFormat('en', {minimumFractionDigits: 0, style: 'currency', currency: 'USD'}); + +assertEquals("$54,306.4", nf.format(54306.4047970)); +assertEquals("$54,306.4", nf.format(54306.4)); +assertEquals("$54,306", nf.format(54306)); + +nf = new Intl.NumberFormat('en', {maximumFractionDigits: 3, style: 'currency', currency: 'USD'}); + +assertEquals("$54,306.405", nf.format(54306.4047970)); +assertEquals("$54,306.40", nf.format(54306.4)); +assertEquals("$54,306.00", nf.format(54306)); diff --git a/deps/v8/test/intl/number-format/format-currency.js b/deps/v8/test/intl/number-format/format-currency.js new file mode 100755 index 00000000000000..4a8db4e7d5851b --- /dev/null +++ b/deps/v8/test/intl/number-format/format-currency.js @@ -0,0 +1,18 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Make sure currency formatting is correct (for USD only displays two decimal +// places, for JPY 0, and for EUR 2). + +var nf_USD = new Intl.NumberFormat(['en'], {style: 'currency', currency: 'USD'}); + +assertEquals("$54,306.40", nf_USD.format(parseFloat(54306.4047970))); + +var nf_JPY = new Intl.NumberFormat(['ja'], {style: 'currency', currency: 'JPY'}); + +assertEquals("¥54,306", nf_JPY.format(parseFloat(54306.4047970))); + +var nf_EUR = new Intl.NumberFormat(['pt'], {style: 'currency', currency: 'EUR'}); + +assertEquals("€1.000,00", nf_EUR.format(1000.00));