Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Простой класс форматирования по строке (число прочтений - 2265 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Простой класс форматирования по строке
30. Января 2007 :: 22:27
Печать  
Давно хотелось иметь возможность форматирования параметров по строке.
Чтобы можно было написать что-то типа
Код
Выбрать все
Сообщить(_Фрм("Сумма: %ч, Количество: %к, Дата: %д", 100.1111, 200.2222, '01.01.01'));
 


И получить на выходе
Код
Выбрать все
Сумма: 100.11, Количество: 200, Дата: 01.01.2001
 



В первом приближении:
Код
Выбрать все
class ФорматнаяСтрока = ФорматнаяСтрока.ert
{
	Строка _Фрм(Строка __стр, ...);
	void _Лог(Строка __стр, ...);
}
 


  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Простой класс форматирования по строке
Ответ #1 - 30. Января 2007 :: 22:28
Печать  
Код
Выбрать все
Перем мДт;
Перем мСпецНачало;
Перем мСпецПроцент;

// переменные модуля, исп. в вызовах делегата
Перем мПараметры;
Перем мНомерПараметра;
Перем мКоличествоПараметров;

//
Функция Сам(__конт)
	Возврат __конт;
КонецФункции

//
// простая строка

//
Функция _Флаг_s(__знач) Экспорт
	мНомерПараметра =мНомерПараметра +1;
	Возврат Строка(мПараметры.ПолучитьЗначение(мНомерПараметра)) +__знач;
КонецФункции

//
// простое число

//
Функция _Флаг_i(__знач) Экспорт
	мНомерПараметра =мНомерПараметра +1;
	Возврат Строка(Число(мПараметры.ПолучитьЗначение(мНомерПараметра))) +__знач;
КонецФункции

//
// сокрлп строка (русское с)

//
Функция _Флаг_с(__знач) Экспорт
	мНомерПараметра =мНомерПараметра +1;
	Возврат СокрЛП(мПараметры.ПолучитьЗначение(мНомерПараметра)) +__знач;
КонецФункции

//
// фрм число (суммы)

//
Функция _Флаг_ч(__знач) Экспорт
	мНомерПараметра =мНомерПараметра +1;
	Возврат СокрЛ(Формат(мПараметры.ПолучитьЗначение(мНомерПараметра), "Ч15.2")) +__знач;
КонецФункции

//
// фрм число (количество)

//
Функция _Флаг_к(__знач) Экспорт
	мНомерПараметра =мНомерПараметра +1;
	Возврат СокрЛ(Формат(мПараметры.ПолучитьЗначение(мНомерПараметра), "Ч15.0")) +__знач;
КонецФункции

//
// фрм дата

//
Функция _Флаг_д(__знач) Экспорт
	мНомерПараметра =мНомерПараметра +1;
	Возврат СокрЛ(Формат(мПараметры.ПолучитьЗначение(мНомерПараметра), "ДДДММГГГГ")) +__знач;
КонецФункции

//
// служебная - начало форматной строки

//
Функция _Флаг_Начало(__знач) Экспорт
	Возврат __знач;
КонецФункции

//
// служебная - печать процента

//
Функция _Флаг_Процент(__знач) Экспорт
	Возврат "%" +__знач;
КонецФункции

//
Процедура Конструктор()
	Сам =Сам(Контекст);

	мСпецНачало =Симв(1);
	мСпецПроцент =Симв(2);

	мДт =СоздатьОбъект("Делегат");
	мДт.ОпределитьТип(1, 1);

	мДт.Добавить(Сам, "_Флаг_s", "__default");
	мДт.Добавить(Сам, "_Флаг_Начало", мСпецНачало);
	мДт.Добавить(Сам, "_Флаг_Процент", мСпецПроцент);

	мДт.Добавить(Сам, "_Флаг_s", "s");
	мДт.Добавить(Сам, "_Флаг_i", "i");
	мДт.Добавить(Сам, "_Флаг_с", "с");
	мДт.Добавить(Сам, "_Флаг_ч", "ч");
	мДт.Добавить(Сам, "_Флаг_к", "к");
	мДт.Добавить(Сам, "_Флаг_д", "д");
КонецПроцедуры

//
// основная логика

//
Функция _Строка(__стр)
	мНомерПараметра =0;
	мКоличествоПараметров =мПараметры.РазмерСписка();

	_стр0 =СтрЗаменить(__стр, "%%", "%" +мСпецПроцент);
	_стр0 =мСпецНачало +СтрЗаменить(_стр0, "%", РазделительСтрок);

	_стр ="";

	_колс =СтрКоличествоСтрок(_стр0);
	Для _ин =1 По _колс Цикл
		_стр1 =СтрПолучитьСтроку(_стр0, _ин);
		_ключ =Лев(_стр1, 1);
		_знач =Сред(_стр1, 2);

		_стр =_стр +мДт.ВызватьПоКлючу(_ключ, _знач);
	КонецЦикла;
	Возврат _стр;
КонецФункции

//
// паблик метод - возврат полной строки

//
Функция _Фрм(__стр) Экспорт
	Сам =Сам(Контекст);
	мПараметры =Сам.ПолучитьСписокПараметров("_Фрм");
	Возврат _Строка(__стр);
КонецФункции

//
// паблик метод - печать полной строки

//
Процедура _Лог(__стр) Экспорт
	Сам =Сам(Контекст);
	мПараметры =Сам.ПолучитьСписокПараметров("_Лог");
	Сообщить(_Строка(__стр));
КонецПроцедуры

//
 

  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Простой класс форматирования по строке
Ответ #2 - 30. Января 2007 :: 22:35
Печать  
Использование:

_ф =СоздатьОбъект("ФорматнаяСтрока");
_ф._Лог("сумма: %ч, количество: %к, дата: %д", 133.2333, 444.33222, ТекущаяДата());
//или
Сообщить(_ф._Фрм("сумма: %ч, количество: %к, дата: %д", 133.2333, 444.33222, ТекущаяДата()));


Форматные строки:
  • %s
  • %i
  • %c


  • Печать процента:
  • %%.

    Ограничения:
  • форматная строка не должна быть многострочной и содержать символы с кодами 0x01 и 0x02.

    Не сделано:
  • контроль ошибок (несоответствие количества параметров)
  •   

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    Переключение на Главную Страницу Страницы: 1
    ОтправитьПечать