in lib/src/intl/number_format.dart [579:661]
void _formatFixed(dynamic number) {
dynamic integerPart;
int fractionPart;
int extraIntegerDigits;
var fractionDigits = maximumFractionDigits;
var power = 0;
int digitMultiplier;
if (_isInfinite(number)) {
integerPart = number.toInt();
extraIntegerDigits = 0;
fractionPart = 0;
} else {
// We have three possible pieces. First, the basic integer part. If this
// is a percent or permille, the additional 2 or 3 digits. Finally the
// fractional part.
// We avoid multiplying the number because it might overflow if we have
// a fixed-size integer type, so we extract each of the three as an
// integer pieces.
integerPart = _floor(number);
var fraction = number - integerPart;
if (fraction.toInt() != 0) {
// If the fractional part leftover is > 1, presumbly the number
// was too big for a fixed-size integer, so leave it as whatever
// it was - the obvious thing is a double.
integerPart = number;
fraction = 0;
}
/// If we have significant digits, recalculate the number of fraction
/// digits based on that.
if (significantDigitsInUse) {
var significantDigits = this.significantDigits!;
var integerLength = numberOfIntegerDigits(integerPart);
var remainingSignificantDigits =
significantDigits - _multiplierDigits - integerLength;
fractionDigits = _fractionDigitsAfter(remainingSignificantDigits);
if (remainingSignificantDigits < 0) {
// We may have to round.
var divideBy = pow(10, integerLength - significantDigits);
integerPart = (integerPart / divideBy).round() * divideBy;
}
}
power = pow(10, fractionDigits) as int;
digitMultiplier = power * multiplier;
// Multiply out to the number of decimal places and the percent, then
// round. For fixed-size integer types this should always be zero, so
// multiplying is OK.
var remainingDigits = _round(fraction * digitMultiplier).toInt();
// However, in rounding we may overflow into the main digits.
if (remainingDigits >= digitMultiplier) {
integerPart++;
remainingDigits -= digitMultiplier;
}
// Separate out the extra integer parts from the fraction part.
extraIntegerDigits = remainingDigits ~/ power;
fractionPart = remainingDigits % power;
}
var integerDigits = _integerDigits(integerPart, extraIntegerDigits);
var digitLength = integerDigits.length;
var fractionPresent =
fractionDigits > 0 && (minimumFractionDigits > 0 || fractionPart > 0);
if (_hasIntegerDigits(integerDigits)) {
// Add the padding digits to the regular digits so that we get grouping.
var padding = '0' * (minimumIntegerDigits - digitLength);
integerDigits = '$padding$integerDigits';
digitLength = integerDigits.length;
for (var i = 0; i < digitLength; i++) {
_addDigit(integerDigits.codeUnitAt(i));
_group(digitLength, i);
}
} else if (!fractionPresent) {
// If neither fraction nor integer part exists, just print zero.
_addZero();
}
_decimalSeparator(fractionPresent);
_formatFractionPart((fractionPart + power).toString());
}