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
}