Конвертировать base-27 (или base-X) в base-10 в c #? - PullRequest
4 голосов
/ 05 марта 2012

Есть ли готовая функция, позволяющая выполнять базовые преобразования в c #? Я рассчитываю преобразовать числа из базы 26 и базы 27 в базу 10. Я могу сделать это на бумаге, но я не очень опытный программист и предпочел бы не делать это с нуля, если это возможно. Спасибо!

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

Существует готовая функция для преобразования чисел из базы 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);
}

Я думаю, что первая версия более читабельна.

0 голосов
/ 16 августа 2013

Построение вашего ответа. Вам не нужен список поиска charset, потому что вы можете просто использовать Char ASCII Values.

int ConvertFromBase26(string number)
{
     return number.Select(digit => (int)digit - 64).Aggregate(0, (x, y) => x * 26 + y);
}

Я использовал это для преобразования адресов строки столбца в int при программировании в Excel.

...