C# 函数根据输入编号生成字母数字序列号

C# 函数根据输入编号生成字母数字序列号,c#,C#,我正在尝试用C#开发一个例程,它将接受给定的输入整数,并根据预定义的可能字符集返回一个6个字符的字母数字字符串 可使用的字符有: “0123456789ABCDEFGHJKLMNPNPQRSTUVWXYZ”(请注意,字母“I”和“O”不在集合中。) 因此,如果输入为1,则输出应为“000001”,输入9将输出“000009”,输入10将输出“00000A”,输入12345将输出“000AP3”,依此类推 我很难想出一个解决这个问题的好办法。我知道我必须以艰难的方式来解决这个问题,所以我正在寻求帮

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

可使用的字符有:

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

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

我很难想出一个解决这个问题的好办法。我知道我必须以艰难的方式来解决这个问题,所以我正在寻求帮助


谢谢

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

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();
    }
}
您执行零填充

int value=12345;
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');
字符串字母表=“0123456789ABCDEFGHJKLMNPQRSTUVWXYZ”; var stack=新堆栈(); 而(值>0) { stack.Push(字母表[值%alphabet.Length]); 值/=字母表长度; } 字符串输出=新字符串(stack.ToArray()).PadLeft(6,'0');
修改LukeH答案,以生成字母数字转换成字母数字,反之亦然

    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++));
    }
int值=12345;
字符串字母表=“0123456789abcdefghijklmnopqrstuvxyz”;
var stack=新堆栈();
而(值>0)
{
int index=字母表长度百分比的值;
stack.Push(字母表[索引]);
值/=字母表长度;
}
字符串输出=新字符串(stack.ToArray()).PadLeft(6,'0');
双整数=0;
int charPos=0;
对于(var i=output.Length-1;i>=0;i--)
{
int val=输出[i];

如果(val>=48&&val=65&&val我看得出你想要领先0,但你是如何从12345获得AP3的?这就是需要拿出一些解决方案的原因。看看。哇——这是一个优雅的解决方案。非常感谢LukeH!在字母表的字符串中,I和O缺失了:P@X-编码员:是的,它们被故意省略了,和qu中一样埃斯蒂恩。