public static StringBuilder AppendTo()

in csharp/EPAM.Deltix.DFP/DotNetImpl.cs [1424:1590]


		public static StringBuilder AppendTo(UInt64 value, char decimalMark, bool floatStyle, StringBuilder stringBuilder)
		{
			if (!IsFinite(value))
			{
				// Value is either Inf or NaN
				// TODO: Do we need SNaN?
				return stringBuilder.Append(IsNaN(value) ? "NaN" : SignBit(value) ? "-Infinity" : "Infinity");
			}

			Int32 partsExponent;
			BID_UINT64 partsCoefficient;
			if ((~value & SpecialEncodingMask) == 0) //if ((x & SpecialEncodingMask) == SpecialEncodingMask)
			{
				partsCoefficient = UnpackSpecial(value, out partsExponent);
			}
			else
			{
				// Extract the exponent.
				partsExponent = (int)(value >> ExponentShiftSmall) & (int)ShiftedExponentMask;
				// Extract the coefficient.
				partsCoefficient = value & SmallCoefficientMask;
			}

			if (partsCoefficient == 0)
			{
				return stringBuilder.Append(!floatStyle ? "0" : ("0" + decimalMark + "0"));
			}

			int exponent = partsExponent - ExponentBias;

			unsafe
			{
				var bufferLength = 512;
				var buffer = stackalloc char[bufferLength];

				if (exponent >= 0)
				{
					int bi = bufferLength;
					if (floatStyle)
					{
						buffer[--bi] = '0';
						buffer[--bi] = decimalMark;
					}
					for (int i = 0; i < exponent; ++i)
						buffer[--bi] = '0';

					while (partsCoefficient > 0)
					{
						bi = FormatUIntFromBcdTable((int)(partsCoefficient % BcdDivider), buffer, bi);
						partsCoefficient /= BcdDivider;
					}

					while (buffer[bi] == '0')
						++bi;

					if (SignBit(value))
						buffer[--bi] = '-';

#if NET40
					char[] heapBuffer = new char[bufferLength - bi];
					Marshal.Copy((IntPtr)(buffer + bi), heapBuffer, 0, heapBuffer.Length);
					return stringBuilder.Append(heapBuffer);
#else
					return stringBuilder.Append(buffer + bi, bufferLength - bi);
#endif

				}
				else
				{ // exponent < 0
					int bi = bufferLength;

					int digits = NumberOfDigits(partsCoefficient);

					if (digits + exponent > 0)
					{
						ulong integralPart = partsCoefficient / PowersOfTen[-exponent];
						ulong fractionalPart = partsCoefficient % PowersOfTen[-exponent];

						while (fractionalPart > 0)
						{
							bi = FormatUIntFromBcdTable((int)(fractionalPart % BcdDivider), buffer, bi);
							fractionalPart /= BcdDivider;
						}

						int written = bufferLength - bi /* already written */;
						//if (written < -exponent /* must be written */)
						for (int ei = 0, ee = -exponent - written; ei < ee; ++ei)
							buffer[--bi] = '0';

						bi = bufferLength + exponent; /* buffer.length - (-exponent) */

						buffer[--bi] = decimalMark;

						while (integralPart > 0)
						{
							bi = FormatUIntFromBcdTable((int)(integralPart % BcdDivider), buffer, bi);
							integralPart /= BcdDivider;
						}

						while (buffer[bi] == '0')
							++bi;

						if (SignBit(value))
							buffer[--bi] = '-';

						int be = bufferLength;
						while (buffer[be - 1] == '0')
							--be;

						if (buffer[be - 1] == decimalMark)
						{
							if (!floatStyle)
							{
								--be;
							}
							else if (be < bufferLength)
							{
								buffer[be++] = '0';
							}
						}

#if NET40
						char[] heapBuffer = new char[be - bi];
						Marshal.Copy((IntPtr)(buffer + bi), heapBuffer, 0, heapBuffer.Length);
						return stringBuilder.Append(heapBuffer);
#else
						return stringBuilder.Append(buffer + bi, be - bi);
#endif

					}
					else
					{
						while (partsCoefficient > 0)
						{
							bi = FormatUIntFromBcdTable((int)(partsCoefficient % BcdDivider), buffer, bi);
							partsCoefficient /= BcdDivider;
						}

						int written = bufferLength - bi /* already written */;
						//if (written < -exponent /* must be written */)
						for (int ei = 0, ee = -exponent - written; ei < ee; ++ei)
							buffer[--bi] = '0';

						bi = bufferLength + exponent; /* buffer.length - (-exponent) */

						buffer[--bi] = decimalMark;
						buffer[--bi] = '0';

						if (SignBit(value))
							buffer[--bi] = '-';

						int be = bufferLength;
						while (buffer[be - 1] == '0')
							--be;

#if NET40
						char[] heapBuffer = new char[be - bi];
						Marshal.Copy((IntPtr)(buffer + bi), heapBuffer, 0, heapBuffer.Length);
						return stringBuilder.Append(heapBuffer);
#else
						return stringBuilder.Append(buffer + bi, be - bi);
#endif
					}
				}
			}
#pragma warning restore CS0162
		}