Функция format в delphi

Функция format в delphi

Параметр Formatting определяет, как массив Data Данных управляется в возвращенной строке.

Форматируемая cтрока может включать соединение обычных символов (которые передаются неизменными в строку результата), и символам форматирования данных. Такое форматирование лучше всего объясняется кодом примера.

В простых условиях каждые данные, форматирующие подстроку начинаются с % и заканчиваются индикатором типа данных:

d = Десятичное (целое число)
e = Научный
f = Установленный
g = Генерал
m = Деньги
n = Число (плавающее)
p = Указатель
s = Строка
u = Десятичное число без знака
x = Шестнадцатеричный

Общий формат форматирования каждой подстроки следующий:

где квадратные скобки относятся к дополнительным параметрам, и :. — символы — литералы, первые 2 из которых используются, чтобы идентифицировать два из дополнительных параметров.

Версия 2 этой функции — для использования в пределах потоков. Вы должны заполнить запись FormatSettings перед вызовом запроса. Она берёт местную копию глобальной переменной, форматирующей переменные, которые делают подпрограмму потоко-безопасной.

Примечания Различные опции форматирования, типа DecimalSeparator и CurrencyString используются для некоторых из этих опций форматирования. См. более определенные версии команд отображения данных, типа CurrToStrF для подробностей. Похожие команды
CurrencyDecimals Определяет число десятичных цифр в функции Format

CurrencyFormat Определяет размещение строки валюты в функции показа валюты

CurrencyString Строка валюты, используемая в функциях отображения валюты

CurrToStrF Преобразует денежную величину в строку с форматированием

DecimalSeparator Символ используемый для отображения десятичной точки

FloatToStrF Преобразует значение с плавающей запятой в строку с форматированием

FormatCurr Богатое форматирование значений валюты в строку

FormatDateTime Богатое форматирование переменной TDateTime в строку

FormatFloat Богатое форматирование числа с плавающей запятой в строку

NegCurrFormat Определяет отображение отрицательного количества форматированной валюты

ThousandSeparator Символ, используемый для отображения разделителя тысяч

Функция формат (Format) в Delphi (Делфи) возвращает строку, которая отображает список аргументов по заданному шаблону формата.

[ :] определяет индекс аргумента в заданном списке, к которому относится данный спецификатор формата.

[-] индикатор выравнивания влево.

Спецификатор Значение
d Десятичное число. Значение преобразуется в троку десятичных цифр. Если спецификатор формата содержит поле точности, то результирующая строка должна содержать количество цифр, но не менее указанного значения Если форматируемое значение содержит меньше цифр, оно дополняется слева нулями.
e Формат значения с плавающей запятой. Значение преобразуется в формат вида «-d.ddd… x10^+ddd», где «d» это цифра. Отрицательные числа начинаются со знака «-«. Перед десятичной точкой всегда имеется одна цифра. По умолчанию точность равна 15 (если нет спецификатора точности.
x Шеснадцатеричный формат целых чисел. Значение аргумента преобразуется в строку шестнадцатеричных чисел.
g Обобщенный формат чисел с плавающей запятой. Значение преобразуется в формат научный или фиксированной точкой, в зависимости от того, какой из них дает короткую запись.
Читайте также:  Цифровая ручка для компьютера

Объявление function Format (const sFormat: string; const Args: array of const) : string

Функция Format возвращает отформатированную сторку, представляющую собой результат применения строки описания формата SFormat к открытому массиву аргументов Args.

Format (‘Дано %d и %d’, [7, 12])

Выводит: Дано 7 и 12

Format (‘Дано %d = %0:x’, [40])

Выводит: Дано 40 = 1Е

Неудобность заключается в применении формата e.

Format (‘%у %0:f %0:n %0:g’, [10000.])

Выводит: 1,00000000000000Е+004 10000,00 10 000,00 10000

Поэтому наиболее приемлемо применять формат g: Format (‘%m = %0:x’, [10000.]) выводит 10 000р.

. delphi Возвращает сумму десятичных чисел Delphi 7 Format format delphi format delphi преобразование вещественного числа в денежный формат делфи

В языке C++ есть много всяких форматирующих функций. Например: printf, sprintf и т.д. Когда их вызываешь, то кол-во параметров неограниченно, например:

char name[255];
DWORD age;
char addr[255];

printf("
Name: %s
Age: %d
Address: %s
", name, age, addr);

Можно ли сделать какую-нибудь подобную функцию для Delphi.


Anatoly Podgoretsky ( 2002-11-09 14:43 ) [1]

И в дельфи есть и тоже крличество параметров неограничено, а то что привел это почти полный аналог под названием format


Alex44 ( 2002-11-09 14:44 ) [2]


Андрей Ульченко ( 2002-11-09 15:57 ) [3]

В Delphi есть функция

format("ляляля %s нет нет нет %d",["оппа",10]).


Андрей Ульченко ( 2002-11-09 15:58 ) [4]

Сори, дублировал ответ


Василий2 ( 2002-11-09 16:08 ) [5]

Я не хочу использовать SysUtils, а об этой функции я сам знаю.

Читайте внимательно вопрос: Можно ли сделать какую-нибудь подобную функцию для Delphi(функцию printf с неограниченным кол-вом параметров — в функции format массив,а не неограниченное число параметров).


Ketmar ( 2002-11-09 16:51 ) [6]

а чем так принципиально отличается форма записи Func(a, [b, c, d, . ]) от Func(a, b, c, d, . ) ? парой лишних скобок? ну нельзя сделать без скобок, нельзя. только со скобками. теперь вы удовлетворены? %-)

Satanas Nobiscum! 09-Nov-XXXVII A.S.


Внук ( 2002-11-09 16:53 ) [7]

А может, тогда лучше использовать API-функции wvsprintf и wsprintf? Вполне 🙂
Или — динамические массивы указателей на разнотипные параметры.


Василий2 ( 2002-11-09 16:54 ) [8]

2Ketmar: Хорошо. Как можно?


Василий2 ( 2002-11-09 17:16 ) [9]

Внук: Да, но только есть одна загвоздка.

function i2s(value : dword) : string;
const format : pchar = "%d";
var buffer : pchar;
begin
getmem(buffer, 256);
asm
push value
push format
push buffer
call wsprintf
add esp, 0Ch
end;
result := string(buffer);
freemem(buffer);
end;

Эта функция аналог IntToStr. Здесь сразу известно кол-во параметров для форматирования (1) и сама строка ("%d"). А что делать когда оно не известно? Пользователь мог отформатировать ("name: %s", name) , а мог и ("name: %s age: %d", name, age) . Как быть?

Читайте также:  Код пустого сообщения вконтакте


Ketmar ( 2002-11-09 18:06 ) [10]

а можно так, как в Format сделано. цитата из хэлпа:
function MakeStr(const Args: array of const): string;

const
BoolChars: array[Boolean] of Char = ("F", "T");
var
I: Integer;
begin
Result := "";
for I := 0 to High(Args) do
with Args[I] do
case VType of
vtInteger: Result := Result + IntToStr(VInteger);
vtBoolean: Result := Result + BoolChars[VBoolean];
vtChar: Result := Result + VChar;
vtExtended: Result := Result + FloatToStr(VExtended^);

vtString: Result := Result + VString^;
vtPChar: Result := Result + VPChar;
vtObject: Result := Result + VObject.ClassName;
vtClass: Result := Result + VClass.ClassName;
vtAnsiString: Result := Result + string(VAnsiString);
vtCurrency: Result := Result + CurrToStr(VCurrency^);
vtVariant: Result := Result + string(VVariant^);
vtInt64: Result := Result + IntToStr(VInt64^);

MakeStr(["test", 100, " ", True, 3.14159, TForm])
returns the string “test100 T3.14159TForm”.

Satanas Nobiscum! 09-Nov-XXXVII A.S.


Alex44 ( 2002-11-09 19:56 ) [11]

V Pascal"e i v C raznye soglasheniya vyzova. No v principe, dynamicheskij massiv kak parameter ochen" malo otlyuchaetsya ot peremennogo chisla parametrov (i tam, i tam peredayetsya chislo parametrov, a potom samy parametry).


Василий2 ( 2002-11-10 08:12 ) [12]

Использовал дин. массив, только ошибка вылезает, помогите.

function format(value : string; const args : array of const) : string;
var
format : pchar;
buffer : pchar;
c : dword;
begin
result := "";
format := "";
buffer := "";
c := 0;

while pos("%", value) <> 0 do
begin
result := result + copy(value, 1, pos("%", value) — 1);
format := pchar(copy(value, pos("%", value), 2));
delete(value, 1, pos("%", value) + 1);

getmem(buffer, 256);
asm
push args[c]
push format
push buffer
call wsprintf
add esp, 0Ch
end;
result := result + string(buffer);
freemem(buffer);
inc(c);
end;
end;


Незнайка2 ( 2002-11-10 09:41 ) [13]

Ошибка из-за push args[c], наверно. А как бороться — НЕ ЗНАЮ!


Alex44 ( 2002-11-10 12:21 ) [14]

Chto est" wsprintf? Vy uvereny, chto ej imenno takie parametry nuzhny?

Net proverki na c


Внук ( 2002-11-10 14:46 ) [15]

Пример на wvsprintf тут http://delphibase.endimus.com/?action=viewtopic&topic=strchange :))


Василий2 ( 2002-11-11 12:59 ) [16]

Alex44 -> Стандартный format из SysUtils, который я не использую.

Внук -> Я посмотрел. Попробую разобраться. Главное — чтобы @args в третьем параметре работало! (const args : array of const)


Игорь Шевченко ( 2002-11-11 13:08 ) [17]

Василий2 © (11.11.02 12:59)

Читайте также:  Как вернуть проводник на рабочий стол

А SysUtils не используется по религиозным соображениям ? Или из духа Ивана Кулибина, который является по ночам и шепчет: "Изобретай велосипед, сынку, и будет тебе почет и уважение".


Ketmar ( 2002-11-11 14:17 ) [18]

2Игорь Шевченко:
а SysUtils большой. а вырезать функцию Format запрещает этика и эстетика (некрасиво файлы на куски резать! %-).

Satanas Nobiscum! 11-Nov-XXXVII A.S.


Василий2 ( 2002-11-11 14:35 ) [19]


Игорь Шевченко ( 2002-11-11 16:05 ) [20]

Ketmar © (11.11.02 14:17)

Василий2 © (11.11.02 14:35)

А если идет борьба за уменьшение размеров, то имеет смысл обратиться в сторону программ на языке ассемблера — там не только SysUtils, а даже system не используется — экономия поразительная. Можно из одного байта работающую программу написать.


Ketmar ( 2002-11-11 16:25 ) [21]

2Игорь Шевченко:
вот и я говорю: некрасиво. видите, как мы сошлись во мнении?

Satanas Nobiscum! 11-Nov-XXXVII A.S.


Eugen Honeker ( 2002-11-11 17:15 ) [22]

вот аналог от Format(SysUtils) на читом api, кому надо

function Format(const Format: string; const Args: array of const): string;
type
array_of_pointer = array[0..0]of pointer;
var
n: integer;
ap: ^array_of_pointer;
buf: array[0..1023]of char;
begin

result:= "";
n:= length(Args);
if (n = 0) then exit;

getmem(ap, n * sizeof(Pointer));

for n:= 0 to (n-1) do
ap[n]:= Args[n].VPointer;

try
n:= wvsprintf(buf, @Format[1], PChar(@ap[0]));
SetString(Result, buf, n);
except
end;
freemem(ap);
end;


Игорь Шевченко ( 2002-11-11 17:17 ) [23]

Давить надо за такой стиль


Eugen Honeker ( 2002-11-11 17:25 ) [24]

так лучше, или чего тебе герою непонравилось?

try
n:= wvsprintf(buf, @Format[1], PChar(@ap[0]));
SetString(Result, buf, n);
except
result:= "";
end;


Anatoly Podgoretsky ( 2002-11-11 17:26 ) [25]


Василий2 ( 2002-11-12 19:26 ) [26]

Eugen Honeker -> Спасибо за попытку помочь, но почему-то когда я вызываю эту функцию, она форматированные данные не выводит. Например: writeln(format("Program: %s.", ["MyProg"])); В консоли написано: "Program ."


Василий2 ( 2002-11-12 19:30 ) [27]

Ой, извиняюсь. Не

writeln(format("Program: %s.", ["MyProg"])); , а

writeln(format("Param1: %s.", [ParamStr(1)]));

В строке написано: "Param1: ."


Anatoly Podgoretsky ( 2002-11-12 19:57 ) [28]

А как вызывал программу, для начала проверь ParamStr(0)]));


Василий2 ( 2002-11-13 19:11 ) [29]

Еще вопросик: А почему форматируются только 2 параметра, хотя я указывал 3?


Eugen Honeker ( 2002-11-14 00:01 ) [30]

что то у тебя проблемы с параметрами.
вот тебе пример

const
fmt = "%s %s %s %s [0x%.08x] %c";
.
MessageBox(0, @Format(fmt, ["ich","bin","ein","lammer", 43962, "."])[1], nil, 144);

выдаёт на экране:

ich bin ein lammer [0x0000abba] .

Ссылка на основную публикацию
Установить gvlk ключ что это
В связи с недавним выходом окончательной RTM версии пакета Microsoft Office 2016, корпоративные заказчики уже могут начинать переход на новую...
Топ вай фай адаптеров для пк
На заре развития интернета люди пользовались только проводным трафиком. После этого в «моду» начали входить модемы, которые подключались к беспроводному...
Топ дешевых наушников с хорошим звуком
Проводные наушники должны умереть! Так решил мобильный рынок и производители смартфонов, стремительно избавляющиеся от устаревшего 3,5 мм джека. Стоит ли...
Установить openal32 dll для windows 7
Данная библиотека задействуется во многих процессах во время работы компьютера. Например, она используется в играх, мультимедиа и различных программах. Иногда...
Adblock detector