Search code examples
c#base36

Increment string letters and numbers only c#


A similar question was asked here : Increment a string with both letters and numbers except it increments only the numbers in the string, I want to increment both numbers and letters and only to letters and numbers, and not to anything else like ;+-*:= characters.

Examples:

Z006GZYBA1 => Z006GZYBA2
        A9 => AA 
        AZ => B0 
1ZZZZZZZZZ => 2000000000

EDIT: What I've tried:

 public static string IncrementString(this string input)
    {
        string rtn = "A";
        if (!string.IsNullOrWhiteSpace(input))
        {
            bool prependNew = false;
            var sb = new StringBuilder(input.ToUpper());
            for (int i = (sb.Length - 1); i >= 0; i--)
            {
                if (i == sb.Length - 1)
                {
                    var nextChar = Convert.ToUInt16(sb[i]) + 1;
                    if (nextChar > 90)
                    {
                        sb[i] = 'A';
                        if ((i - 1) >= 0)
                        {
                            sb[i - 1] = (char)(Convert.ToUInt16(sb[i - 1]) + 1);
                        }
                        else
                        {
                            prependNew = true;
                        }
                    }
                    else
                    {
                        sb[i] = (char)(nextChar);
                        break;
                    }
                }
                else
                {
                    if (Convert.ToUInt16(sb[i]) > 90)
                    {
                        sb[i] = 'A';
                        if ((i - 1) >= 0)
                        {
                            sb[i - 1] = (char)(Convert.ToUInt16(sb[i - 1]) + 1);
                        }
                        else
                        {
                            prependNew = true;
                        }
                    }
                    else
                    {
                        break;
                    }

                }
            }
            rtn = sb.ToString();
            if (prependNew)
            {
                rtn = "A" + rtn;
            }
        }

        return rtn.ToUpper();
    }

Solution

  • This should work (method is IncrementBase36() but I put it in a console app for demo purposes):

    using System;
    
    namespace Demo
    {
        class Program
        {
            static void Main()
            {
                Console.WriteLine(IncrementBase36("Z006GZYBA1"));
                Console.WriteLine(IncrementBase36("A9"));
                Console.WriteLine(IncrementBase36("AZ"));
                Console.WriteLine(IncrementBase36("1ZZZZZZZZZ"));
            }
    
            public static string IncrementBase36(string numberBase36)
            {
                var digits = numberBase36.ToCharArray();
                bool carry = true;
    
                for (int i = digits.Length - 1; i >= 0; --i)
                {
                    if (carry)
                    {
                        if (digits[i] == 'Z')
                        {
                            digits[i] = '0';
                        }
                        else
                        {
                            if (digits[i] == '9')
                                digits[i] = 'A';
                            else
                                ++digits[i];
    
                            carry = false;
                        }
                    }
                }
    
                if (carry)
                    return '1' + new string(digits);
                else
                    return new string(digits);
            }
        }
    }