Ich versuche ein BMI-Programm in schneller Sprache zu schreiben. Und ich habe dieses Problem: Wie konvertiere ich einen String in einen Double?
In Objective-C kann ich Folgendes tun:
double myDouble = [myString doubleValue];
Aber wie kann ich das in Swift erreichen?
Antworten:
Swift 4.2+ String to Double
Sie sollten die neuen Typinitialisierer verwenden, um zwischen String- und numerischen Typen (Double, Float, Int) zu konvertieren. Es wird ein optionaler Typ (Double?) Zurückgegeben, der den richtigen Wert oder Null hat, wenn der String keine Zahl war.
Hinweis: Die NSString doubleValue-Eigenschaft wird nicht empfohlen, da sie 0 zurückgibt, wenn der Wert nicht konvertiert werden kann (dh: schlechte Benutzereingaben).
Packen Sie die Werte aus, um sie mit if / let zu verwenden
Mit der
NumberFormatter
Klasse können Sie formatierte Zahlen und Währungen konvertieren .Währungsformate
Lesen Sie mehr in meinem Blog-Beitrag über die Konvertierung von String in Double-Typen (und Währung) .
quelle
Swift 2 Update Es gibt neue fehlgeschlagene Initialisierer, mit denen Sie dies idiomatischer und sicherer tun können (wie viele Antworten festgestellt haben, ist der doppelte Wert von NSString nicht sehr sicher, da er 0 für Nicht-Zahlenwerte zurückgibt. Dies bedeutet, dass die
doubleValue
von"foo"
und"0"
sind das Gleiche.)Dies gibt eine optionale, so in Fällen wie beiläufig ,
"foo"
wodoubleValue
0 zurückgegeben hätte, der failable intializer zurückkehren wirdnil
. Sie können ein verwendenguard
,if-let
odermap
zu handhaben dieOptional<Double>
Originaler Beitrag: Sie müssen den NSString-Konstruktor nicht wie in der akzeptierten Antwort vorgeschlagen verwenden. Sie können es einfach so überbrücken:
quelle
- [NSString doubleValue]
istDouble
in Bezug aufDouble?
(Optional<Double>
) schnell . Dies unterscheidet sich von der Swift String-Funktion,toInt()
die zurückgibtInt?
und in den Dokumenten angibt, dass "... nur Zeichenfolgen akzeptiert werden, die dem regulären Ausdruck" [- +]? [0-9] + "entsprechen.".toInt()
wäre besser. Dies war jedoch eher eine Antwort darauf, wie man genau dasselbe macht, aber in Swift.Double.init?(_ text: String)
jetzt ein fehlgeschlagener Initialisierer verfügbar.Für ein etwas schnelleres Gefühl
NSFormatter()
vermeidet die Verwendung das Umwandeln inNSString
und kehrt zurück,nil
wenn die Zeichenfolge keinenDouble
Wert enthält (z. B. "test" wird nicht zurückgegeben0.0
).Alternativ können Sie den
String
Typ von Swift erweitern :und benutze es wie
toInt()
:Dies gibt eine Option zurück,
Double?
die ausgepackt werden muss.Entweder mit erzwungenem Auspacken:
oder mit einer if let-Anweisung:
Update: Für die Lokalisierung ist es sehr einfach, Gebietsschemas wie folgt auf den NSFormatter anzuwenden:
Schließlich können Sie
NSNumberFormatterCurrencyStyle
den Formatierer verwenden, wenn Sie mit Währungen arbeiten, bei denen die Zeichenfolge das Währungssymbol enthält.quelle
Eine andere Option besteht darin, dies in ein zu konvertieren
NSString
und Folgendes zu verwenden:quelle
(swiftString as NSString).doubleValue
Hier ist eine Erweiterungsmethode, mit der Sie einfach doubleValue () für eine Swift-Zeichenfolge aufrufen und ein Double Back erhalten können (Beispielausgabe steht an erster Stelle)
Hier ist die Erweiterungsmethode:
Keine Fehlerprüfung, aber Sie können es hinzufügen, wenn Sie es brauchen.
quelle
Ab Swift 1.1 können Sie direkt an
String
denconst char *
Parameter übergeben.Wenn Sie nicht veraltet mögen
atof
:Eine Einschränkung: Das Verhalten der Konvertierung unterscheidet sich von
NSString.doubleValue
.atof
undstrtod
akzeptiere0x
vorangestellte Hex-Zeichenfolge:Wenn Sie
.doubleValue
Verhalten bevorzugen , können wir weiterhinCFString
Bridging verwenden:quelle
NSString
.In Swift 2.0 ist es am besten, nicht wie ein Objective-C-Entwickler zu denken. Sie sollten also nicht "einen String in einen Double konvertieren", sondern "einen Double aus einem String initialisieren". Apple-Dokument hier: https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_Double_Structure/index.html#//apple_ref/swift/structctr/Double/s:FSdcFMSdFSSGSqSd_
Es ist eine optionale Init, sodass Sie mit dem Null-Koaleszenz-Operator (??) einen Standardwert festlegen können. Beispiel:
quelle
Double.init?(_ text: String)
werden in Swift 2.0 verfügbar. Sie sollten dies erwähnen. Andere Antworten hier sind nicht, weil die Leute wie Objective-C-Entwickler denken, sondern weil dieser Initialisierer früher nicht verfügbar war.In SWIFT 3 können Sie Folgendes verwenden:
Hinweis: - Wenn eine Zeichenfolge andere Zeichen als numerische Ziffern oder für das Gebietsschema geeignete Gruppen- oder Dezimaltrennzeichen enthält, schlägt die Analyse fehl. - Alle führenden oder nachfolgenden Leerzeichen in einer Zeichenfolge werden ignoriert. Beispielsweise erzeugen die Zeichenfolgen "5", "5" und "5" alle die Nummer 5.
Entnommen aus der Dokumentation: https://developer.apple.com/reference/foundation/numberformatter/1408845-number
quelle
Ich habe die gesuchte Antwort nicht gesehen. Ich poste hier nur meine, falls es jemandem helfen kann. Diese Antwort ist nur gültig , wenn Sie kein bestimmtes Format benötigen .
Swift 3
quelle
Versuche dies:
HINWEIS
In Beta 5 entfernt. Das funktioniert nicht mehr?
quelle
Dies baut auf der Antwort von @Ryu auf
Seine Lösung ist großartig, solange Sie sich in einem Land befinden, in dem Punkte als Trennzeichen verwendet werden. Standardmäßig
NSNumberFormatter
wird das Gebietsschema des Geräts verwendet. Daher schlägt dies in allen Ländern fehl, in denen ein Komma als Standardtrennzeichen verwendet wird (einschließlich Frankreich als @PeterK. Erwähnt), wenn die Zahl Punkte als Trennzeichen verwendet (was normalerweise der Fall ist). Um das Gebietsschema dieses NSNumberFormatter auf US festzulegen und daher Punkte als Trennzeichen zu verwenden, ersetzen Sie die Zeilemit
Daher wird der vollständige Code
Um dies zu nutzen, rufen Sie einfach an
"Your text goes here".toDouble()
Dies gibt eine optionale zurück
Double?
Wie @Ryu erwähnt hat, können Sie entweder das Auspacken erzwingen:
oder verwenden Sie eine
if let
Aussage:quelle
NumberFormatter().number(from: myString)?.doubleValue
SWIFT 4
quelle
Swift 4.0
Versuche dies
quelle
Schnell: 4 und 5
Es gibt möglicherweise zwei Möglichkeiten, dies zu tun:
String -> Int -> Double:
String -> NSString -> Double
Verwenden Sie es, wie Sie möchten, je nach Bedarf des Codes.
quelle
Bitte überprüfen Sie es auf dem Spielplatz!
Übrigens in meinem Xcode
.toDouble () - existiert nicht
.doubleValue erstellt Wert 0.0 aus nicht numerischen Zeichenfolgen ...
quelle
1.
2.
Kann diese Hilfe für Sie sein.
quelle
Wie bereits erwähnt, ist der beste Weg, dies zu erreichen, das direkte Casting:
Darauf aufbauend können Sie eine raffinierte native Swift String-Erweiterung erstellen:
Auf diese Weise können Sie direkt verwenden:
Welches wird das Casting für Sie durchführen. Wenn Apple
doubleValue
der nativen Zeichenfolge eine hinzufügt , müssen Sie nur die Erweiterung entfernen, und der Rest Ihres Codes wird automatisch ordnungsgemäß kompiliert!quelle
SWIFT 3
Heutzutage gibt es eine Standardmethode:
public init?(_ text: String)
derDouble
Klasse.Es kann für alle Klassen verwendet werden.
let c = Double("-1.0")
let f = Double("0x1c.6")
let i = Double("inf")
, etc.quelle
Erweiterung mit optionalem Gebietsschema
Swift 2.2
Swift 3.1
quelle
Oder Sie könnten tun:
quelle
Sie können StringEx verwenden . Es erweitert sich
String
mit Konvertierungen von Zeichenfolgen in Zahlen einschließlichtoDouble()
.Es überprüft die Zeichenfolge und schlägt fehl, wenn sie nicht in double konvertiert werden kann.
Beispiel:
quelle
Swift 4
quelle
Was auch funktioniert:
quelle
Verwenden Sie diesen Code in Swift 2.0
let strWithFloat = "78.65" let floatFromString = Double(strWithFloat)
quelle
Mit
Scanner
in einigen Fällen ist eine sehr bequeme Art und Weise Zahlen der Extraktion aus einem String. Und es ist fast so leistungsfähig wieNumberFormatter
beim Dekodieren und Behandeln verschiedener Zahlenformate und Gebietsschemas. Es kann Zahlen und Währungen mit unterschiedlichen Dezimal- und Gruppentrennzeichen extrahieren.Es gibt jedoch Probleme mit Trennzeichen, die als Worttrennzeichen aufgefasst werden könnten.
Es ist kein Problem, das Gebietsschema automatisch zu erkennen. Beachten Sie, dass groupingSeparator im französischen Gebietsschema in der Zeichenfolge "Mon salaire est 9 999,99 €" kein Leerzeichen ist, obwohl es möglicherweise genau als Leerzeichen gerendert wird (hier nicht). Deshalb funktioniert der folgende Code einwandfrei, ohne dass
!$0.isWhitespace
Zeichen herausgefiltert werden.quelle
Ich finde es besser lesbar, String wie folgt eine Erweiterung hinzuzufügen:
und dann könnten Sie einfach Ihren Code schreiben:
quelle
Mein Problem war Komma, also löse ich es so:
quelle
quelle
Wir können den CDouble-Wert verwenden, der von myString.doubleValue erhalten wird
quelle