static char *FormatPercent(char *buffer, ref Number number, int maxDigits, NumberFormatData data, string format, string percentSymbol) { for (int i = 0; i < format.Length; i++) { char c = format[i]; switch (c) { case '#': buffer = FormatFixed(buffer, ref number, maxDigits, data); break; case '-': AppendString(&buffer, data.NegativeSign); break; case '%': AppendString(&buffer, percentSymbol); break; default: *buffer++ = c; break; } } return(buffer); }
static char *FormatFixed(char *buffer, ref Number number, int maxDigits, NumberFormatData data) { var groups = data.GroupSizes; var digits = number.Digits; var digitPos = number.Scale; if (digitPos <= 0) { *buffer++ = '0'; } else if (groups != null) { var groupIndex = 0; var groupSizeCount = groups[0]; var groupSizeLen = groups.Length; var newBufferSize = digitPos; var groupSeparatorLen = data.GroupSeparator.Length; var groupSize = 0; // figure out the size of the result if (groupSizeLen != 0) { while (digitPos > groupSizeCount) { groupSize = groups[groupIndex]; if (groupSize == 0) { break; } newBufferSize += groupSeparatorLen; if (groupIndex < groupSizeLen - 1) { groupIndex++; } groupSizeCount += groups[groupIndex]; if (groupSizeCount < 0 || newBufferSize < 0) { throw new ArgumentOutOfRangeException(SR.InvalidGroupSizes); } } if (groupSizeCount == 0) { groupSize = 0; } else { groupSize = groups[0]; } } groupIndex = 0; var digitCount = 0; var digitLength = StrLen(digits); var digitStart = digitPos < digitLength ? digitPos : digitLength; var ptr = buffer + newBufferSize - 1; for (int i = digitPos - 1; i >= 0; i--) { *(ptr--) = i < digitStart ? digits[i] : '0'; // check if we need to add a group separator if (groupSize > 0) { digitCount++; if (digitCount == groupSize && i != 0) { for (int j = groupSeparatorLen - 1; j >= 0; j--) { *(ptr--) = data.GroupSeparator[j]; } if (groupIndex < groupSizeLen - 1) { groupIndex++; groupSize = groups[groupIndex]; } digitCount = 0; } } } buffer += newBufferSize; digits += digitStart; } else { do { *buffer++ = *digits != 0 ? *digits++ : '0'; }while (--digitPos > 0); } if (maxDigits > 0) { AppendString(&buffer, data.DecimalSeparator); while (digitPos < 0 && maxDigits > 0) { *buffer++ = '0'; digitPos++; maxDigits--; } while (maxDigits > 0) { *buffer++ = *digits != 0 ? *digits++ : '0'; maxDigits--; } } return(buffer); }
public CachedCulture(CultureInfo culture) { Culture = culture; var info = culture.NumberFormat; CurrencyData = new NumberFormatData( info.CurrencyDecimalDigits, info.NegativeSign, info.CurrencyDecimalSeparator, info.CurrencyGroupSeparator, info.CurrencyGroupSizes, info.CurrencySymbol.Length ); FixedData = new NumberFormatData( info.NumberDecimalDigits, info.NegativeSign, info.NumberDecimalSeparator, null, null, 0 ); NumberData = new NumberFormatData( info.NumberDecimalDigits, info.NegativeSign, info.NumberDecimalSeparator, info.NumberGroupSeparator, info.NumberGroupSizes, 0 ); ScientificData = new NumberFormatData( 6, info.NegativeSign, info.NumberDecimalSeparator, null, null, info.NegativeSign.Length + info.PositiveSign.Length * 2 // for number and exponent ); PercentData = new NumberFormatData( info.PercentDecimalDigits, info.NegativeSign, info.PercentDecimalSeparator, info.PercentGroupSeparator, info.PercentGroupSizes, info.PercentSymbol.Length ); CurrencyNegativePattern = NegativeCurrencyFormats[info.CurrencyNegativePattern]; CurrencyPositivePattern = PositiveCurrencyFormats[info.CurrencyPositivePattern]; CurrencySymbol = info.CurrencySymbol; NumberNegativePattern = NegativeNumberFormats[info.NumberNegativePattern]; NumberPositivePattern = PositiveNumberFormat; PercentNegativePattern = NegativePercentFormats[info.PercentNegativePattern]; PercentPositivePattern = PositivePercentFormats[info.PercentPositivePattern]; PercentSymbol = info.PercentSymbol; NegativeSign = info.NegativeSign; PositiveSign = info.PositiveSign; NaN = info.NaNSymbol; PositiveInfinity = info.PositiveInfinitySymbol; NegativeInfinity = info.NegativeInfinitySymbol; DecimalBufferSize = NumberFormatData.MinBufferSize + info.NumberDecimalSeparator.Length + (NegativeSign.Length + PositiveSign.Length) * 2; }
public CachedCulture(CultureInfo culture) { Culture = culture; var info = culture.NumberFormat; CurrencyData = new NumberFormatData( info.CurrencyDecimalDigits, info.NegativeSign, info.CurrencyDecimalSeparator, info.CurrencyGroupSeparator, info.CurrencyGroupSizes, info.CurrencySymbol.Length ); FixedData = new NumberFormatData( info.NumberDecimalDigits, info.NegativeSign, info.NumberDecimalSeparator, null, null, 0 ); NumberData = new NumberFormatData( info.NumberDecimalDigits, info.NegativeSign, info.NumberDecimalSeparator, info.NumberGroupSeparator, info.NumberGroupSizes, 0 ); ScientificData = new NumberFormatData( 6, info.NegativeSign, info.NumberDecimalSeparator, null, null, info.NegativeSign.Length + info.PositiveSign.Length * 2 // for number and exponent ); PercentData = new NumberFormatData( info.PercentDecimalDigits, info.NegativeSign, info.PercentDecimalSeparator, info.PercentGroupSeparator, info.PercentGroupSizes, info.PercentSymbol.Length ); CurrencyNegativePattern = NegativeCurrencyFormats[info.CurrencyNegativePattern]; CurrencyPositivePattern = PositiveCurrencyFormats[info.CurrencyPositivePattern]; CurrencySymbol = info.CurrencySymbol; NumberNegativePattern = NegativeNumberFormats[info.NumberNegativePattern]; NumberPositivePattern = PositiveNumberFormat; PercentNegativePattern = NegativePercentFormats[info.PercentNegativePattern]; PercentPositivePattern = PositivePercentFormats[info.PercentPositivePattern]; PercentSymbol = info.PercentSymbol; NegativeSign = info.NegativeSign; PositiveSign = info.PositiveSign; NaN = info.NaNSymbol; PositiveInfinity = info.PositiveInfinitySymbol; NegativeInfinity = info.NegativeInfinitySymbol; DecimalBufferSize = NumberFormatData.MinBufferSize + info.NumberDecimalSeparator.Length + (NegativeSign.Length + PositiveSign.Length) * 2; }
static char* FormatPercent(char* buffer, ref Number number, int maxDigits, NumberFormatData data, string format, string percentSymbol) { for (int i = 0; i < format.Length; i++) { char c = format[i]; switch (c) { case '#': buffer = FormatFixed(buffer, ref number, maxDigits, data); break; case '-': AppendString(&buffer, data.NegativeSign); break; case '%': AppendString(&buffer, percentSymbol); break; default: *buffer++ = c; break; } } return buffer; }
static char* FormatFixed(char* buffer, ref Number number, int maxDigits, NumberFormatData data) { var groups = data.GroupSizes; var digits = number.Digits; var digitPos = number.Scale; if (digitPos <= 0) *buffer++ = '0'; else if (groups != null) { var groupIndex = 0; var groupSizeCount = groups[0]; var groupSizeLen = groups.Length; var newBufferSize = digitPos; var groupSeparatorLen = data.GroupSeparator.Length; var groupSize = 0; // figure out the size of the result if (groupSizeLen != 0) { while (digitPos > groupSizeCount) { groupSize = groups[groupIndex]; if (groupSize == 0) break; newBufferSize += groupSeparatorLen; if (groupIndex < groupSizeLen - 1) groupIndex++; groupSizeCount += groups[groupIndex]; if (groupSizeCount < 0 || newBufferSize < 0) throw new ArgumentOutOfRangeException(SR.InvalidGroupSizes); } if (groupSizeCount == 0) groupSize = 0; else groupSize = groups[0]; } groupIndex = 0; var digitCount = 0; var digitLength = StrLen(digits); var digitStart = digitPos < digitLength ? digitPos : digitLength; var ptr = buffer + newBufferSize - 1; for (int i = digitPos - 1; i >= 0; i--) { *(ptr--) = i < digitStart ? digits[i] : '0'; // check if we need to add a group separator if (groupSize > 0) { digitCount++; if (digitCount == groupSize && i != 0) { for (int j = groupSeparatorLen - 1; j >= 0; j--) *(ptr--) = data.GroupSeparator[j]; if (groupIndex < groupSizeLen - 1) { groupIndex++; groupSize = groups[groupIndex]; } digitCount = 0; } } } buffer += newBufferSize; digits += digitStart; } else { do { *buffer++ = *digits != 0 ? *digits++ : '0'; } while (--digitPos > 0); } if (maxDigits > 0) { AppendString(&buffer, data.DecimalSeparator); while (digitPos < 0 && maxDigits > 0) { *buffer++ = '0'; digitPos++; maxDigits--; } while (maxDigits > 0) { *buffer++ = *digits != 0 ? *digits++ : '0'; maxDigits--; } } return buffer; }