Описание функции


sprintf

Возвращает форматированную строку.

sprintf(*Buffer, format.p-utf8, var1=0[, var2=0[, var3=0]])

Параметры

*Buffer Указатель на строку, куда будет помещён результат. Это должно быть достаточно, чтобы поместить результат.
format.p-utf8 Строка-шаблон, содержащая управляющие последовательности.
var1-var32 Передаваемые параметры. Их количество задаётся и в объявлении функции, в зависимости сколько параметров вам нужно передать.

Примечания

Каждая "переменная" (var1...var32) является Integrer.
Шаблон (format.p-utf8) не распознаёт специальные символы: \n, \r, \t. Литеральный "%" записывается как %%.

Формат управляющей последовательности:
%[флаги] [ширина] [.точность] тип
Обязательными составными частями являются символ начала управляющей последовательности (%) и тип.
Несоответствие количества управляющих последовательностей и количества переменных не приводит к ошибке.

Примеры управляющей последовательности:

%08.12s
%10s
%02d
%X

        Спецификатор типа

ТипТип переменнойВыходной формат
d, iЦелоеДесятичное целое число.
oЦелоеВосьмеричное целое число без знака.
uЦелоеДесятичное целое число без знака.
xЦелоеШестнадцатеричное целое число без знака. Символы "abcdef" в нижнем регистре.
XЦелоеАналогично предыдущему x, но "ABCDEF" в верхнем регистре.
sСтрокаСтрока.

        Спецификатор флагов

ФлагЗначениеПо умолчанию
-Устанавливает левое выравнивание результата в пределах ширины области.Правое выравнивание.
+Устанавливает префикс выходного значения, знак "+" или "-", если используется знаковый тип.Знак появляется только для отрицательных величин (-).
0Если спецификатор ширины с префиксом 0, то нули добавляются до заполнения минимальной ширины. Если появляются 0 и "-", то 0 игнорируется. Если 0 используется с типом целого числа (i, u, x, X, o, d) то 0 игнорируется.Отсутствует заполнение.
ПробелПрефикс выходного значения с пробелом, если выходное значение знаковое и положительно; Пробел игнорируется если используются оба флага "Пробел" и "+".Отсутствует.
#При использовании типов o, x, X приписывает префикс любому ненулевому выходному значению соответственно 0, 0x, 0X.Отсутствует.

        Спецификатор ширины

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

Спецификатор ширины не обрезает выводимое значение. Если количество выводимых символов больше указанной ширины или ширина не задана, то выводятся все символы.

        Спецификатор точности

Третьим необязательным элементом управляющей последовательности является спецификатор точности. Это целое число, с предшествующей точкой (.), которое определяет количество символов вывода, количество десятичных порядков, или количество значимых цифр (см. таблицу ниже). В отличие от спецификатора ширины, спецификатор точности может привести либо к усечению выходной величины, либо к округлению числа с плавающей запятой. Если точность определена как 0 и значение для преобразования равно 0, то результат вывода не имеет символов, как показано ниже:

sprintf(*p "%.0d", 0 ) ; Никакие символы не будут возвращены

    Как на точность влияет тип

ТипЗначениеПо умолчанию
d, i, u, o, x, XТочность задает минимальное количество цифр для вывода. Если количество цифр в аргументе меньше, чем точность, выходное значение дополняется нулями слева. Значение не сокращается, когда количество цифр превышает точность.По умолчанию точность - 1.
sТочность определяется максимальным количеством символов для вывода. Символы сверх точности не выводятся.Символы выводятся до первого нулевого символа.

Пример

EnableExplicit

ImportC ""
    sprintf(*str, format.p-utf8, Param1=0, Param2=0, Param3=0, Param4=0, Param5=0, Param6=0)
EndImport

; Define Buff.s = Space(1000)
Define *Buff = AllocateMemory(1000, #PB_Memory_NoClear)
; FillMemory(*Buff, 1000, 0, #PB_Byte)
Define Time$, n, u

; Пример 1
n = 43951789
u = -43951789


; учтите, что двойное %%, выводит символ как есть, буквально "%"; здесь \n - перенос строки, \t - табуляция
sprintf(*Buff, "%%d = %d", n) ; "43951789" стандартное целое
Debug PeekS(*Buff, -1, #PB_UTF8)
sprintf(*Buff, "%%u = %u", n) ; "43951789" положительное целое число без знака
Debug PeekS(*Buff, -1, #PB_UTF8)
sprintf(*Buff, "%%o = %o", n) ; "247523255" восьмеричное
Debug PeekS(*Buff, -1, #PB_UTF8)
sprintf(*Buff, "%%x = %x", n) ; "29ea6ad" шестнадцатеричный вид (в нижнем регистре)
Debug PeekS(*Buff, -1, #PB_UTF8)
sprintf(*Buff, "%%X = %X", n) ; "29EA6AD" шестнадцатеричный вид (в верхнем регистре)

Debug PeekS(*Buff, -1, #PB_UTF8)
sprintf(*Buff, "%%+d = %+d", n) ; "+43951789" знак указывающий положительное число
Debug PeekS(*Buff, -1, #PB_UTF8)
sprintf(*Buff, "%%+d <0= %+d", u) ; "-43951789" знак указывающий отрицательное число
Debug PeekS(*Buff, -1, #PB_UTF8)

Debug "—————————"

sprintf(*Buff, "%04d-%02d-%02d", 2008, 4, 1) ; дата
Debug PeekS(*Buff, -1, #PB_UTF8)
sprintf(*Buff, "%02d:%02d:%02d", 8, 45, 9) ; время
Debug PeekS(*Buff, -1, #PB_UTF8)
sprintf(*Buff, "%04d-%02d-%02d %02d:%02d:%02d", 2008, 4, 1, 8, 45, 9) ; дата и время
Debug PeekS(*Buff, -1, #PB_UTF8)

Debug "—————————"

; Пример 2
Time$ = "5" ; только цифра от 0 до 9, проще использовать %d

; В многоязычном интерфейсе позволяет вставить переменную в любую позицию.
sprintf(*Buff, "%s minutes passed", Time$)
Debug PeekS(*Buff, -1, #PB_UTF8)
sprintf(*Buff, "прошло %s минут", Time$)
Debug PeekS(*Buff, -1, #PB_UTF8)

Debug "—————————"

n = $F4E6DC
sprintf(*Buff, "%06X", n)
Debug "Число цвет в шестнадцатеричном виде"
Debug PeekS(*Buff, -1, #PB_UTF8)
Debug Hex(n, #PB_Quad)

FreeMemory(*Buff)