Каковы поддерживаемые спецификаторы формата Swift String? - PullRequest
0 голосов
/ 14 сентября 2018

В Swift я могу отформатировать строку со спецификаторами формата:

// This will return "0.120"
String(format: "%.03f", 0.12)

Но официальная документация не дает никакой информации или ссылки относительно поддерживаемых спецификаторов формата или того, как создать шаблон, подобный "%.03f": https://developer.apple.com/documentation/swift/string/3126742-init

Это только говорит:

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

1 Ответ

0 голосов
/ 14 сентября 2018

Спецификаторы формата для String форматирования в Swift такие же, как и в формате Objective-C NSString, они идентичны спецификациям для формата CFString и находятся глубоко в архивах документации Apple (такой же контент для обе страницы, оба с 2002 года и старше):

Но сама эта страница документации не является полной, например, flags , спецификаторы precision и спецификаторы width не упоминаются. Фактически, он заявляет, что он соответствует спецификациям printf IEEE (выпуск 6, выпуск 2004 г.) , самому в соответствии со стандартом ISO C. Таким образом, эти спецификаторы должны быть идентичны тому, что мы имеем в C printf, с добавлением спецификатора %@ для объектов Objective-C и добавлением плохо документированных спецификаторов %D, %U, %O и q модификатор длины.


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

Каждая спецификация преобразования вводится символом «%» или последовательностью символов «% n $».

n - индекс параметра, например:

String(format: "%2$@ %1$@", "world", "Hello")

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

% @ Объект Objective C, напечатанный как строка, возвращенная descriptionWithLocale: если доступно, или описание иначе.

На самом деле вы также можете использовать некоторые типы Swift, но они должны быть определены внутри стандартной библиотеки, чтобы соответствовать протоколу CVarArg, и я считаю, что они должны поддерживать мост к объектам Objective-C: https://developer.apple.com/documentation/foundation/object_runtime/classes_bridged_to_swift_standard_library_value_types.

String(format: "%@", ["Hello", "world"])

%% '%' символ.

String(format: "100%% %@", true.description)

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

String(format: "from %d to %d", Int32.min, Int32.max)

% u,% U,% D 32-разрядное целое число без знака (целое число без знака).

String(format: "from %u to %u", UInt32.min, UInt32.max)

% x 32-разрядное целое число без знака (целое число без знака), напечатанное в шестнадцатеричном формате с использованием цифр 0–9 и строчных букв a – f.

String(format: "from %x to %x", UInt32.min, UInt32.max)

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

String(format: "from %X to %X", UInt32.min, UInt32.max)

% o,% O 32-разрядное целое число без знака (целое число без знака), напечатанное в восьмеричном виде.

String(format: "from %o to %o", UInt32.min, UInt32.max)

% f 64-разрядное число с плавающей точкой (двойное), напечатанное в десятичной записи. Производит "inf", "infinity" или "nan".

String(format: "from %f to %f", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

% F 64-разрядное число с плавающей запятой (двойное), напечатанное в десятичной записи. Производит "INF", "INFINITY" или "NAN".

String(format: "from %F to %F", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

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

String(format: "from %e to %e", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

% E 64-битное число с плавающей точкой (двойное), напечатанное в научной записи с использованием заглавной буквы E для введения показателя степени.

String(format: "from %E to %E", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

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

String(format: "from %g to %g", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

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

String(format: "from %G to %G", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

% c 8-битный символ без знака (без знака).

String(format: "from %c to %c", "a".utf8.first!, "z".utf8.first!)

% C 16-битный код UTF-16 (unichar).

String(format: "from %C to %C", "爱".utf16.first!, "终".utf16.first!)

% s Терминал с нулевым символом в конце 8-битных беззнаковых символов.

"Hello world".withCString {
    String(format: "%s", $0)
}

% S Массив с нулевым символом в конце 16-битных кодовых единиц UTF-16.

"Hello world".withCString(encodedAs: UTF16.self) {
    String(format: "%S", $0)
}

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

var hello = "world"
withUnsafePointer(to: &hello) {
    String(format: "%p", $0)
}

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

String(format: "from %a to %a", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

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

'Целочисленная часть результата десятичного преобразования (% i,% d,% u,% f,% F,% g или% G) должна быть отформатирована с тысячами группирующих символов.Для других преобразований поведение не определено.Используется неденежный символ группировки.

Флаг ' в Swift кажется не поддерживается 4

-Результат преобразования должен быть выровнен по левому краю поля.Преобразование выполняется по правому краю, если этот флаг не указан.

String(format: "from %-12f to %-12d.", Double.leastNonzeroMagnitude, Int32.max)

+ Результат преобразования со знаком всегда должен начинаться со знака ('+' или '-'),Преобразование должно начинаться со знака только тогда, когда отрицательное значение преобразуется, если этот флаг не указан.

String(format: "from %+f to %+d", Double.leastNonzeroMagnitude, Int32.max)

Если первый символ преобразования со знаком не являетсязнак или если в результате преобразования со знаком нет символов, к результату должен быть добавлен .Это означает, что если оба флага и '+' появляются, флаг должен игнорироваться.

String(format: "from % d to % d.", Int32.min, Int32.max)

# Указывает, что значение должно быть преобразовано вальтернативная форма.Для преобразования o это увеличивает точность (если необходимо), чтобы первая цифра результата была равна нулю.Для спецификаторов преобразования x или X ненулевой результат должен иметь префикс 0x (или 0X).Для спецификаторов преобразования a, A, e, E, f, F, g и G результат всегда должен содержать символ радиуса, даже если никакие цифры не следуют за символом радиуса.Без этого флага символ радикса появляется в результате этих преобразований, только если за ним следует цифра.Для спецификаторов преобразования g и G конечные нули не должны быть удалены из результата, как обычно.Для других спецификаторов преобразования поведение не определено.

String(format: "from %#a to %#x.", Double.leastNonzeroMagnitude, UInt32.max)

0 Для d, i, o, u, x, X, a, A, e, E, f, Fспецификаторы преобразования g и G, ведущие нули (после любого указания знака или основания) используются для дополнения ширины поля;пробел не выполняется.Если оба флага '0' и '-' появляются, флаг '0' игнорируется.Для спецификаторов преобразования d, i, o, u, x и X, если указана точность, флаг '0' игнорируется.Если оба флага '0' и '' появляются, символы группировки вставляются перед заполнением нулями. Для других преобразований поведение не определено.

String(format: "from %012f to %012d.", Double.leastNonzeroMagnitude, Int32.max)

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

Если преобразованное значение имеет меньше байтов, чем ширина поля, оно должно быть дополнено пробелами по умолчанию слева, оно должно быть дополнено справа, если в поле задан флаг регулировки слева ('-')ширина. Ширина поля принимает форму звездочки ('*') или десятичного целого числа.

String(format: "from %12f to %*d.", Double.leastNonzeroMagnitude, 12, Int32.max)

Прецизионные модификаторы

Дополнительная точность, которая даетминимальное количество цифр, которое должно отображаться для спецификаторов преобразования d, i, o, u, x и X; количество цифр, которое должно появляться после радикального символа для спецификаторов преобразования a, A, e, E, f и F;максимальное количество значащих цифр для спецификаторов преобразования g и G или максимальное число байтов, которые будут напечатаны из строки в спецификаторах преобразования s и S. Точность принимает форму of точка ('.'), за которой следует либо звездочка ('*'), либо необязательная строка десятичных цифр, где строка с нулевыми цифрами рассматривается как ноль.Если точность появляется с любым другим спецификатором преобразования, поведение не определено.

String(format: "from %.12f to %.*d.", Double.leastNonzeroMagnitude, 12, Int32.max)

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

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

String(format: "from %hd to %hu", CShort.min, CUnsignedShort.max)

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

String(format: "from %hhd to %hhu", CChar.min, CUnsignedChar.max)

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

String(format: "from %ld to %lu", CLong.min, CUnsignedLong.max)

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

String(format: "from %lld to %llu", CLongLong.min, CUnsignedLongLong.max)

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

Мне не удалось передать аргумент CLongDouble в format в Swift 4

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

String(format: "from %zd to %zu", size_t.min, size_t.max)

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

String(format: "from %td to %tu", ptrdiff_t.min, ptrdiff_t.max)

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

String(format: "from %jd to %ju", intmax_t.min, uintmax_t.max)
...