| Index: charted/lib/locale/format/number_format.dart
|
| diff --git a/charted/lib/locale/format/number_format.dart b/charted/lib/locale/format/number_format.dart
|
| deleted file mode 100644
|
| index d1c97a7ed0fa9e87f74a5072f2a67d9fd840597d..0000000000000000000000000000000000000000
|
| --- a/charted/lib/locale/format/number_format.dart
|
| +++ /dev/null
|
| @@ -1,221 +0,0 @@
|
| -/*
|
| - * Copyright 2014 Google Inc. All rights reserved.
|
| - *
|
| - * Use of this source code is governed by a BSD-style
|
| - * license that can be found in the LICENSE file or at
|
| - * https://developers.google.com/open-source/licenses/bsd
|
| - */
|
| -part of charted.locale.format;
|
| -
|
| -/**
|
| - * The number formatter of a given locale. Applying the locale specific
|
| - * number format, number grouping and currency symbol, etc.. The format
|
| - * function in the NumberFormat class is used to format a number by the given
|
| - * specifier with the number properties of the locale.
|
| - */
|
| -class NumberFormat {
|
| -
|
| - // [[fill]align][sign][symbol][0][width][,][.precision][type]
|
| - static RegExp FORMAT_REGEX =
|
| - new RegExp(r'(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?'
|
| - r'(\.-?\d+)?([a-z%])?', caseSensitive: false);
|
| -
|
| - String localeDecimal;
|
| - String localeThousands;
|
| - List localeGrouping;
|
| - List localeCurrency;
|
| - Function formatGroup;
|
| -
|
| - NumberFormat(Locale locale) {
|
| - localeDecimal = locale.decimal;
|
| - localeThousands = locale.thousands;
|
| - localeGrouping = locale.grouping;
|
| - localeCurrency = locale.currency;
|
| - formatGroup = (localeGrouping != null) ? (value) {
|
| - var i = value.length,
|
| - t = [],
|
| - j = 0,
|
| - g = localeGrouping[0];
|
| - while (i > 0 && g > 0) {
|
| - if (i - g >= 0) {
|
| - i = i - g;
|
| - } else {
|
| - g = i;
|
| - i = 0;
|
| - }
|
| - var length = (i + g) < value.length ? (i + g) : value.length;
|
| - t.add(value.substring(i, length));
|
| - g = localeGrouping[j = (j + 1) % localeGrouping.length];
|
| - }
|
| - return t.reversed.join(localeThousands);
|
| - } : (x) => x;
|
| - }
|
| -
|
| - /**
|
| - * Returns a new format function with the given string specifier. A format
|
| - * function takes a number as the only argument, and returns a string
|
| - * representing the formatted number. The format specifier is modeled after
|
| - * Python 3.1's built-in format specification mini-language. The general form
|
| - * of a specifier is:
|
| - * [[fill]align][sign][symbol][0][width][,][.precision][type].
|
| - *
|
| - * @see <a href="http://docs.python.org/release/3.1.3/library/string.html#formatspec">format specification mini-language</a>
|
| - */
|
| - FormatFunction format(String specifier) {
|
| - Match match = FORMAT_REGEX.firstMatch(specifier);
|
| - var fill = match.group(1) != null ? match.group(1) : ' ',
|
| - align = match.group(2) != null ? match.group(2) : '>',
|
| - sign = match.group(3) != null ? match.group(3) : '',
|
| - symbol = match.group(4) != null ? match.group(4) : '',
|
| - zfill = match.group(5),
|
| - width = match.group(6) != null ? int.parse(match.group(6)) : 0,
|
| - comma = match.group(7) != null,
|
| - precision = match.group(8) != null ?
|
| - int.parse(match.group(8).substring(1)) : null,
|
| - type = match.group(9),
|
| - scale = 1,
|
| - prefix = '',
|
| - suffix = '',
|
| - integer = false;
|
| -
|
| - if (zfill != null || fill == '0' && align == '=') {
|
| - zfill = fill = '0';
|
| - align = '=';
|
| - if (comma) {
|
| - width -= ((width - 1) / 4).floor();
|
| - }
|
| - }
|
| -
|
| - switch (type) {
|
| - case 'n': comma = true; type = 'g'; break;
|
| - case '%': scale = 100; suffix = '%'; type = 'f'; break;
|
| - case 'p': scale = 100; suffix = '%'; type = 'r'; break;
|
| - case 'b':
|
| - case 'o':
|
| - case 'x':
|
| - case 'X': if (symbol == '#') prefix = '0' + type.toLowerCase(); break;
|
| - case 'c':
|
| - case 'd': integer = true; precision = 0; break;
|
| - case 's': scale = -1; type = 'r'; break;
|
| - }
|
| -
|
| - if (symbol == '\$') {
|
| - prefix = localeCurrency[0];
|
| - suffix = localeCurrency[1];
|
| - }
|
| -
|
| - // If no precision is specified for r, fallback to general notation.
|
| - if (type == 'r' && precision == null) {
|
| - type = 'g';
|
| - }
|
| -
|
| - // Ensure that the requested precision is in the supported range.
|
| - if (precision != null) {
|
| - if (type == 'g') {
|
| - precision = math.max(1, math.min(21, precision));
|
| - } else if (type == 'e' || type == 'f') {
|
| - precision = math.max(0, math.min(20, precision));
|
| - }
|
| - }
|
| -
|
| - NumberFormatFunction formatFunction = _getFormatFunction(type);
|
| -
|
| - var zcomma = (zfill != null) && comma;
|
| -
|
| - return (value) {
|
| - var fullSuffix = suffix;
|
| -
|
| - // Return the empty string for floats formatted as ints.
|
| - if (integer && (value % 1) > 0) return '';
|
| -
|
| - // Convert negative to positive, and record the sign prefix.
|
| - var negative;
|
| - if (value < 0 || value == 0 && 1 / value < 0) {
|
| - value = -value;
|
| - negative = '-';
|
| - } else {
|
| - negative = sign;
|
| - }
|
| -
|
| - // Apply the scale, computing it from the value's exponent for si
|
| - // format. Preserve the existing suffix, if any, such as the
|
| - // currency symbol.
|
| - if (scale < 0) {
|
| - FormatPrefix unit = new FormatPrefix(value,
|
| - (precision != null) ? precision : 0);
|
| - value = unit.scale(value);
|
| - fullSuffix = unit.symbol + suffix;
|
| - } else {
|
| - value *= scale;
|
| - }
|
| -
|
| - // Convert to the desired precision.
|
| - if (precision != null) {
|
| - value = formatFunction(value, precision);
|
| - } else {
|
| - value = formatFunction(value);
|
| - }
|
| -
|
| - // Break the value into the integer part (before) and decimal part
|
| - // (after).
|
| - var i = value.lastIndexOf('.'),
|
| - before = i < 0 ? value : value.substring(0, i),
|
| - after = i < 0 ? '' : localeDecimal + value.substring(i + 1);
|
| -
|
| - // If the fill character is not '0', grouping is applied before
|
| - //padding.
|
| - if (zfill == null && comma) {
|
| - before = formatGroup(before);
|
| - }
|
| -
|
| - var length = prefix.length + before.length + after.length +
|
| - (zcomma ? 0 : negative.length),
|
| - padding = length < width ? new List.filled(
|
| - (length = width - length + 1), '').join(fill) : '';
|
| -
|
| - // If the fill character is '0', grouping is applied after padding.
|
| - if (zcomma) {
|
| - before = formatGroup(padding + before);
|
| - }
|
| -
|
| - // Apply prefix.
|
| - negative += prefix;
|
| -
|
| - // Rejoin integer and decimal parts.
|
| - value = before + after;
|
| -
|
| - // Apply any padding and alignment attributes before returning the string.
|
| - return (align == '<' ? negative + value + padding
|
| - : align == '>' ? padding + negative + value
|
| - : align == '^' ? padding.substring(0, length >>= 1) + negative +
|
| - value + padding.substring(length)
|
| - : negative + (zcomma ? value : padding + value)) + fullSuffix;
|
| - };
|
| - }
|
| -
|
| - // Gets the format function by given type.
|
| - NumberFormatFunction _getFormatFunction(String type) {
|
| - switch(type) {
|
| - case 'b':
|
| - return (num x, [int p = 0]) => x.toInt().toRadixString(2);
|
| - case 'c':
|
| - return (num x, [int p = 0]) => new String.fromCharCodes([x]);
|
| - case 'o':
|
| - return (num x, [int p = 0]) => x.toInt().toRadixString(8);
|
| - case 'x':
|
| - return (num x, [int p = 0]) => x.toInt().toRadixString(16);
|
| - case 'X':
|
| - return (num x, [int p = 0]) =>
|
| - x.toInt().toRadixString(16).toUpperCase();
|
| - case 'g':
|
| - return (num x, [int p = 1]) => x.toStringAsPrecision(p);
|
| - case 'e':
|
| - return (num x, [int p = 0]) => x.toStringAsExponential(p);
|
| - case 'f':
|
| - return (num x, [int p = 0]) => x.toStringAsFixed(p);
|
| - case 'r':
|
| - default:
|
| - return (num x, [int p = 0]) => x.toString();
|
| - }
|
| - }
|
| -}
|
|
|