C# Integer to String Builder

As many of you know, StringBuilder.Append(int) method creates a garbage. This is bad for XNA games that do this conversion every frame. In this article, I provide one implementation to convert int to string without creating garbage. I tried to be as efficient as possible; if you find better way to do this, please let me know.

public static class StringBuilderExtension
{
    private static char[] charToInt = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

    public static void Swap(this StringBuilder sb, int startIndex, int endIndex)
    {
        // Swap the integers
        Debug.Assert(endIndex >= startIndex);
        int count = (endIndex - startIndex + 1) / 2;
        for (int i = 0; i < count; ++i)
        {
            char temp = sb[startIndex + i];
            sb[startIndex + i] = sb[endIndex - i];
            sb[endIndex - i] = temp;
        }
    }

    public static void AppendNumber(this StringBuilder sb, int number)
    {
        // Save the current length as starting index
        int startIndex = sb.Length;

        // Handle negative
        bool isNegative;
        uint unumber;
        if (number < 0)
        {
            unumber = (uint)((number == int.MinValue) ? number : -number);
            isNegative = true;
        }
        else
        {
            unumber = (uint)number;
            isNegative = false;
        }

        // Convert 
        do
        {
            sb.Append(charToInt[unumber % 10]);
            unumber /= 10;
        } while (unumber != 0);

        if (isNegative)
            sb.Append('-');

        sb.Swap(startIndex, sb.Length - 1);
    }

    public static void AppendNumber(this StringBuilder sb, uint unumber)
    {
        // Save the current length as starting index
        int startIndex = sb.Length;

        // Convert 
        do
        {
            sb.Append(charToInt[unumber % 10]);
            unumber /= 10;
        } while (unumber != 0);

        sb.Swap(startIndex, sb.Length - 1);
    }
}

Comments

Popular posts from this blog

GDC 2015 Links

D3D11 Compute Shader - Part 1

Mapping Square Texture to Trapezoid / Quadrilateral