Fix use of discarded digits in rounded numbers in string formatter.
This commit is contained in:
@@ -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++;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user