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

Эта статья суммирует спецификаторы формата, поддерживаемые строковыми методами форматирования и функциями.

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

Спецификаторы формата, поддерживаемые NSString форматирование методов и функций форматирования CFString следует за IEEE printf спецификация; спецификаторы получены в итоге в Таблице 1. Обратите внимание на то, что можно также использовать “n$” позиционные спецификаторы такой как %1$@ %2$s. Для получения дополнительной информации посмотрите IEEE printf спецификация. Можно также использовать эти спецификаторы формата с NSLog функция.

Табличные 1  Спецификаторы формата, поддерживаемые NSString форматирование методов и функций форматирования CFString

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

Описание

%@

Объект Objective C, распечатанный как строка, возвращенная descriptionWithLocale: при наличии, или description иначе. Также работы с CFTypeRef объекты, возвращая результат CFCopyDescription функция.

%%

'%' символ.

%d, %D

32-разрядное целое число со знаком (int).

%u, %U

32-разрядное целое число без знака (unsigned int).

%x

32-разрядное целое число без знака (unsigned int), распечатанный в шестнадцатеричном использовании цифр 0-9 и нижнего регистра a–f.

%X

32-разрядное целое число без знака (unsigned int), распечатанный в шестнадцатеричном использовании цифр 0-9 и прописного A–F.

%o, %O

32-разрядное целое число без знака (unsigned int), распечатанный в восьмеричном.

%f

64-разрядное число с плавающей точкой (double).

%e

64-разрядное число с плавающей точкой (double), распечатанный в экспоненциальном представлении с помощью нижнего регистра e для представления экспоненты.

%E

64-разрядное число с плавающей точкой (double), распечатанный в экспоненциальном представлении с помощью верхнего регистра E для представления экспоненты.

%g

64-разрядное число с плавающей точкой (double), распечатанный в стиле %e если экспонента - меньше чем-4 или больше, чем или равный точности в стиле %f иначе.

%G

64-разрядное число с плавающей точкой (double), распечатанный в стиле %E если экспонента - меньше чем-4 или больше, чем или равный точности в стиле %f иначе.

%c

8-разрядный символ без знака (unsigned char), распечатанный NSLog() как символ ASCII, или, если не символ ASCII, в восьмеричном формате \\ddd или шестнадцатеричный формат Unicode \\udddd, где d цифра.

%C

16-разрядный символ Unicode (unichar), распечатанный NSLog() как символ ASCII, или, если не символ ASCII, в восьмеричном формате \\ddd или шестнадцатеричный формат Unicode \\udddd, где d цифра.

%s

Завершенный нулем массив 8-разрядных символов без знака. Поскольку %s спецификатор заставляет символы интерпретироваться в кодировании системного значения по умолчанию, результаты могут быть переменными, особенно со справа налево языками. Например, с RTL, %s когда символы не строго направлены, вставляет маркеры направления. Поэтому лучше избегать %s и укажите кодировки явно.

%S

Завершенный нулем массив 16-разрядных символов Unicode.

%p

Недействительный указатель (void *), распечатанный в шестнадцатеричном с цифрами 0-9 и нижним регистром a–f, с продвижением 0x.

%a

64-разрядное число с плавающей точкой (double), распечатанный в экспоненциальном представлении с продвижением 0x и одна шестнадцатеричная цифра перед десятичной точкой с помощью нижнего регистра p представлять экспоненту.

%A

64-разрядное число с плавающей точкой (double), распечатанный в экспоненциальном представлении с продвижением 0X и одна шестнадцатеричная цифра перед десятичной точкой с помощью верхнего регистра P представлять экспоненту.

%F

64-разрядное число с плавающей точкой (double), распечатанный в десятичной записи.

Табличные 2  модификаторы Длины, поддерживаемые NSString форматирование методов и функций форматирования CFString

Модификатор длины

Описание

h

Модификатор длины, указывающий, что следующий d, o, u, x, или X спецификатор преобразования применяется к a short или unsigned short параметр.

hh

Модификатор длины, указывающий, что следующий d, o, u, x, или X спецификатор преобразования применяется к a signed char или unsigned char параметр.

l

Модификатор длины, указывающий, что следующий d, o, u, x, или X спецификатор преобразования применяется к a long или unsigned long параметр.

ll, q

Модификаторы длины, указывающие, что следующий d, o, u, x, или X спецификатор преобразования применяется к a long long или unsigned long long параметр.

L

Модификатор длины, указывающий, что следующий a, A, e, E, f, F, g, или G спецификатор преобразования применяется к a long double параметр.

z

Модификатор длины, указывающий, что следующий d, o, u, x, или X спецификатор преобразования применяется к a size_t или соответствующий аргумент типа целого числа со знаком.

t

Модификатор длины, указывающий, что следующий d, o, u, x, или X спецификатор преобразования применяется к a ptrdiff_t или соответствующий аргумент типа целого без знака.

j

Модификатор длины, указывающий, что следующий d, o, u, x, или X спецификатор преобразования применяется к a intmax_t или uintmax_t параметр.

Зависимости от платформы

OS X использует несколько типов данных —NSInteger, NSUInteger,CGFloat, и CFIndex— обеспечить непротиворечивые средние значения представления значений в 32-и 64-разрядные среды. В 32-разрядной среде, NSInteger и NSUInteger определяются как int и unsigned int, соответственно. В 64-разрядных средах, NSInteger и NSUInteger определяются как long и unsigned long, соответственно. Для предотвращения потребности использовать различные спецификаторы printf-типа-стиля в зависимости от платформы можно использовать спецификаторы, показанные в Таблице 3. Обратите внимание на то, что в некоторых случаях Вам, вероятно, придется бросить значение.

Табличные 3  Спецификаторы формата для типов данных

Ввести

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

Соображения

NSInteger

%ld или %lx

Бросьте значение к long.

NSUInteger

%lu или %lx

Бросьте значение к unsigned long.

CGFloat

%f или %g

%f работы для плаваний и удваиваются при форматировании; но отметьте метод, описанный ниже для сканирования.

CFIndex

%ld или %lx

То же как NSInteger.

указатель

%p или %zx

%p добавляет 0x к началу вывода. Если Вы не хотите это, использовать %zx и никакое преобразование типа.

Следующий пример иллюстрирует использование %ld отформатировать NSInteger и использование броска.

NSInteger i = 42;
printf("%ld\n", (long)i);

В дополнение к соображениям, упомянутым в Таблице 3, существует один дополнительный случай со сканированием: необходимо отличить типы для float и double. Необходимо использовать %f для плавания, %lf для дважды. Если необходимо использовать scanf (или вариант этого) с CGFloat, переключатель к double вместо этого, и копия double к CGFloat.

CGFloat imageWidth;
double tmp;
sscanf (str, "%lf", &tmp);
imageWidth = tmp;

Важно помнить это %lf не представляет CGFloat правильно или на 32-или на 64-разрядные платформы. Это в отличие от этого %ld, который работает на long во всех случаях.