Две простые простые функции которые конвертируют числа из десятичной системы исчисления в систему исчисления с любым другим основанием и обратно.
Dec в Bin, Oct, Hex и прочие:
1 2 3 4 5 6 7 8 9 10 11 | &НаКлиенте Функция DecToAny(Знач тЗначение, тОснование) тРезультат = ""; Пока тЗначение > 0 Цикл тРезультат = Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", тЗначение%тОснование + 1, 1) + тРезультат; тЗначение = Цел(тЗначение/тОснование) ; КонецЦикла; Возврат тРезультат; КонецФункции |
Bin, Oct, Hex и прочие в Dec:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | &НаКлиенте Функция AnyToDec(Знач тЗначение, тОснование) тРезультат=0; тДлина = СтрДлина(тЗначение); Для тСимвол = 1 По СтрДлина(тЗначение) Цикл тМножитель = 1; Для тСчет = 1 По тДлина-тСимвол Цикл тМножитель = тМножитель * тОснование; КонецЦикла; тРезультат=тРезультат + (Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", Сред(тЗначение, тСимвол, 1))-1) * тМножитель; КонецЦикла; Возврат Окр(тРезультат); КонецФункции |
Перенес в отдельную статью: конвертация в римские цифры и обратно в 1С.
Перенесено в отдельную статью: Excel. Как получить имя столбца по номеру и обратно в 1С
читал тут на хабре про вторую стадию программиста:
http://habrahabr.ru/company/veeam/blog/267187/
вас вспомнил)
http://infostart.ru/public/99748/
Моя текущая привычка именования переменных как раз из третьей стадии и происходит (коллегам понятнее именно так), но попробую исправиться.
В Функция AnyToDec() посоветовал бы использовать ВРег для тЗначение либо в начале
тЗначение = ВРег(тЗначение)
либо в середине Сред(ВРег(тЗначение), тСимвол, 1)
ну и по мелочи (все равно уже посчитано)
Для тСимвол = 1 По тДлина Цикл
Мой Вариант:
Функция AnyToDec(Значение, Основание = 16)
Перем Результат, ЗначениеДлина, Множитель, ЕстьРазделительДроби, Поз, ТекСимвол;
Результат = 0;
ЗначениеДлина = СтрДлина(Значение);
Множитель = 1;
ЕстьРазделительДроби = Ложь;
Для й = 1 По ЗначениеДлина Цикл
ТекСимвол = Сред(Значение, ЗначениеДлина — й + 1, 1);
Поз = Найти(«0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ», ТекСимвол);
Если Поз И Поз < Основание Тогда
Результат = Результат + (Поз — 1) * Множитель;
Множитель = Множитель * Основание;
ИначеЕсли Не ЕстьРазделительДроби И (ТекСимвол = "." Или ТекСимвол = ",") Тогда
ЕстьРазделительДроби = Истина;
Результат = Результат/Множитель;
Множитель = 1;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
!!! Правильно переводит, оптимальная логика, понимает дроби
Без проблем преобразует:
0xFFFF
FF FF AA
1001,1101
исправить:
Если Поз И Поз <= Основание Тогда
Убираем лишний цикл внутри цикла
Функция AnyToDec(ИсхЗначение, ИсхОснование)
Результ=0;
ИсхСимволов = СтрДлина(ИсхЗначение);
Для ПозСимвола = 1 По ИсхСимволов Цикл
Результ=Результ + (Найти(«0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ», Сред(ИсхЗначение, ПозСимвола, 1))-1) * pow(ИсхОснование, ИсхСимволов-ПозСимвола);
КонецЦикла;
Возврат Результ;
КонецФункции