用于根据输入编号生成字母数字序列号的功能

时间:2010-09-23 15:38:20

标签: c#

我正在尝试在C#中开发一个例程,该例程将获取给定的输入整数并根据预定义的可能字符集返回6个字符的字母数字字符串。

可能使用的字符是:

“0123456789ABCDEFGHJKLMNPQRSTUVWXYZ”(请注意字母“I”和“O”不在集合中。)

因此,如果输入为1,则输出应为“000001”,输入9将输出“000009”,输入10将输出“00000A”,输入12345将输出“000AP3”,依此类推。 / p>

我很难找到解决这个问题的优雅方案。我知道我必须努力接近这一点,所以我正在寻求帮助。

谢谢!

4 个答案:

答案 0 :(得分:7)

int value = 12345;

string alphabet = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ";

var stack = new Stack<char>();
while (value > 0)
{
     stack.Push(alphabet[value % alphabet.Length]);
     value /= alphabet.Length;
}
string output = new string(stack.ToArray()).PadLeft(6, '0');

答案 1 :(得分:1)

直接解决方案只是迭代地将输入值除以 N (字符集的大小),并每次取余数来索引字符集,并构建输出字符串逐个字符。

答案 2 :(得分:0)

internal class Program {
    private static void Main(string[] args) {
        int value = 38;

        const string alphabet = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
        string result = ToBase(value, alphabet);
        Console.WriteLine(result);
    }

    private static string ToBase(int value, string alphabet) {
        if (value == 0) return alphabet[0].ToString();
        var result = new StringBuilder();
        while (value > 0) {
            int digit = value % alphabet.Length;
            value = (value - digit) / alphabet.Length;
            result.Insert(0, alphabet[digit]);
        }
        return result.ToString();
    }
}

你做零填充

答案 3 :(得分:0)

LukeH修改了将 Alphanemuric生成为数字而反之亦然

    int value = 12345;

    string alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    var stack = new Stack<char>();
    while (value > 0)
    {
        int index = value % alphabet.Length;
        stack.Push(alphabet[index]);
        value /= alphabet.Length;
    }

    string output = new string(stack.ToArray()).PadLeft(6, '0');
    double intNumber = 0;
    int charPos = 0;
    for (var i = output.Length-1; i >=0;i--)
    {
        int val = output[i];
        if (val >= 48 && val <= 57)
            intNumber += (val - 48) * (Math.Pow(36, charPos++));
        else if (val >= 65 && val <= 90)
            intNumber += (val - 55) * (Math.Pow(36, charPos++));
    }