Wie erstelle ich einen String mit Format?


187

Ich muss eine Zeichenfolge mit Format erstellen, die int-, long-, double- usw. Typen in Zeichenfolgen konvertieren kann. Mit Obj-C kann ich es über den folgenden Weg tun.

NSString *str = [NSString stringWithFormat:@"%d , %f, %ld, %@", INT_VALUE, FLOAT_VALUE, DOUBLE_VALUE, STRING_VALUE];

Wie mache ich das mit Swift?

Antworten:


385

Ich denke, das könnte dir helfen:

let timeNow = time(nil)
let aStr = String(format: "%@%x", "timeNow in hex: ", timeNow)
print(aStr)

Beispielergebnis:

timeNow in hex: 5cdc9c8d

1
Gute Antwort! Dies ist absolut der richtige Weg. Beachten Sie für andere, dass die Klassenmethode "stringWithFormat" in einen Init-Aufruf für die Klasse konvertiert wird, wobei "WithFormat" in ein benanntes erstes Argument von "format:" umgewandelt wird. Die ursprüngliche Frage fügte keine spezifische Formatierung hinzu, wie das Ändern der Anzahl der anzuzeigenden Gleitkomma-Dezimalstellen. Wenn dies der Fall wäre, wäre Ihre die einzige Antwort!
David H

4
Würden Sie auf die Dokumentation verlinken? Ich habe Probleme, es aufzuspüren.
Dumbledad

3
Diese Methode kommt aus NSStringim FoundationRahmen . Sie müssen import Foundationdies also sicherstellen, damit es richtig funktioniert. Andernfalls wird der Ausdruck aufgerufen String.init<T>(T)und erzeugt so etwas wie "(\"%@%x %x\", 10)"anstelle von.
Eonil

1
@realityone was bedeuten %@%xSymbole? Können Sie mich auf eine Ressource verweisen, in der ich mehr darüber erfahren kann?
bibscy


89

nichts Besonderes

let str = NSString(format:"%d , %f, %ld, %@", INT_VALUE, FLOAT_VALUE, LONG_VALUE, STRING_VALUE)

49
let str = "\(INT_VALUE), \(FLOAT_VALUE), \(DOUBLE_VALUE), \(STRING_VALUE)"

Update: Ich habe diese Antwort geschrieben, bevor Swift String(format:)die API hinzugefügt hat. Verwenden Sie die in der oberen Antwort angegebene Methode .


6
Ich glaube nicht, dass dies die Frage tatsächlich beantwortet, da es keine Formatierung gibt. Mit dieser Methode können Sie nicht formatieren, wie viele Dezimalstellen in Ihren Gleitkommazahlen enthalten sein sollen. Verwenden String(format:arguments:)wäre besser geeignet, um Formatierungen hinzuzufügen
Chris

4
Das OP hat keine Formatierung angefordert, sondern nur eine Möglichkeit , eine Zeichenfolge mit Format zu erstellen, mit der int-, long-, double- usw. Typen in Zeichenfolgen konvertiert werden können .
John Estropia

Die Frage ist dann unklar. Weil er vergleicht, was er will, -stringWithFormat:was Formatierung ermöglicht. In Swift String(format:arguments:)wäre die Swift-Version von Obj-C's-stringWithFormat:
Chris

Überprüfen Sie das Datum der Frage. Dies war während der ersten Version von Swift, als die NSStringMethoden in Swift noch nicht implementiert waren String.
John Estropia

Ich stehe korrigiert. Es ist immer noch gut, den neueren Weg für alle sichtbar zu machen, die in Zukunft das gleiche Problem suchen
Chris

42

Nicht NSStringerforderlich!

String(format: "Value: %3.2f\tResult: %3.2f", arguments: [2.7, 99.8])

oder

String(format:"Value: %3.2f\tResult: %3.2f", 2.7, 99.8)

15

Ich würde das beides argumentieren

let str = String(format:"%d, %f, %ld", INT_VALUE, FLOAT_VALUE, DOUBLE_VALUE)

und

let str = "\(INT_VALUE), \(FLOAT_VALUE), \(DOUBLE_VALUE)"

sind beide akzeptabel, da der Benutzer nach der Formatierung gefragt hat und beide Fälle zu den Anforderungen passen:

Ich muss eine Zeichenfolge mit Format erstellen, die int-, long-, double- usw. Typen in Zeichenfolgen konvertieren kann.

Ersteres ermöglicht natürlich eine feinere Kontrolle über die Formatierung als Letzteres, aber das bedeutet nicht, dass Letzteres keine akzeptable Antwort ist.


5
var str = "\(INT_VALUE) , \(FLOAT_VALUE) , \(DOUBLE_VALUE), \(STRING_VALUE)"

5

Lesen Sie zuerst die offizielle Dokumentation für die Swift-Sprache.

Antwort sollte sein

var str = "\(INT_VALUE) , \(FLOAT_VALUE) , \(DOUBLE_VALUE), \(STRING_VALUE)"
println(str)

Hier

1) Standardmäßig ein beliebiger Gleitkommawert double

EX.
 var myVal = 5.2 // its double by default;

-> Wenn Sie einen Gleitkommawert anzeigen möchten, müssen Sie diesen explizit wie a definieren

 EX.
     var myVal:Float = 5.2 // now its float value;

Das ist viel klarer.


2
let INT_VALUE=80
let FLOAT_VALUE:Double= 80.9999
let doubleValue=65.0
let DOUBLE_VALUE:Double= 65.56
let STRING_VALUE="Hello"

let str = NSString(format:"%d , %f, %ld, %@", INT_VALUE, FLOAT_VALUE, DOUBLE_VALUE, STRING_VALUE);
 println(str);

2
Die Modifikatoren müssen nicht verwendet werden. Wir können es auch ohne die Modifikatoren verwenden. Es ist richtig, aber der lange Code.
Gaurav Gilani

1

Ich weiß, dass seit dieser Veröffentlichung viel Zeit vergangen ist, aber ich bin in eine ähnliche Situation geraten und habe eine einfache Klasse erstellt, um mein Leben zu vereinfachen.

public struct StringMaskFormatter {

    public var pattern              : String    = ""
    public var replecementChar      : Character = "*"
    public var allowNumbers         : Bool      = true
    public var allowText            : Bool      = false


    public init(pattern:String, replecementChar:Character="*", allowNumbers:Bool=true, allowText:Bool=true)
    {
        self.pattern            = pattern
        self.replecementChar    = replecementChar
        self.allowNumbers       = allowNumbers
        self.allowText          = allowText
    }


    private func prepareString(string:String) -> String {

        var charSet : NSCharacterSet!

        if allowText && allowNumbers {
            charSet = NSCharacterSet.alphanumericCharacterSet().invertedSet
        }
        else if allowText {
            charSet = NSCharacterSet.letterCharacterSet().invertedSet
        }
        else if allowNumbers {
            charSet = NSCharacterSet.decimalDigitCharacterSet().invertedSet
        }

        let result = string.componentsSeparatedByCharactersInSet(charSet)
        return result.joinWithSeparator("")
    }

    public func createFormattedStringFrom(text:String) -> String
    {
        var resultString = ""
        if text.characters.count > 0 && pattern.characters.count > 0
        {

            var finalText   = ""
            var stop        = false
            let tempString  = prepareString(text)

            var formatIndex = pattern.startIndex
            var tempIndex   = tempString.startIndex

            while !stop
            {
                let formattingPatternRange = formatIndex ..< formatIndex.advancedBy(1)

                if pattern.substringWithRange(formattingPatternRange) != String(replecementChar) {
                    finalText = finalText.stringByAppendingString(pattern.substringWithRange(formattingPatternRange))
                }
                else if tempString.characters.count > 0 {
                    let pureStringRange = tempIndex ..< tempIndex.advancedBy(1)
                    finalText = finalText.stringByAppendingString(tempString.substringWithRange(pureStringRange))
                    tempIndex = tempIndex.advancedBy(1)
                }

                formatIndex = formatIndex.advancedBy(1)

                if formatIndex >= pattern.endIndex || tempIndex >= tempString.endIndex {
                    stop = true
                }

                resultString = finalText

            }
        }

        return resultString
    }

}

Der folgende Link wird an den vollständigen Quellcode gesendet: https://gist.github.com/dedeexe/d9a43894081317e7c418b96d1d081b25

Diese Lösung basierte auf diesem Artikel: http://vojtastavik.com/2015/03/29/real-time-formatting-in-uitextfield-swift-basics/


1

Es gibt eine einfache Lösung, die ich mit "We <3 Swift" gelernt habe, wenn Sie Foundation nicht importieren können , round () verwenden und / oder keinen String möchten :

var number = 31.726354765
var intNumber = Int(number * 1000.0)
var roundedNumber = Double(intNumber) / 1000.0

Ergebnis: 31.726


0

Verwenden Sie diesen folgenden Code:

    let intVal=56
    let floatval:Double=56.897898
    let doubleValue=89.0
    let explicitDaouble:Double=89.56
    let stringValue:"Hello"

    let stringValue="String:\(stringValue) Integer:\(intVal) Float:\(floatval) Double:\(doubleValue) ExplicitDouble:\(explicitDaouble) "

-1

Erfolg, es zu versuchen:

 var letters:NSString = "abcdefghijkl"
        var strRendom = NSMutableString.stringWithCapacity(strlength)
        for var i=0; i<strlength; i++ {
            let rndString = Int(arc4random() % 12)
            //let strlk = NSString(format: <#NSString#>, <#CVarArg[]#>)
            let strlk = NSString(format: "%c", letters.characterAtIndex(rndString))
            strRendom.appendString(String(strlk))
        }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.