c#中字母数字值的自动递增

时间:2016-10-17 21:56:24

标签: c# alphanumeric base36

有人可以帮助解决以下情况的逻辑吗?

**Input -> Output**
00000 --> 00001
00009 --> 0000A
0000Z --> 00010
..
..
0002Z --> 00030
00039 --> 0003A

有什么建议吗?

EDIT 谢谢大家的建议。 :)这是我尝试过的,它有效,但不确定是否可以在某些条件下中断? :/

    public static void Main(string[] args)
    {
        string number = "0001Z";            
        var result = Increment(number);

    }

    private static String Increment(String number)
    {
        String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";            
        char lastChar = number[number.Length - 1];
        string fragment = number.Substring(0, number.Length - 1);

        if (chars.IndexOf(lastChar) < 35)
        {
            lastChar = chars[chars.IndexOf(lastChar) + 1];
           string nextNumber = fragment + lastChar;
            return nextNumber;
        }
        return Increment(fragment) + '0';            
    }

PS:Increment an index that uses numbers and characters (aka Base36 numbers) - 这是我从中获得的,所以可能是重复的问题..抱歉。

1 个答案:

答案 0 :(得分:0)

我有几种方法可以将整数转换为不同的基数。我相信他们可能会得到改善。但他们可能会让你开始。因此,将您的基数36“数字”转换为int,递增1,然后转换回基数36.此方法使用递归,这可能不是必需的。我有兴趣知道是否有更有效的方法。

除0-9和A-Z

外,这些方法不假设其他字符
void Main()
{
    string input = "0000Z";
    int value = baseToInt(input, 36);
    value++;
    string output = intToBase(value, 36).PadLeft(5, '0');

    Console.WriteLine("Input: {0}", input);
    Console.WriteLine("Output: {0}", output);
}

public string intToBase(int input, int @base)
{
    var digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    if (@base < 2 || @base > 36)
    {
        throw new ArgumentOutOfRangeException("base", "Must specify a base between 2 and 36, inclusive");
    }

    if (input < @base && input >= 0)
    {
        return digits[input].ToString();
    }
    else
    {
        return intToBase(input / @base, @base) + digits[input % @base].ToString();
    }
}

public int baseToInt(string input, int @base)
{
    var digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    if (@base < 2 || @base > 36)
    {
        throw new ArgumentOutOfRangeException("base", "Must specify a base between 2 and 36, inclusive");
    }

    var digitsInBase = digits.Substring(0, @base);

    if (input.Any(c => !digitsInBase.Contains(c)))
    {
        throw new ArgumentOutOfRangeException("input", string.Format("Input is not a valid base {0} number", @base));
    }

    return (int)input.Select((c, i) => Math.Pow(@base, input.Length - (i + 1)) * digitsInBase.IndexOf(c)).Sum();

}

输出:

  

输入:0000Z
  输出:00010