По мотивам комментариев к статье «Конвертация числа в различные системы исчисления в 1С» (спасибо пользователю kuzyara).
Функции для конвертации арабских цифр в римские и обратно.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | &НаКлиенте Функция РазложитьСтрокуВМассивПодстрок(тСтрока, тРазделитель) мВозврат = Новый Массив; тМнСтрока = СтрЗаменить(тСтрока, тРазделитель,Символы.ПС); Для тСчет = 1 по СтрЧислоСтрок(тМнСтрока) Цикл мВозврат.Добавить(СтрПолучитьСтроку(тМнСтрока, тСчет)); КонецЦикла; Возврат мВозврат; КонецФункции &НаКлиенте Функция ArabicToRoman(Знач тЧисло) мБуквы = РазложитьСтрокуВМассивПодстрок("I,IV,V,IX,X,XL,L,XC,C,CD,D,CM,M", ","); мЦифры = РазложитьСтрокуВМассивПодстрок("1,4,5,9,10,40,50,90,100,400,500,900,1000", ","); тРимскоеЧисло = ""; Для тСчет = 0 По мБуквы.Количество() - 1 Цикл тБуква=мБуквы.Количество() - тСчет - 1; Пока тЧисло >= Число(мЦифры[тБуква]) Цикл тРимскоеЧисло = тРимскоеЧисло + мБуквы[тБуква]; тЧисло = тЧисло - Число(мЦифры[тБуква]); КонецЦикла; КонецЦикла; Возврат тРимскоеЧисло; КонецФункции &НаКлиенте Функция RomanToArabic(тРимскоеЧисло) сРимские = Новый Структура("M, D, C, L, X, V, I", 1000, 500, 100, 50, 10, 5, 1); тЧислоСимволов = СтрДлина(тРимскоеЧисло); тАрабскоеЧисло = 0; Для тСчет=1 По тЧислоСимволов Цикл Если тСчет < тЧислоСимволов И сРимские[Сред(тРимскоеЧисло, тСчет, 1)] < сРимские[Сред(тРимскоеЧисло, тСчет+1, 1)] Тогда тАрабскоеЧисло = тАрабскоеЧисло - сРимские[Сред(тРимскоеЧисло, тСчет, 1)]; Иначе тАрабскоеЧисло = тАрабскоеЧисло + сРимские[Сред(тРимскоеЧисло, тСчет, 1)]; КонецЕсли; КонецЦикла; Возврат тАрабскоеЧисло; КонецФункции |
Функция ArabicToRoman(Знач пчАрабскоеЧисло) Экспорт
мБуквы = СтрРазделить(» M CM D CD C XC L XL X IX V IV I», » «,Ложь);
мЗначен = СтрРазделить(«1000 900 500 400 100 90 50 40 10 9 5 4 1″, » «,Ложь);
сРимскоеЧисло = «»;
Для чИндРимской = 0 По мБуквы.ВГраница() Цикл
чЗначениеРимской=Число(мЗначен[чИндРимской]);
Пока пчАрабскоеЧисло >= чЗначениеРимской Цикл
сРимскоеЧисло = сРимскоеЧисло + мБуквы[чИндРимской];
пчАрабскоеЧисло = пчАрабскоеЧисло — чЗначениеРимской;
КонецЦикла;
КонецЦикла;
Возврат сРимскоеЧисло;
КонецФункции
Функция RomanToArabic(псРимскоеЧисло) Экспорт
струкРимские = Новый Структура(«M, D, C, L, X, V, I», 1000, 500, 100, 50, 10, 5, 1);
чСимволовРим = СтрДлина(псРимскоеЧисло);
чАрабскоеЧисло = 0;
Для чПозРим=1 По чСимволовРим Цикл
Попытка
чЗначениеРимской=струкРимские[Сред(псРимскоеЧисло, чПозРим, 1)];
чЗначениеРимскойСледующей=?(чПозРим=чСимволовРим, 0, струкРимские[Сред(псРимскоеЧисло, чПозРим+1, 1)]);
Исключение Возврат Неопределено КонецПопытки;
Если чЗначениеРимской < чЗначениеРимскойСледующей Тогда
чАрабскоеЧисло = чАрабскоеЧисло — чЗначениеРимской;
Иначе
чАрабскоеЧисло = чАрабскоеЧисло + чЗначениеРимской;
КонецЕсли;
КонецЦикла;
Возврат чАрабскоеЧисло;
КонецФункции
—
Спасибо за алгоритм, оптимизировал