0

I am trying to increment an alphanumeric string using a given charset say the input is 0000a then the output should be 0000b

However when the input reaches the defined limit, say zzzzz it should reset to 00001

I have read the following Increment of Alphabet in c#

using

char c
c++

seem to be the best way to do this.

I have the following class

Namespace BatchNo_Generator
{
class RandomStringGenerator
{
    public enum Mode
    {
        ALPHANUMERIC = 1,
        ALPHA = 2,
        NUMERIC = 3,

    }

    public string genbase(int length, string mode)
    {
        int j = 0;
        if (mode == "ALPHANUMERIC")
        {
            StringBuilder s = new StringBuilder();
            while (j < length - 1)
            {
                s.Insert(0, "0");
                j++;
            }
            s.Insert(s.Length, "1");
            return s.ToString();
        }
        if (mode == "ALPHA")
        {

            StringBuilder s = new StringBuilder();
            while (j < length - 1)
            {
                s.Insert(0, "a");
                j++;
            }
            s.Insert(s.Length, "a");
            return s.ToString();
        }
        if (mode == "NUMERIC")
        {

            StringBuilder s = new StringBuilder();
            while (j < length - 1)
            {
                s.Insert(0, "0");
                j++;
            }
            s.Insert(s.Length, "1");
            return s.ToString();
        }
        return "";

    }

    public string gennext(string current, string mode, char endchar)
    {

        StringBuilder s = new StringBuilder(current);
        int i = current.Length;
        if (mode == "ALPHA")
        {
            for (int j = i; j > 0; j--)
            {
                if (checkend(s[j - 1], endchar, 'a', mode) == true)
                {
                    s[j] = resetchar(s[j], 'a');
                    incrementchar(s[j + 1], mode);

                }
                else
                {
                    char c = incrementchar(s[j - 1], mode);
                    s.Remove(j - 1, 1);
                    s.Insert(j - 1, c);
                    break;
                }
            }
            return s.ToString();
        }
        if (mode == "NUMERIC")
        {
            for (int j = i; j > 0; j--)
            {
                if (checkend(s[j - 1], endchar, '0', mode) == true)
                {
                    s[j-1] = resetchar(s[j-1], '0');
                    incrementchar(s[j - 1], mode);

                }
                else
                {

                    char c = incrementchar(s[j - 1], mode);
                    s.Remove(j - 1, 1);
                    s.Insert(j - 1, c);

                }
            }
            return s.ToString();
        }
        if (mode == "ALPHANUMERIC")
        {
            for (int j = i; j > 0; j--)
            {
                if (checkend(s[j - 1], endchar, '0', mode) == true)
                {
                    s[j-1] = resetchar(s[j-1], '0');
                    char c = incrementchar(s[j - 1], mode);
                }
                else
                {
                    {
                    char c = incrementchar(s[j - 1], mode);
                    s.Remove(j - 1, 1);
                    s.Insert(j - 1, c);
                    break;
                    }
                }
            }
            return s.ToString();
        }
        return "";
    }

    public char incrementchar(char c, string mode)
    {
        char cnew = c++;
        switch (mode)
        {
            case "ALPHA":
                {
                    if (char.IsLetter(c) == false) { cnew++; }
                    else { return char.ToLower(c); }
                    break;
                }
            case "NUMERIC":
                {
                    if (char.IsDigit(c) == false) { cnew++; }
                    else { return c; }
                    break;
                }
            case "ALPHANUMERIC":
                {
                    while (char.IsLetterOrDigit(c) == false) { c++; }
                   // if (char.IsLetterOrDigit(c) == false) { cnew++; }
                   // else { return char.ToLower(c); }
                    return char.ToLower(c);
                    break;
                }
        }
        return '?';
    }

    public bool checkend(char current, char end, char start, string mode)
    {
        if (current == end) { return true; }
        else { return false; }
    }

    public char resetchar(char inputchar, char defaultchar)
    {
        return defaultchar;
    }

    public static IEnumerable<string> GetColumns(char startchar, char endchar)
    {
        string s = null;
        for (char c2 = startchar; c2 <= endchar + 1; c2++)
        {
            for (char c = 'A'; c <= 'Z'; c++)
            {
                if (char.IsLetter(c) == true)
                {
                    yield return s + char.ToLower(c);
                }

            }
            if (char.IsLetterOrDigit(c2) == true)
            {
                s = c2.ToString();
            }
        }
    }

}

}

Which I tried with

RandomStringGenerator test = new RandomStringGenerator();
MessageBox.Show(test.gennext("0zzzz","ALPHANUMERIC",'0'));

The issue I have is that this input 0zzzz returns 0zzzª

Any help would be appreciated

The code is sloppy I know, i will be cleaning it up when I get a working set

Community
  • 1
  • 1
Darkestlyrics
  • 310
  • 1
  • 5
  • 16
  • Side note: sloppy code tends to produce sloppy results... Consider cleaning it up first... Maybe simple copy-paste from http://stackoverflow.com/questions/8326672/looking-for-a-way-to-have-a-base36-sequence-in-c-sharp could help. – Alexei Levenkov Oct 03 '14 at 06:13
  • Since you're sending in "0" as endChar the method doesn't understand what to do. You should send in "z" as parameter "endChar". Since now you are calling the method checkend with "0" on both startChar and endChar. – Sasse Oct 03 '14 at 06:30

1 Answers1

4
public enum Mode
{
    AlphaNumeric = 1,
    Alpha = 2,
    Numeric = 3
}

public static string Increment(string text, Mode mode)
{
    var textArr = text.ToCharArray();

    // Add legal characters
    var characters = new List<char>();

    if (mode == Mode.AlphaNumeric || mode == Mode.Numeric)
        for (char c = '0'; c <= '9'; c++)
            characters.Add(c);

    if (mode == Mode.AlphaNumeric || mode == Mode.Alpha)
        for (char c = 'a'; c <= 'z'; c++)
            characters.Add(c);

    // Loop from end to beginning
    for (int i = textArr.Length - 1; i >= 0; i--)
    {
        if (textArr[i] == characters.Last())
        {
            textArr[i] = characters.First();
        }
        else
        {
            textArr[i] = characters[characters.IndexOf(textArr[i]) + 1];
            break;
        }
    }

    return new string(textArr);
}

// Testing
var test1 = Increment("0001", Mode.AlphaNumeric);
var test2 = Increment("aab2z", Mode.AlphaNumeric);
var test3 = Increment("0009", Mode.Numeric);
var test4 = Increment("zz", Mode.Alpha);
var test5 = Increment("999", Mode.Numeric);
scohe001
  • 15,110
  • 2
  • 31
  • 51
Sasse
  • 1,108
  • 10
  • 14