有没有现成的函数可以在C#中进行进制转换?我想要将基于26和基于27的数字转换为十进制。我能够手写实现,但是作为一个经验不足的程序员,如果可能的话,我宁愿不从零开始。谢谢!
有一个现成的函数可以将数字从2进制、8进制或16进制转换为10进制(Convert.ToInt32
)。如果您想将数字从26进制或27进制转换为10进制,则需要自行处理。
现在,我从未听说过26进制的数字,因此我假设“数字”是A到Z(A的值为0,Z的十进制值为25)。要将26进制转换为10进制,应该执行以下操作:
string charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int GetDigitValue(char digit)
{
return charset.IndexOf(digit);
}
int ConvertFromBase26(string number)
{
int result = 0;
foreach(char digit in number)
result = result * charset.Length + GetDigitValue(digit);
return result;
}
要将数字转换为27进制,只需添加表示数字26的任何字符。
注意:没有错误纠正(您可以转换字符串"$ # $ @ # $ @",这会使您得到一个不错的负数),如果您计划经常执行这些转换,则GetDigitValue相当低效,应该将其替换为查找表。
编辑:为了好玩,还有一个LINQ版本。
同样,没有有效的查找和错误纠正,假设字符串仅由合法数字组成。
string charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int ConvertFromBase(string charset, string number)
{
return number.Select(c=>charset.IndexOf(c)).Aggregate(0, (x, y) => x*charset.Length +y);
}
我认为第一版更易读。
Convert.ToInt32
将数字转换为二进制。而 Int32.ToString
则将它们转换为十进制。 - dan04int ConvertFromBase26(string number)
{
return number.Select(digit => (int)digit - 64).Aggregate(0, (x, y) => x * 26 + y);
}
我在使用Excel编程时,使用这个工具将列字符串地址转换为整数。
public int ToBase10(this string str)
{
str = str.ToUpper();
int number = 0;
for (int index = 0; index < str.Length; index++)
number += (str[index] - 'A' + 1) * (int)Math.Pow(26, str.Length - 1 - index);
return number;
}
要调用此函数,只需像这样调用
string PlateNumber = "TRX";
int number = PlateNumber.ToBase10();
/
或%
,而是通过27进行/
或%
等),但思路是一样的。 - user166390A-Z
,而基数为64的数字是0-9A-Z...
)。 - user166390