Fix use of discarded digits in rounded numbers in string formatter.

This commit is contained in:
2023-02-06 15:14:54 +08:00
parent dca1ba304e
commit 5e76ddf2cd

View File

@@ -211,7 +211,7 @@ namespace System.Text.Formatting {
remainingDigitsInGroup -= groupSize;
groupIndex++;
}
bool appendingDigitFlag = false;
bool appendingDigitFlag = false, outOfPrecisionFlag = false;
decimalFlag = false;
for (index = start; index < end; index++) {
switch (ptr[index]) {
@@ -229,13 +229,20 @@ namespace System.Text.Formatting {
case '#':
if (!appendingDigitFlag) {
if (number.Scale > integralDigits) while (currentDigitIndex < number.Scale - integralDigits)
formatter.AppendIntegralDigit(ref number, ref currentDigitIndex, culture, groupFlag, ref groupIndex, ref remainingDigitsInGroup);
formatter.AppendIntegralDigit(ref number, ref currentDigitIndex, culture, groupFlag, ref outOfPrecisionFlag, ref groupIndex, ref remainingDigitsInGroup);
appendingDigitFlag = true;
}
if (decimalFlag) {
if (currentDigitIndex < number.Precision) {
char digit = number.Digits[currentDigitIndex++];
if (digit == '\0') digit = '0';
char digit = '0';
if (!outOfPrecisionFlag) {
if (currentDigitIndex >= number.Precision) outOfPrecisionFlag = true;
else {
digit = number.Digits[currentDigitIndex++];
if (digit == '\0') {
outOfPrecisionFlag = true;
digit = '0';
}
}
formatter.Append(digit);
}
else if (decimalZeros > 0)
@@ -245,7 +252,7 @@ namespace System.Text.Formatting {
}
else {
if (integralDigits <= number.Scale)
formatter.AppendIntegralDigit(ref number, ref currentDigitIndex, culture, groupFlag, ref groupIndex, ref remainingDigitsInGroup);
formatter.AppendIntegralDigit(ref number, ref currentDigitIndex, culture, groupFlag, ref outOfPrecisionFlag, ref groupIndex, ref remainingDigitsInGroup);
else if (integralDigits <= integralZeros)
formatter.AppendIntegralDigit('0', culture, groupFlag, ref groupIndex, ref remainingDigitsInGroup);
--integralDigits;
@@ -295,11 +302,18 @@ namespace System.Text.Formatting {
}
}
}
static void AppendIntegralDigit(this StringBuffer self, ref Number number, ref int index, CachedCulture culture, bool groupFlag, ref int groupIndex, ref int remainingDigitsInGroup) {
char digit;
if (index >= number.Precision) digit = '0';
else digit = number.Digits[index];
if (digit == '\0') digit = '0';
static void AppendIntegralDigit(this StringBuffer self, ref Number number, ref int index, CachedCulture culture, bool groupFlag, ref bool outOfPrecisionFlag, ref int groupIndex, ref int remainingDigitsInGroup) {
char digit = '0';
if (!outOfPrecisionFlag) {
if (index >= number.Precision) outOfPrecisionFlag = true;
else {
digit = number.Digits[index];
if (digit == '\0') {
outOfPrecisionFlag = true;
digit = '0';
}
}
}
self.AppendIntegralDigit(digit, culture, groupFlag, ref groupIndex, ref remainingDigitsInGroup);
index++;
}