Spec-Zone.ru › Ruby 3.2

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

Несколько основных классов Ruby имеют метод экземпляра printf или sprintf:

  • ARGF#printf

  • IO#printf

  • Kernel#printf

  • Kernel#sprintf

Каждый из этих методов принимает:

  • Аргумент format_string, который содержит ноль или более встроенных спецификаций формата (см. ниже).

  • Аргументы *arguments, которые представляют собой ноль или более объектов, подлежащих форматированию.

Каждый из этих методов печатает или возвращает строку, полученную в результате замены каждой спецификации формата, встроенной в format_string , строковой формой соответствующего аргумента среди arguments.

Простой пример:

sprintf('Name: %s; value: %d', 'Foo', 0) # => "Name: Foo; value: 0"

Спецификация формата имеет вид:

%[flags][width][.precision]type

Она состоит из:

  • Ведущего символа процента.

  • Нуля или более флагов (каждый – это символ).

  • Необязательного спецификатора ширины (целое число).

  • Необязательного спецификатора точности (точка, за которой следует неотрицательное целое число).

  • Спецификатора типа (символ).

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

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

В этом разделе приводится краткое объяснение каждого спецификатора типа. Ссылки ведут к подробному описанию и примерам.

Целочисленные спецификаторы типа

  • b или B: Форматирование argument как двоичного целого числа. См. Спецификаторы b и B.

  • d, i, или u (все идентичны): Форматирование argument как десятичного целого числа. См. Спецификатор d.

  • o: Форматирование argument как восьмеричного целого числа. См. Спецификатор o.

  • x или X: Форматирование argument как шестнадцатеричного целого числа. См. Спецификаторы x и X.

Спецификаторы типа с плавающей точкой

  • a или A: Форматирование argument как шестнадцатеричного числа с плавающей точкой. См. Спецификаторы a и A.

  • e или E: Форматирование argument в экспоненциальной форме. См. Спецификаторы e и E.

  • f: Форматирование argument как десятичного числа с плавающей точкой. См. Спецификатор f.

  • g или G: Форматирование argument в «общем» формате. См. Спецификаторы g и G.

Другие спецификаторы типа

  • c: Форматирование argument как символа. См. Спецификатор c.

  • p: Форматирование argument как строки через argument.inspect. См. Спецификатор p.

  • s: Форматирование argument как строки через argument.to_s. См. Спецификатор s.

  • %: Форматирование argument ('%') как одиночного символа процента. См. Спецификатор %.

Флаги

Влияние флага может значительно варьироваться в зависимости от спецификатора типа. Эти замечания носят общий характер. См. подробности, относящиеся к типу.

Несколько флагов могут быть заданы с одним спецификатором типа; порядок не имеет значения.

Флаг «-»

Вставка пробела перед неотрицательным числом:

sprintf('%d', 10)  # => "10"
sprintf('% d', 10) # => " 10"

Вставка знака минус для отрицательного значения:

sprintf('%d', -10)  # => "-10"
sprintf('% d', -10) # => "-10"

Флаг «#»

Использование альтернативного формата; варьируется в зависимости от типов:

sprintf('%x', 100)  # => "64"
sprintf('%#x', 100) # => "0x64"

Флаг «+»

Добавление ведущего знака плюс для неотрицательного числа:

sprintf('%x', 100)  # => "64"
sprintf('%+x', 100) # => "+64"

Флаг «-»

Выравнивание значения влево в его поле:

sprintf('%6d', 100)  # => "   100"
sprintf('%-6d', 100) # => "100   "

Флаг «0»

Заполнение слева нулями вместо пробелов:

sprintf('%6d', 100)  # => "   100"
sprintf('%06d', 100) # => "000100"

Флаг «*»

Использование следующего аргумента в качестве ширины поля:

sprintf('%d', 20, 14)  # => "20"
sprintf('%*d', 20, 14) # => "                  14"

Флаг «n»

Форматирование (аргумента с индексом 1) n-го аргумента в этом поле:

sprintf("%s %s", 'world', 'hello')     # => "world hello"
sprintf("%2$s %1$s", 'world', 'hello') # => "hello world"

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

В общем случае, спецификатор ширины определяет минимальную ширину (в символах) форматированного поля:

sprintf('%10d', 100)  # => "       100"

# Left-justify if negative.
sprintf('%-10d', 100) # => "100       "

# Ignore if too small.
sprintf('%1d', 100)   # => "100"

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

Спецификатор точности – это десятичная точка, за которой следуют ноль или более десятичных цифр.

Для целочисленных спецификаторов типа точность задает минимальное количество цифр, подлежащих записи. Если точность короче, чем целое число, результат дополняется ведущими нулями. При этом нет модификации или усечения результата, если целое число длиннее точности:

sprintf('%.3d', 1)    # => "001"
sprintf('%.3d', 1000) # => "1000"

# If the precision is 0 and the value is 0, nothing is written
sprintf('%.d', 0)  # => ""
sprintf('%.0d', 0) # => ""

Для спецификаторов a/A, e/E, f/F точность задает количество цифр после десятичной точки, подлежащих записи:

sprintf('%.2f', 3.14159)  # => "3.14"
sprintf('%.10f', 3.14159) # => "3.1415900000"

# With no precision specifier, defaults to 6-digit precision.
sprintf('%f', 3.14159)    # => "3.141590"

Для спецификаторов g/G точность задает количество значащих цифр, подлежащих записи:

sprintf('%.2g', 123.45)  # => "1.2e+02"
sprintf('%.3g', 123.45)  # => "123"
sprintf('%.10g', 123.45) # =>  "123.45"

# With no precision specifier, defaults to 6 significant digits.
sprintf('%g', 123.456789) # => "123.457"

Для спецификаторов s, p точность задает количество символов, подлежащих записи:

sprintf('%s', Time.now)    # => "2022-05-04 11:59:16 -0400"
sprintf('%.10s', Time.now) # => "2022-05-04"

Подробное описание спецификатора типа и примеры

Спецификаторы a и A

Форматирование argument как шестнадцатеричного числа с плавающей точкой:

sprintf('%a', 3.14159)   # => "0x1.921f9f01b866ep+1"
sprintf('%a', -3.14159)  # => "-0x1.921f9f01b866ep+1"
sprintf('%a', 4096)      # => "0x1p+12"
sprintf('%a', -4096)     # => "-0x1p+12"

# Capital 'A' means that alphabetical characters are printed in upper case.
sprintf('%A', 4096)      # => "0X1P+12"
sprintf('%A', -4096)     # => "-0X1P+12"

Спецификаторы b и B

Два спецификатора b и B ведут себя одинаково, за исключением случая использования флага '#'+.

Форматирование argument как двоичного целого числа:

sprintf('%b', 1)  # => "1"
sprintf('%b', 4)  # => "100"

# Prefix '..' for negative value.
sprintf('%b', -4) # => "..100"

# Alternate format.
sprintf('%#b', 4)  # => "0b100"
sprintf('%#B', 4)  # => "0B100"

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

Форматирование argument как отдельного символа:

sprintf('%c', 'A') # => "A"
sprintf('%c', 65)  # => "A"

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

Форматирование argument как десятичного целого числа:

sprintf('%d', 100)  # => "100"
sprintf('%d', -100) # => "-100"

Флаг '#' не применяется.

Спецификаторы e и E

Форматирование argument в экспоненциальной форме:

sprintf('%e', 3.14159)  # => "3.141590e+00"
sprintf('%E', -3.14159) # => "-3.141590E+00"

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

Форматирование argument как числа с плавающей точкой:

sprintf('%f', 3.14159)  # => "3.141590"
sprintf('%f', -3.14159) # => "-3.141590"

Флаг '#' не применяется.

Спецификаторы g и G

Форматирование argument в экспоненциальной форме (спецификатор e/E) если показатель степени меньше -4 или больше или равен точности. В противном случае форматирование argument в формате с плавающей точкой (спецификатор f):

sprintf('%g', 100)  # => "100"
sprintf('%g', 100.0)  # => "100"
sprintf('%g', 3.14159)  # => "3.14159"
sprintf('%g', 100000000000)  # => "1e+11"
sprintf('%g', 0.000000000001)  # => "1e-12"

# Capital 'G' means use capital 'E'.
sprintf('%G', 100000000000)  # => "1E+11"
sprintf('%G', 0.000000000001)  # => "1E-12"

# Alternate format.
sprintf('%#g', 100000000000)  # => "1.00000e+11"
sprintf('%#g', 0.000000000001)  # => "1.00000e-12"
sprintf('%#G', 100000000000)  # => "1.00000E+11"
sprintf('%#G', 0.000000000001)  # => "1.00000E-12"

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

Форматирование argument как восьмеричного целого числа. Если argument отрицательно, оно будет отформатировано как дополнение до двух, с префиксом ..7:

sprintf('%o', 16)   # => "20"

# Prefix '..7' for negative value.
sprintf('%o', -16)  # => "..760"

# Prefix zero for alternate format if positive.
sprintf('%#o', 16)  # => "020"
sprintf('%#o', -16) # => "..760"

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

Форматирование argument как строки через argument.inspect:

t = Time.now
sprintf('%p', t)   # => "2022-05-01 13:42:07.1645683 -0500"

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

Форматирование argument как строки через argument.to_s:

t = Time.now
sprintf('%s', t) # => "2022-05-01 13:42:07 -0500"

Флаг '#' не применяется.

Спецификаторы x и X

Форматирование argument как шестнадцатеричного целого числа. Если argument отрицательно, оно будет отформатировано как дополнение до двух, с префиксом ..f:

sprintf('%x', 100)   # => "64"

# Prefix '..f' for negative value.
sprintf('%x', -100)  # => "..f9c"

# Use alternate format.
sprintf('%#x', 100)  # => "0x64"

# Alternate format for negative value.
sprintf('%#x', -100) # => "0x..f9c"

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

Форматирование argument ('%') как одиночного символа процента:

sprintf('%d %%', 100) # => "100 %"

Флаги не применяются.

Ссылка по имени

Для более сложного форматирования Ruby поддерживает ссылку по имени. Стиль %<name> использует стиль форматирования, а %{name} — нет.

Примеры:

sprintf("%<foo>d : %<bar>f", { :foo => 1, :bar => 2 }) # => 1 : 2.000000
sprintf("%{foo}f", { :foo => 1 })                      # => "1f"

Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API