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

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

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

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

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

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

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

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

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

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

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

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

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

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

7 Comments

  1. lazy

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

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

    Reply
  2. VUN

    Можно записать это проще, без возведения в степень:

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

    (1) Благодарю за отклик и предоставленный альтернативный алгоритм. Признаться вообще удивлен, что эта запись кого то заинтересовала. За все время, что я вожусь с 1Ской это первый случай, когда потребовалось что то делать с шестнадцатеричными числами т.е. нужно отметить, что задача в определенном смысле специфична. Основной пост сейчас поправлю, добавив Ваш вариант.

    Reply
  4. ms200999

    Ну, мне недавно внезапно потребовалось переводить Hex в Bin. Случается.

    Reply
  5. mgor

    На самом деле очень полезная вещь, которой не хватало в 1С.

    Особенно при стыковке с разными Web,Java и прочими Андроидами,

    где тот же цвет задается то через Int, то через строки типа «#FF00AA98».

    Спасибо автору.

    Reply
  6. Патриот

    Чуть было не написал сам, но решил глянуть на Инфостарте и не зря)

    Идея с использованием шаблона, позволяющего передавать любые символы, хороша. Но, наверное, стоило бы сразу писать алгоритм, переводящий из любой СЧ в любую другую.. Всё равно спасибо, сэкономил человеко-час. Плюсую.

    Reply
  7. Berrimor

    Из любой системы счисления

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

    Нотация = 36; // основание, здесь 36

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

    Длина = СтрДлина(Значение);

    Для Х=1 По Длина Цикл

    М=1;

    Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;

    Результат=Результат+(Найти(«0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ»,Сред(Значение,Х,1))-1)*М;

    КонецЦикла;

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *