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