From 5e76ddf2cd6a0793cad6e36705c91086ebee0f35 Mon Sep 17 00:00:00 2001 From: PopSlime Date: Mon, 6 Feb 2023 15:14:54 +0800 Subject: [PATCH] Fix use of discarded digits in rounded numbers in string formatter. --- .../Plugins/StringFormatter/CustomNumeric.cs | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/Assets/Plugins/StringFormatter/CustomNumeric.cs b/Assets/Plugins/StringFormatter/CustomNumeric.cs index 9eac272..b5275bf 100644 --- a/Assets/Plugins/StringFormatter/CustomNumeric.cs +++ b/Assets/Plugins/StringFormatter/CustomNumeric.cs @@ -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++; }