gifts2017

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

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

Иногда надо перевести число в двоичную или шестнадцатеричную систему счисления - нет ничего проще.
Кроме этого, данной функцией можно воспользоваться для компактного представления большого числа (например результат вычисления хэш функции) в виде строкового кода, когда код документа (справочника) тип строка.

Например число 6869973762479115207 (19 разрядов) в 156-ричной системе счисления будет представлен строкой "KвULq%Лzq" (9 символов)

 

// Функия переводит число переданное в параметре
// Значение в строку (либо число) в системе счисления X
// X определяется линой шаблона, представление знаков разрядов
// значение шаблона, где сивол шаблона[k] - есть представление
// Например если шаблок "01", то перевод будет осуществлен в двоичную
 // систему счисления, если "01234567", то в восьмиричную
// если "0123456789ABCDEF", то в шестнадцатиричную
// если "ЛИ", то в двоичную, где 0 представлен буквой Л, а 1 буквой И
// вариант шаблона:
// "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwzyzАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя!@#$%^&*()_-=+{}[]\|/,.:;'""><"
// представит Значение в сто пятидесятишести ричной системе счисления,
// где соответствующий символ шаблона означает соответствующую цифру разряда
Функция Из_Число_В_XСчисл(Знач Значение, Шаблон)
    Результат="";
    Основание = СтрДлина(Шаблон);
    Пока Значение>0 цикл
        Остат = Значение%Основание;
        Результат1=Сред(Шаблон,Остат+1,1);
        Значение = (Значение-Остат)/Основание;
        Результат = Результат1 + Результат;
    КонецЦикла;
    Возврат Результат;
КонецФункции


См. также

Подписаться Добавить вознаграждение
Комментарии
1. Galytskyy Volodymyr (arithmometr) 12.05.10 01:11
Если с помощью этой функции закодировать строки, а потом усуществлять поиск по этим строкам, то получим глюк. При стандартном поиске 1С не различает регисров букв.
По этому, я в подобной функции использую только большие литеры латиницы и маленькие кириллицы + некоторые непонятные символы (не набираемые с клавиатуры) воспринимаемые 1С нормально.
У меня насобиралось 146 символов.
И все таки (+)
2. Влад Косилов (kosilov) 12.05.10 02:39
Я как-то не подумал, что не различает маленькие и большие.
В таком случае надои спользовать только одного регистра.
Я использую просто цифробуквенный код (цифры и большие латинские буквы).
Такой код хоть читаем человеком.

4. Влад Косилов (kosilov) 12.05.10 14:43
(3) Да, практически идентичная реализация.
Мне только кажется, что передавать патерн в качестве параметра базы системы счисления немного гибче.
Хотя, как кому нравиться.
5. Яков Коган (Yashazz) 13.05.10 14:08
6. Влад Косилов (kosilov) 14.05.10 00:56
(5) Ну когда будут распространены квантовые компутера будем переводить в кванты. ;)
7. Сергей (palamars) 22.09.11 12:04
Было бы неплохо привести функцию и обратного перевода
8. lazy (lazy) 20.10.11 16:31
За идею плюсик.
Взял на себя смелость написать функцию обратную представленной автором.
http://infostart.ru/public/95428/