web-dev-qa-db-fra.com

Quels sont les spécificateurs de format de chaîne pris en charge Swift?

Dans Swift, je peux formater une chaîne avec des spécificateurs de format:

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

Mais la documentation officielle ne donne aucune information ni aucun lien concernant les spécificateurs de format pris en charge ou comment créer un modèle similaire à "%.03f": https://developer.Apple.com/documentation/Swift/string/3126742-init

Il dit seulement:

Renvoie un objet String initialisé en utilisant une chaîne de format donnée comme modèle dans lequel les valeurs d'argument restantes sont substituées.

12
Cœur

Les spécificateurs de format pour la mise en forme String en Swift sont les mêmes que ceux en format Objective-C NSString, eux-mêmes identiques à ceux de CFString format et sont enterrés profondément dans les archives de Apple Documentation (même contenu pour les deux pages, à la fois à partir de l'année 2002 ou plus ancienne):

Mais cette page de documentation elle-même est incomplète, par exemple les spécificateurs flags, precision et les spécificateurs width ne sont pas mentionné. En fait, il prétend suivre spécifications IEEE printf (numéro 6, édition 2004) , lui-même aligné sur la norme ISO C. Ces spécificateurs doivent donc être identiques à ceux que nous avons avec C printf, avec l'ajout du spécificateur %@ Pour les objets Objective-C et l'ajout du %D Mal documenté , %U, %O Spécificateurs et q modificateur de longueur.


Prescripteurs

Chaque spécification de conversion est introduite par le caractère '%' ou par la séquence de caractères "% n $".

n est l'index du paramètre, comme dans:

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

Spécificateurs de format

Objet% @ Objective-C, imprimé comme la chaîne renvoyée par descriptionWithLocale: si disponible, ou description sinon.

En fait, vous pouvez également utiliser certains types Swift, mais ils doivent être définis dans la bibliothèque standard afin de se conformer au protocole CVarArg, et je pense qu'ils doivent prendre en charge le pontage vers les objets Objective-C : https://developer.Apple.com/documentation/foundation/object_runtime/classes_bridged_to_Swift_standard_library_value_types .

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

%% '%' personnage.

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

% d,% i Entier 32 bits signé (int).

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

% u,% U,% D Entier non signé 32 bits (entier non signé).

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

% x Entier non signé 32 bits (entier non signé), imprimé en hexadécimal en utilisant les chiffres 0–9 et les minuscules a – f.

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

% X Entier non signé 32 bits (entier non signé), imprimé en hexadécimal en utilisant les chiffres 0–9 et les majuscules A – F.

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

% o,% O Entier non signé 32 bits (entier non signé), imprimé en octal.

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

% f Nombre à virgule flottante 64 bits (double), imprimé en notation décimale. Produit "inf", "infinity" ou "nan".

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

% F Nombre à virgule flottante 64 bits (double), imprimé en notation décimale. Produit "INF", "INFINITY" ou "NAN".

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

% e Nombre à virgule flottante 64 bits (double), imprimé en notation scientifique en utilisant un e minuscule pour introduire l'exposant.

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

% E Nombre à virgule flottante 64 bits (double), imprimé en notation scientifique en utilisant un E majuscule pour introduire l'exposant.

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

% g Nombre à virgule flottante 64 bits (double), imprimé dans le style de% e si l'exposant est inférieur à –4 ou supérieur ou égal à la précision, dans le style de% f sinon.

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

% G Nombre à virgule flottante 64 bits (double), imprimé dans le style de% E si l'exposant est inférieur à –4 ou supérieur ou égal à la précision, dans le style de% f sinon.

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

% c Caractère non signé 8 bits (caractère non signé).

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

% C Unité de code UTF-16 16 bits (unichar).

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

% s Tableau terminé par des caractères non signés 8 bits.

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

% S Tableau à terminaison nulle d'unités de code UTF-16 16 bits.

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

% p Pointeur vide (void *), imprimé en hexadécimal avec les chiffres 0–9 et minuscule a – f, avec un 0x en tête.

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

% un nombre à virgule flottante 64 bits (double), imprimé en notation scientifique avec un 0x de tête et un chiffre hexadécimal avant la virgule décimale à l'aide d'un p minuscule pour introduire l'exposant.

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

% Un nombre à virgule flottante de 64 bits (double), imprimé en notation scientifique avec un 0X en tête et un chiffre hexadécimal avant la virgule décimale en utilisant un P majuscule pour introduire l'exposant.

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

Drapeaux

"La partie entière du résultat d'une conversion décimale (% i,% d,% u,% f,% F,% g ou% G) doit être formatée avec des milliers de caractères de regroupement. Pour les autres conversions, le comportement n'est pas défini. Le caractère de regroupement non monétaire est utilisé.

Le drapeau ' Ne semble pas pris en charge dans Swift 4

- Le résultat de la conversion doit être justifié à gauche dans le champ. La conversion est justifiée à droite si cet indicateur n'est pas spécifié.

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

+ Le résultat d'une conversion signée doit toujours commencer par un signe ('+' ou '-'). La conversion ne commence par un signe que lorsqu'une valeur négative est convertie si ce fanion n'est pas spécifié.

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

<espace> Si le premier caractère d'une conversion signée n'est pas un signe ou si une conversion signée ne donne aucun caractère, un <espace> doit être préfixé au résultat. Cela signifie que si les drapeaux <space> et '+' apparaissent tous les deux, le drapeau <space> doit être ignoré.

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

# Spécifie que la valeur doit être convertie en un autre formulaire. Pour la conversion o, il augmente la précision (si nécessaire) pour forcer le premier chiffre du résultat à zéro. Pour les spécificateurs de conversion x ou X, un résultat non nul doit avoir le préfixe 0x (ou 0X). Pour les spécificateurs de conversion a, A, e, E, f, F, g et G, le résultat doit toujours contenir un caractère radix, même si aucun chiffre ne suit le caractère radix. Sans cet indicateur, un caractère radical n'apparaît dans le résultat de ces conversions que si un chiffre le suit. Pour les spécificateurs de conversion g et G, les zéros de fin ne doivent pas être supprimés du résultat comme ils le sont normalement. Pour les autres spécificateurs de conversion, le comportement n'est pas défini.

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

0 Pour les spécificateurs de conversion d, i, o, u, x, X, a, A, e, E, f, F, g et G, les zéros de tête (après toute indication de signe ou de base) sont utilisés pour remplir largeur de champ; aucun remplissage d'espace n'est effectué. Si les drapeaux "0" et "-" apparaissent tous les deux, le drapeau "0" est ignoré. Pour les spécificateurs de conversion d, i, o, u, x et X, si une précision est spécifiée, l'indicateur "0" est ignoré. Si les indicateurs "0" et "" apparaissent tous les deux, les caractères de regroupement sont insérés avant le remplissage nul. Pour les autres conversions, le comportement n'est pas défini.

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

Modificateurs de largeur

Si la valeur convertie a moins d'octets que la largeur du champ, elle doit être complétée par des espaces par défaut à gauche; il doit être rembourré à droite si l'indicateur de réglage à gauche ("-") est attribué à la largeur du champ. La largeur du champ prend la forme d'un astérisque ('*') ou d'un entier décimal.

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

Modificateurs de précision

Une précision facultative qui donne le nombre minimum de chiffres à afficher pour les spécificateurs de conversion d, i, o, u, x et X; le nombre de chiffres devant apparaître après le caractère de base pour les spécificateurs de conversion a, A, e, E, f et F; le nombre maximal de chiffres significatifs pour les spécificateurs de conversion g et G; ou le nombre maximal d'octets à imprimer à partir d'une chaîne dans les spécificateurs de conversion s et S. La précision prend la forme d'un point ('.') Suivi d'un astérisque ('*') ou d'une chaîne de chiffres décimaux facultative, où une chaîne de chiffres nuls est traitée comme zéro. Si une précision apparaît avec tout autre spécificateur de conversion, le comportement n'est pas défini.

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

Modificateurs de longueur

h Modificateur de longueur spécifiant qu'un spécificateur de conversion d, o, u, x ou X suivant s'applique à un argument court court ou non signé.

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

hh Modificateur de longueur spécifiant qu'un spécificateur de conversion d, o, u, x ou X suivant s'applique à un argument de caractère signé ou de caractère non signé.

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

l Modificateur de longueur spécifiant qu'un spécificateur de conversion d, o, u, x ou X suivant s'applique à un argument long ou non signé long.

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

ll, q Modificateurs de longueur spécifiant qu'un spécificateur de conversion d, o, u, x ou X suivant s'applique à un argument long long ou long long non signé.

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

L Modificateur de longueur spécifiant qu'un spécificateur de conversion a, A, e, E, f, F, g ou G suivant s'applique à un long argument double.

Je n'ai pas pu passer d'argument CLongDouble à format dans Swift 4

modificateur de longueur z spécifiant qu'un spécificateur de conversion d, o, u, x ou X suivant s'applique à un size_t.

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

t Modificateur de longueur spécifiant qu'un spécificateur de conversion d, o, u, x ou X suivant s'applique à ptrdiff_t.

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

j Modificateur de longueur spécifiant qu'un spécificateur de conversion d, o, u, x ou X suivant s'applique à un argument intmax_t ou uintmax_t.

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