Спецификации форматирования строк.

Cocoa

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

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

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

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

СпецификаторОписание
%@Objective-C объект, выводится в виде строки, возвращенной descriptionWithLocale: если таковые имеются, или description в противном случае. Также работает с CFTypeRef объектами, возвращая результат CFCopyDescription функции.
%%'%' символ
%d, %D, %i32-разрядное целое число (int)
%u, %UБеззнаковое 32-разрядное целое (unsigned int)
%hiЗнаковое 16-разрядное целое (short)
%huБеззнаковое 16-разрядное целое (unsigned short)
%qiЗнаковое 64-разрядное целое (long long)
%quБеззнаковое 64-разрядное целое (unsigned long long)
%xБеззнаковое 32-разрядное целое число (unsigned int), напечатанное в шестнадцатеричном виде с использованием цифр 0-9 и нижнего регистра от a-f
%XБеззнаковое 32-разрядное целое число (unsigned int), напечатанное в шестнадцатеричном виде с использованием цифр 0-9 и верхнего регистра от A-F
%qxБеззнаковое 64-разрядное целое число (unsigned long long), напечатанное в шестнадцатеричном виде с использованием цифр 0-9 и нижнего регистра от a-f
%qXБеззнаковое 64-разрядное целое число (unsigned long long), напечатанное в шестнадцатеричном виде с использованием цифр 0-9 и верхнего регистра от A-F
%o, %OБеззнаковое 32-разрядное целое число (unsigned int), напечатанное в восьмеричном (octal) виде
%f64-разрядное число с плавающей точкой (double)
%e64-разрядное число с плавающей точкой (double), печатается в экспоненциальном виде с использованием нижнего регистра для e представления экспоненты
%E64-разрядное число с плавающей точкой (double), печатается в экспоненциальном виде с использованием верхнего регистра для E представления экспоненты
%g64-разрядное число с плавающей точкой (double), печатаются в стиле %e, если экспонента меньше -4 или больше или равна точности, иначе в стиле%f
%G64-разрядное число с плавающей точкой (double), печатаются в стиле %E, если экспонента меньше -4 или больше или равна точности, иначе в стиле%f
%c8-битный беззнаковый символ (unsigned char), печатается NSLog () как ASCII-символ, или, если не ASCII символ в восьмеричном формате \\ddd или Unicode шестнадцатеричном формате \\udddd, где d - цифра
%C16-битный Unicode символ (unichar), печатается NSLog () как ASCII-символ, или, если не ASCII символ в восьмеричном формате \\ddd или Unicode шестнадцатеричном формате \\udddd, где d - цифра
%sNull-завершенный массив 8-битных беззнаковых символов. % s. интерпретируется в системе кодирования, вместо, к примеру, UTF-8.
%SNull-завершенный массив 16-битных символов Unicode
%pПустой указатель (void *), напечатанный в шестнадцатеричном виде с цифрами 0-9 и нижнем регистре a-f, с ведущими 0x
%LМодификатор длины уточняющий, что следующий a, A, e, E, f, F, g, или G спецификатор преобразования относится к long double аргументу
%a64-разрядное число с плавающей точкой (double), напечатанное в экспоненциальном представлении с ведущими 0x и одной шестнадцатеричной цифрой перед десятичной точкой с помощью строчной р для отображения экспоненты
%A64-разрядное число с плавающей точкой (double), напечатанное в экспоненциальном представлении с ведущими 0x и одной шестнадцатеричной цифрой перед десятичной точкой с помощью заглавной P для отображения экспоненты
%F64-разрядное число с плавающей точкой (double), печатается в десятичной системе счисления
%zМодификатор длины уточняющий, что следующий d, i, o, u, x, или X спецификатор преобразования относится к size_t или соответствующему типу целого числа аргументу
%tМодификатор длины уточняющий, что следующий d, i, o, u, x, или X спецификатор преобразования относится к ptrdiff_t или соответствующему типу целого числа без знака аргументу
%tМодификатор длины уточняющий, что следующий d, i, o, u, x, или X спецификатор преобразования относится к intmax_t или uintmax_t аргументу

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

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

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

ТипФормат спецификатораСоображения
NSInteger%ld или %lxПриведение значения к long
NSUInteger%lu или %lxПриведение значения к unsigned long
CGFloat%f или %g%f работает для float и double при форматировании, но см. ниже предупреждение при сканировании
CFIndex%ld или %lxТакже как NSInteger
указатель%p добавляет 0x к началу вывода. Если вы не хотите этого, используйте %lx и приведите к long.
long long%lld или %llxlong long является 64-разрядным на 32 - и 64-битных платформах
unsigned long long%llu или %llxunsigned long long является 64-разрядным на 32 - и 64-битных платформах

 

 

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

NSInteger i = 42;

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

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

CGFloat imageWidth;

double tmp;

sscanf (str, "%lf", &tmp);

imageWidth = tmp;

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

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac