Präzision der Zeichenkettenformatierung in Swift: Geheimnisse und Beispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Precision string format specifier in Swift: So steuern Sie die Ausgabepräzision von Zahlen



Hallo, Kollege! Wenn du jemals in Swift eine Zahl mit einer bestimmten Anzahl von Nachkommastellen ausgeben musstest, ist dir sicherlich aufgefallen, dass sich das klassische String(format:) nicht immer offensichtlich verhält. Besonders, wenn du aus der Welt von C oder Objective-C kommst, wo printf die heilige Kuh ist. In diesem Artikel werden wir uns ansehen, wie der precision string format specifier in Swift funktioniert, warum er manchmal „kaputt“ geht und wie man ihn richtig verwendet. Los geht's!



Was ist ein Precision Specifier und wozu braucht man ihn?



Ein Precision Specifier ist ein Teil der Formatzeichenkette, der festlegt, wie viele Nachkommastellen (oder die Gesamtzahl der Stellen) ausgegeben werden sollen. In Swift wird er, wie in C, nach einem Punkt innerhalb des Formatspezifizierers geschrieben. Zum Beispiel bedeutet %.2f „Gib eine Gleitkommazahl mit zwei Nachkommastellen aus“.



Allerdings gibt es eine Nuance: Swift verwendet Core Foundation für die Zeichenkettenformatierung, und dessen Verhalten kann sich von dem unterscheiden, was du von C gewohnt bist. Dies betrifft insbesondere die Arbeit mit Double und Float.



Schauen wir uns gleich ein einfaches Beispiel an, das oft in Fragen auf Stack Overflow vorkommt:



let pi = Double.pilet formatted = String(format: "%.2f", pi)print(formatted) // Gibt aus: "3.14"


Alles funktioniert wie am Schnürchen. Aber sobald wir mit komplexeren Formaten experimentieren, beginnen die Überraschungen.



Die wichtigsten Arten von Precision Specifiern in Swift



In Swift werden die folgenden Spezifizierer unterstützt, die die Präzision beeinflussen:



  • %f — Gleitkommazahl. Precision gibt die Anzahl der Nachkommastellen an.
  • %e — Exponentialschreibweise. Precision gibt die Anzahl der Nachkommastellen an.
  • %g — Wählt zwischen %f und %e basierend auf dem Wert. Precision gibt die Gesamtzahl der signifikanten Stellen an.
  • %d / %i — Ganze Zahlen. Precision gibt die Mindestanzahl der Stellen an (wird links mit Nullen aufgefüllt).
  • %s — Zeichenketten. Precision gibt die maximale Anzahl der auszugebenden Zeichen an.


Das Interessanteste beginnt jedoch, wenn wir versuchen, Precision auf Double oder Float über String(format:) anzuwenden.



Ein häufiges Problem: „Warum funktioniert Precision nicht?“



Eine der häufigsten Beschwerden auf Stack Overflow: „Ich schreibe String(format: "%.2f", myDouble), erhalte aber ein unerwartetes Ergebnis“. Lassen wir ein typisches Szenario durchgehen:



let value: Float = 1.23456789let result = String(format: "%.4f", value)print(result) // Kann je nach Kompilierung "1.2346" oder "1.2345" ausgeben


Warum? Weil Float eine Genauigkeit von etwa 6-7 signifikanten Stellen hat. Wenn du 1.23456789 übergibst, wird er auf 1.234568 (oder so ähnlich) gerundet, bevor er in das Format gelangt. Und die Precision in %.4f wird dann auf diesen gerundeten Wert angewendet.



Um Verwirrung zu vermeiden, verwende für Gleitkommazahlen immer Double, wenn eine hohe Genauigkeit erforderlich ist:



let value: Double = 1.23456789let result = String(format: "%.4f", value)print(result) // Gibt zuverlässig "1.2346" aus


Erweiterte Beispiele: So steuern Sie die Precision dynamisch



Manchmal muss die Precision nicht fest, sondern über eine Variable festgelegt werden. Swift ermöglicht dies auf zwei Arten:



Methode 1: über * (Sternchen)



Im Formatspezifizierer kann * anstelle einer Zahl verwendet werden, und dann wird die Precision aus dem fol

Blogs

Buchempfehlungen