Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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;
        }
Esempio n. 4
0
        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;
        }
Esempio n. 5
0
        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;
        }
Esempio n. 6
0
        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;
        }