Однажды потребовалось из шестнадцатеричной строки вида «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;
Результат = Результат * ДлинаШаблона + ПозицияВШаблоне;
КонецЦикла;
Возврат(Результат);
КонецФункции




Простой алгоритм перевода числа из любой системы счисления в десятичную.
Перейти к публикации
Можно записать это проще, без возведения в степень:
(1) Благодарю за отклик и предоставленный альтернативный алгоритм. Признаться вообще удивлен, что эта запись кого то заинтересовала. За все время, что я вожусь с 1Ской это первый случай, когда потребовалось что то делать с шестнадцатеричными числами т.е. нужно отметить, что задача в определенном смысле специфична. Основной пост сейчас поправлю, добавив Ваш вариант.
Ну, мне недавно внезапно потребовалось переводить Hex в Bin. Случается.
На самом деле очень полезная вещь, которой не хватало в 1С.
Особенно при стыковке с разными Web,Java и прочими Андроидами,
где тот же цвет задается то через Int, то через строки типа «#FF00AA98».
Спасибо автору.
Чуть было не написал сам, но решил глянуть на Инфостарте и не зря)
Идея с использованием шаблона, позволяющего передавать любые символы, хороша. Но, наверное, стоило бы сразу писать алгоритм, переводящий из любой СЧ в любую другую.. Всё равно спасибо, сэкономил человеко-час. Плюсую.
Из любой системы счисления
Значение = «00001CGUMZYCB99J»; // Для примера значение кода алкогольной продукции из акцизной марки в 36-ричной системе счисления
Нотация = 36; // основание, здесь 36
Результат=0;
Длина = СтрДлина(Значение);
Для Х=1 По Длина Цикл
М=1;
Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
Результат=Результат+(Найти(«0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ»,Сред(Значение,Х,1))-1)*М;
КонецЦикла;