public static String ToString()

in csharp/EPAM.Deltix.DFP/DotNetImpl.cs [1213:1360]


		public static String ToString(UInt64 value, char decimalMark, bool floatStyle)
		{
			if (!IsFinite(value))
			{
				// Value is either Inf or NaN
				// TODO: Do we need SNaN?
				return 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 !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] = '-';

					return new string(buffer, bi, bufferLength - bi);

				}
				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';
							}
						}

						return new string(buffer, bi, be - bi);

					}
					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;

						return new string(buffer, bi, be - bi);
					}
				}
			}
		}