webentwicklung-frage-antwort-db.com.de

Welche Swift String-Formatbezeichner werden unterstützt?

In Swift kann ich einen String mit Formatangaben formatieren:

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

Die offizielle Dokumentation enthält jedoch keine Informationen oder Links zu den unterstützten Formatspezifizierern oder zum Erstellen einer Vorlage ähnlich "%.03f": https://developer.Apple.com/documentation/Swift/string/3126742-init

Es heißt nur:

Gibt ein String-Objekt zurück, das unter Verwendung eines angegebenen Formatstrings als Vorlage initialisiert wurde, in das die verbleibenden Argumentwerte eingesetzt werden.

12
Cœur

Die Formatangaben für die String -Formatierung in Swift) sind dieselben wie im Objective-C NSString -Format, selbst identisch mit denen für CFString. formatieren und tief in den Archiven von Apple Documentation) vergraben sind (gleicher Inhalt für beide Seiten, beide ursprünglich aus dem Jahr 2002 oder älter):

Diese Dokumentationsseite selbst ist jedoch unvollständig, beispielsweise die Flags , die Präzisionsspezifizierer und die Breite Spezifizierer werden nicht erwähnt. Tatsächlich behauptet es, IEEE printf-Spezifikationen (Ausgabe 6, Ausgabe 2004) zu befolgen, wobei es sich an der ISO C-Norm orientiert. Diese Bezeichner sollten also mit denen von C printf identisch sein, mit dem Zusatz von %@ Spezifizierer für Objective-C-Objekte und das Hinzufügen des schlecht dokumentierten %D, %U, %O Spezifizierer und q Längenmodifizierer.


Bezeichner

Jede Konvertierungsspezifikation wird durch das Zeichen '%' oder durch die Zeichenfolge "% n $" eingeleitet.

n ist der Index des Parameters, wie in:

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

Formatbezeichner

% @ Objective-C-Objekt, gedruckt als die von descriptionWithLocale zurückgegebene Zeichenfolge: falls verfügbar, oder Beschreibung anderweitig.

Sie können auch einige Swift - Typen verwenden, diese müssen jedoch in der Standardbibliothek definiert werden, um dem CVarArg-Protokoll zu entsprechen, und ich glaube, sie müssen die Überbrückung mit Objective-C-Objekten unterstützen : https://developer.Apple.com/documentation/foundation/object_runtime/classes_bridged_to_Swift_standard_library_value_types .

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

%% '%' Zeichen.

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

% d,% i Vorzeichenbehaftete 32-Bit-Ganzzahl (int).

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

% u,% U,% D 32-Bit-Ganzzahl ohne Vorzeichen (unsigned int).

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

% x 32-Bit-Ganzzahl ohne Vorzeichen (unsigned int), hexadezimal mit den Ziffern 0–9 und den Kleinbuchstaben a – f gedruckt.

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

% X 32-Bit-Ganzzahl ohne Vorzeichen (unsigned int), hexadezimal mit den Ziffern 0–9 und in Großbuchstaben A – F gedruckt.

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

% o,% O Vorzeichenlose 32-Bit-Ganzzahl (unsigned int), in Oktal gedruckt.

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

% f 64-Bit-Gleitkommazahl (doppelt), in Dezimalschreibweise gedruckt. Erzeugt "inf", "infinity" oder "nan".

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

% F 64-Bit-Gleitkommazahl (doppelt), in Dezimalschreibweise gedruckt. Erzeugt "INF", "INFINITY" oder "NAN".

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

% e 64-Bit-Gleitkommazahl (doppelt), in wissenschaftlicher Notation mit einem Kleinbuchstaben e gedruckt, um den Exponenten einzuführen.

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

% E 64-Bit-Gleitkommazahl (doppelt), gedruckt in wissenschaftlicher Notation, wobei ein Großbuchstabe E verwendet wird, um den Exponenten einzuführen.

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

% g 64-Bit-Gleitkommazahl (doppelt), gedruckt im Stil von% e, wenn der Exponent kleiner als –4 oder größer als oder gleich der Genauigkeit ist, ansonsten im Stil von% f.

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

% G 64-Bit-Gleitkommazahl (doppelt), gedruckt im Stil von% E, wenn der Exponent kleiner als –4 oder größer als oder gleich der Genauigkeit ist, ansonsten im Stil von% f.

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

% c 8-Bit-Zeichen ohne Vorzeichen (Zeichen ohne Vorzeichen).

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

% C 16-Bit-UTF-16-Codeeinheit (unichar).

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

% s Null-terminiertes Array von 8-Bit-Zeichen ohne Vorzeichen.

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

% S Null-terminiertes Array von 16-Bit-UTF-16-Codeeinheiten.

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

% p Void-Zeiger (void *), hexadezimal gedruckt mit den Ziffern 0–9 und Kleinbuchstaben a – f, mit einem führenden 0x.

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

% eine 64-Bit-Gleitkommazahl (doppelt), die in wissenschaftlicher Notation mit einem führenden 0x und einer hexadezimalen Stelle vor dem Dezimalpunkt gedruckt wird, wobei der Exponent mit einem Kleinbuchstaben p eingeführt wird.

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

% Eine 64-Bit-Gleitkommazahl (doppelt), die in wissenschaftlicher Notation mit einem führenden 0X und einer hexadezimalen Stelle vor dem Dezimalpunkt gedruckt wird. Dabei wird der Exponent in Großbuchstaben P eingegeben.

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

Flaggen

„Der ganzzahlige Teil des Ergebnisses einer Dezimalumwandlung (% i,% d,% u,% f,% F,% g oder% G) muss mit Tausenden von Gruppierungszeichen formatiert werden. Bei anderen Konvertierungen ist das Verhalten undefiniert. Das nicht monetäre Gruppierungszeichen wird verwendet.

Das ' Flag scheint in Swift 4 nicht unterstützt zu werden

- Das Ergebnis der Umrechnung ist im Feld linksbündig anzugeben. Die Konvertierung ist rechtsbündig, wenn dieses Flag nicht angegeben ist.

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

+ Das Ergebnis einer vorzeichenbehafteten Konvertierung beginnt immer mit einem Vorzeichen ('+' oder '-'). Die Konvertierung darf nur mit einem Vorzeichen beginnen, wenn ein negativer Wert konvertiert wird, wenn dieses Flag nicht angegeben ist.

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

<Leerzeichen> Wenn das erste Zeichen einer signierten Konvertierung kein Zeichen ist oder wenn eine signierte Konvertierung keine Zeichen ergibt, muss dem Ergebnis ein <Leerzeichen> vorangestellt werden. Dies bedeutet, dass, wenn die Flags <Leerzeichen> und '+' angezeigt werden, das Flag <Leerzeichen> ignoriert wird.

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

# Gibt an, dass der Wert in eine alternative Form konvertiert werden soll. Bei o-Konvertierung wird die Genauigkeit erhöht (falls erforderlich), um die erste Ziffer des Ergebnisses auf Null zu setzen. Bei x- oder X-Konvertierungsspezifizierern muss einem Ergebnis ungleich Null 0x (oder 0X) vorangestellt werden. Für die Konvertierungsspezifizierer a, A, e, E, f, F, g und G muss das Ergebnis immer ein Radixzeichen enthalten, auch wenn dem Radixzeichen keine Ziffern folgen. Ohne dieses Flag wird ein Radixzeichen im Ergebnis dieser Konvertierungen nur angezeigt, wenn eine Ziffer darauf folgt. Bei g- und G-Konvertierungsspezifizierern dürfen nachfolgende Nullen nicht wie gewohnt aus dem Ergebnis entfernt werden. Für andere Konvertierungsspezifizierer ist das Verhalten undefiniert.

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

0 Für die Konvertierungsspezifizierer d, i, o, u, x, x, a, a, e, e, f, F, g und G werden führende Nullen (nach Angabe eines Vorzeichens oder einer Basis) zum Auffüllen der Zeichen verwendet Feldbreite; Es wird kein Leerzeichen aufgefüllt. Wenn die beiden Flags '0' und '-' angezeigt werden, wird das Flag '0' ignoriert. Wenn für die Konvertierungsspezifizierer d, i, o, u, x und X eine Genauigkeit angegeben ist, wird das Flag '0' ignoriert. Wenn die beiden Flags '0' und '"angezeigt werden, werden die Gruppierungszeichen vor dem Auffüllen mit Nullen eingefügt. Bei anderen Konvertierungen ist das Verhalten undefiniert.

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

Breitenmodifikatoren

Wenn der konvertierte Wert weniger Bytes als die Feldbreite enthält, wird er standardmäßig links mit Leerzeichen aufgefüllt. Es wird rechts aufgefüllt, wenn die linke Anpassungsmarkierung ('-') der Feldbreite entspricht. Die Feldbreite hat die Form eines Sternchens ('*') oder einer Dezimalzahl.

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

Präzisionsmodifikatoren

Eine optionale Genauigkeit, die die Mindestanzahl von Stellen angibt, die für die Konvertierungsspezifizierer d, i, o, u, x und X angezeigt werden sollen. die Anzahl der Stellen, die nach dem Basiszeichen für die Umrechnungsspezifizierer a, A, e, E, f und F erscheinen sollen; die maximale Anzahl signifikanter Stellen für die Konvertierungsspezifizierer g und G; oder die maximale Anzahl von Bytes, die aus einer Zeichenfolge in den Konvertierungsspezifizierern s und S gedruckt werden sollen. Die Genauigkeit wird durch einen Punkt ('.') Gefolgt von einem Stern ('*') oder einer optionalen Dezimalziffernfolge angegeben, wobei eine Nullziffernfolge als Null behandelt wird. Wenn eine Genauigkeit mit einem anderen Konvertierungsspezifizierer angezeigt wird, ist das Verhalten undefiniert.

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

Längenmodifikatoren

h Längenmodifizierer, der angibt, dass ein nachfolgender Konvertierungsspezifizierer d, o, u, x oder X auf ein kurzes oder vorzeichenloses kurzes Argument angewendet wird.

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

hh Längenmodifizierer, der angibt, dass ein nachfolgender Konvertierungsspezifizierer d, o, u, x oder X auf ein vorzeichenbehaftetes oder vorzeichenloses Zeichenargument angewendet wird.

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

l Längenmodifizierer, der angibt, dass ein nachfolgender Konvertierungsspezifizierer d, o, u, x oder X auf ein langes oder vorzeichenloses langes Argument angewendet wird.

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

ll, q Längenmodifizierer, die angeben, dass ein nachfolgender Konvertierungsspezifizierer d, o, u, x oder X auf ein Long-Long-Argument oder ein Long-Long-Argument ohne Vorzeichen angewendet wird.

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

L Längenmodifizierer, der angibt, dass ein Konvertierungsspezifizierer nach a, A, e, E, f, F, g oder G auf ein langes doppeltes Argument angewendet wird.

Ich konnte kein CLongDouble-Argument an format in Swift 4 übergeben.

z Längenmodifizierer, der angibt, dass ein nachfolgender Konvertierungsspezifizierer d, o, u, x oder X für size_t gilt.

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

t Längenmodifizierer, der angibt, dass ein nachfolgender Konvertierungsspezifizierer d, o, u, x oder X für ptrdiff_t gilt.

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

j Längenmodifizierer, der angibt, dass ein nachfolgender Konvertierungsspezifizierer d, o, u, x oder X auf ein intmax_t- oder uintmax_t-Argument angewendet wird.

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