in lib/src/intl/number_format_parser.dart [228:288]
String _parseTrunk() {
var loop = true;
var trunk = StringBuffer();
while (pattern.current != null && loop) {
loop = parseTrunkCharacter(trunk);
}
if (zeroDigitCount == 0 && digitLeftCount > 0 && decimalPos >= 0) {
// Handle '###.###' and '###.' and '.###'
// Handle '.###'
var n = decimalPos == 0 ? 1 : decimalPos;
digitRightCount = digitLeftCount - n;
digitLeftCount = n - 1;
zeroDigitCount = 1;
}
// Do syntax checking on the digits.
if (decimalPos < 0 && digitRightCount > 0 ||
decimalPos >= 0 &&
(decimalPos < digitLeftCount ||
decimalPos > digitLeftCount + zeroDigitCount) ||
groupingCount == 0) {
throw FormatException('Malformed pattern "${pattern.input}"');
}
var totalDigits = digitLeftCount + zeroDigitCount + digitRightCount;
result.maximumFractionDigits =
decimalPos >= 0 ? totalDigits - decimalPos : 0;
if (decimalPos >= 0) {
result.minimumFractionDigits =
digitLeftCount + zeroDigitCount - decimalPos;
if (result.minimumFractionDigits < 0) {
result.minimumFractionDigits = 0;
}
}
// The effectiveDecimalPos is the position the decimal is at or would be at
// if there is no decimal. Note that if decimalPos<0, then digitTotalCount
// == digitLeftCount + zeroDigitCount.
var effectiveDecimalPos = decimalPos >= 0 ? decimalPos : totalDigits;
result.minimumIntegerDigits = effectiveDecimalPos - digitLeftCount;
if (result.useExponentialNotation) {
result.maximumIntegerDigits =
digitLeftCount + result.minimumIntegerDigits;
// In exponential display, we need to at least show something.
if (result.maximumFractionDigits == 0 &&
result.minimumIntegerDigits == 0) {
result.minimumIntegerDigits = 1;
}
}
result.finalGroupingSize = max(0, groupingCount);
if (!groupingSizeSetExplicitly) {
result.groupingSize = result.finalGroupingSize;
}
result.decimalSeparatorAlwaysShown =
decimalPos == 0 || decimalPos == totalDigits;
return trunk.toString();
}