gifts2017

Переводим число из любой системы счисления в десятичную

Опубликовал lazy (lazy) в раздел Программирование - Практика программирования

Простой алгоритм перевода числа из любой системы счисления в десятичную.

Однажды потребовалось из шестнадцатеричной строки вида "0000FF6A9B4" получить число в десятичной системе счисления. Поиск привел к http://infostart.ru/public/70053/ но в этой статье мы видим обратный перевод из десятичной в другую систему. Пришлось писать собственными лапами. В прилагающейся обработке для управляемых форм 8.2. лежит пример перевода. Если изменить шаблон с "0123456789ABCDEF" на "0123456789" - перевод будет происходить из десятичной <(^.^)> на  "01234567" - из восьмеричной системы счисления, "01" - двоичной.

Для тех, кому лень качать обработку вот основной код:

&НаКлиенте
Функция ИзХСчислВЧисло(аф,Шаблон) // Шаблон = "0123456789ABCDEF"
    аф = ВРег(аф); // на всякий случай.
   
ДлинаШаблона = СтрДлина(Шаблон);

   
ДлинаСтроки = СтрДлина(аф);
   
ТекСимвол = ДлинаСтроки;
   
Результат = 0;

    Пока
ТекСимвол > 0 Цикл
       
ОбработкаПрерыванияПользователя();
       
ОбрабатываемыйСимвол = Сред(аф, ТекСимвол,1);
       
ПозицияВШаблоне = Найти(Шаблон,ОбрабатываемыйСимвол)-1;
       
Результат = Результат + (ПозицияВШаблоне * pow(ДлинаШаблона,ДлинаСтроки-ТекСимвол));
       
ТекСимвол = ТекСимвол - 1;
    КонецЦикла;

    Возврат(
Результат);
КонецФункции

UPD: Пользователь VUN предложил более компактный метод решения той же проблемы, без использования функции возведения в степень:

&НаКлиенте
Функция ИзХСчислВЧисло(аф,Шаблон)
   
аф = ВРег(аф); // на всякий случай.
   
ДлинаШаблона = СтрДлина(Шаблон);

   
ДлинаСтроки = СтрДлина(аф);
   
Результат = 0;

    Для
ТекСимвол = 1 По ДлинаСтроки Цикл
       
ОбрабатываемыйСимвол = Сред(аф, ТекСимвол,1);
       
ПозицияВШаблоне = Найти(Шаблон,ОбрабатываемыйСимвол)-1;
       
Результат = Результат * ДлинаШаблона + ПозицияВШаблоне;
    КонецЦикла;

    Возврат(
Результат);

КонецФункции

Скачать файлы

Наименование Файл Версия Размер
СтрокуВЧисло.epf 12
.epf 6,20Kb
20.10.11
12
.epf 6,20Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
0. lazy (lazy) 20.10.11 22:46
Простой алгоритм перевода числа из любой системы счисления в десятичную.

Перейти к публикации

1. Вьюн (VUN) 20.10.11 22:46
Можно записать это проще, без возведения в степень:
Для ТекСимвол = 1 По ДлинаСтроки Цикл
        ОбрабатываемыйСимвол = Сред(аф, ТекСимвол,1);
        ПозицияВШаблоне = Найти(Шаблон,ОбрабатываемыйСимвол)-1;
        Результат = Результат * ДлинаШаблона + ПозицияВШаблоне;
КонецЦикла;
...Показать Скрыть
2. lazy (lazy) 21.10.11 08:19
(1) Благодарю за отклик и предоставленный альтернативный алгоритм. Признаться вообще удивлен, что эта запись кого то заинтересовала. За все время, что я вожусь с 1Ской это первый случай, когда потребовалось что то делать с шестнадцатеричными числами т.е. нужно отметить, что задача в определенном смысле специфична. Основной пост сейчас поправлю, добавив Ваш вариант.
3. igor sarafanov (ms200999) 08.12.11 14:58
Ну, мне недавно внезапно потребовалось переводить Hex в Bin. Случается.
4. Mike Gor (mgor) 14.12.11 21:56
На самом деле очень полезная вещь, которой не хватало в 1С.

Особенно при стыковке с разными Web,Java и прочими Андроидами,
где тот же цвет задается то через Int, то через строки типа "#FF00AA98".
Спасибо автору.
5. Александр Полтава (Патриот) 25.04.14 09:53
Чуть было не написал сам, но решил глянуть на Инфостарте и не зря)
Идея с использованием шаблона, позволяющего передавать любые символы, хороша. Но, наверное, стоило бы сразу писать алгоритм, переводящий из любой СЧ в любую другую.. Всё равно спасибо, сэкономил человеко-час. Плюсую.
6. Евгений (Berrimor) 18.02.16 13:50
Из любой системы счисления

Значение = "00001CGUMZYCB99J"; // Для примера значение кода алкогольной продукции из акцизной марки в 36-ричной системе счисления
Нотация = 36; // основание, здесь 36

Результат=0;

Длина = СтрДлина(Значение);
Для Х=1 По Длина Цикл
М=1;
Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
Результат=Результат+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Значение,Х,1))-1)*М;
КонецЦикла;