in lib/src/intl/compact_number_format.dart [180:261]
factory _CompactNumberFormat(
{String? locale,
_CompactFormatType? formatType,
String? name,
String? currencySymbol,
String? Function(NumberSymbols) getPattern = _forDecimal,
int? decimalDigits,
bool lookupSimpleCurrencySymbol = false,
bool isForCurrency = false}) {
// Initialization copied from `NumberFormat` constructor.
// TODO(davidmorgan): deduplicate.
locale = helpers.verifiedLocale(locale, NumberFormat.localeExists, null)!;
var symbols = numberFormatSymbols[locale] as NumberSymbols;
var localeZero = symbols.ZERO_DIGIT.codeUnitAt(0);
var zeroOffset = localeZero - constants.asciiZeroCodeUnit;
name ??= symbols.DEF_CURRENCY_CODE;
if (currencySymbol == null && lookupSimpleCurrencySymbol) {
currencySymbol = constants.simpleCurrencySymbols[name];
}
currencySymbol ??= name;
var pattern = getPattern(symbols);
// CompactNumberFormat initialization.
/// Map from magnitude to formatting pattern for that magnitude.
///
/// The magnitude is the exponent when using the normalized scientific
/// notation (so numbers from 1000 to 9999 correspond to magnitude 3).
///
/// These patterns are taken from the appropriate CompactNumberSymbols
/// instance's COMPACT_DECIMAL_SHORT_PATTERN, COMPACT_DECIMAL_LONG_PATTERN,
/// or COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN members.
Map<int, String> patterns;
var compactSymbols = compactNumberSymbols[locale]!;
var styles = <_CompactStyleBase>[];
switch (formatType) {
case _CompactFormatType.COMPACT_DECIMAL_SHORT_PATTERN:
patterns = compactSymbols.COMPACT_DECIMAL_SHORT_PATTERN;
break;
// TODO(alanknight): Long formats may have different forms for different
// plural cases (e.g. million/millions).
case _CompactFormatType.COMPACT_DECIMAL_LONG_PATTERN:
patterns = compactSymbols.COMPACT_DECIMAL_LONG_PATTERN ??
compactSymbols.COMPACT_DECIMAL_SHORT_PATTERN;
break;
case _CompactFormatType.COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN:
patterns = compactSymbols.COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN;
break;
default:
throw ArgumentError.notNull('formatType');
}
patterns.forEach((int exponent, String pattern) {
if (pattern.contains(';')) {
var patterns = pattern.split(';');
styles.add(_CompactStyleWithNegative(
_CompactStyle.createStyle(patterns.first, exponent),
_CompactStyle.createStyle(patterns.last, exponent)));
} else {
styles.add(_CompactStyle.createStyle(pattern, exponent));
}
});
// Reverse the styles so that we look through them from largest to smallest.
styles = styles.reversed.toList();
// Add a fallback style that just prints the number.
styles.add(_CompactStyle());
return _CompactNumberFormat._(
name,
currencySymbol,
isForCurrency,
locale,
localeZero,
pattern,
symbols,
zeroOffset,
NumberFormatParser.parse(symbols, pattern, isForCurrency,
currencySymbol, name, decimalDigits),
styles);
}