Come creare una stringa con il formato?


187

Devo creare una stringa con un formato in grado di convertire tipi int, long, double, ecc. In stringa. Usando Obj-C, posso farlo tramite il modo seguente.

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

Come fare lo stesso con swift?

Risposte:


386

Penso che questo potrebbe aiutarti:

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

Risultato di esempio:

timeNow in hex: 5cdc9c8d

1
Bella risposta! Questo è assolutamente il modo corretto di farlo. Per altri, si noti che il metodo di classe "stringWithFormat" viene convertito in una chiamata init sulla classe con "WithFormat" trasformato in un primo argomento denominato di "formato:". La domanda originale non ha aggiunto alcuna formattazione specifica, come cambiare il numero di decimali in virgola mobile da visualizzare, se avesse, la tua sarebbe l'unica risposta!
David H,

4
Vuoi collegarti alla documentazione? Ho problemi a rintracciarlo.
stupido il

3
Questo metodo viene da NSStringin Foundationquadro . Quindi devi import Foundationfarlo funzionare correttamente. Altrimenti l'espressione chiamerà String.init<T>(T)e produrrà qualcosa di simile "(\"%@%x %x\", 10)"invece di.
eonil,

1
@realityone cosa %@%xsignificano i simboli? Puoi indicarmi una risorsa in cui posso saperne di più.
bibscy


90

niente di speciale

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)"

Aggiornamento: ho scritto questa risposta prima che Swift avesse String(format:)aggiunto alla sua API. Utilizzare il metodo fornito dalla risposta principale .


6
Non penso che questo in realtà risponda alla domanda perché non c'è formattazione. Utilizzando questo metodo, non è possibile formattare il numero di decimali da avere nei punti mobili. L'uso String(format:arguments:)sarebbe più appropriato per aggiungere la formattazione
Chris,

4
L'OP non ha richiesto alcuna formattazione, ma solo un modo per creare una stringa con un formato che può convertire tipi int, long, double ecc . In stringa .
John Estropia,

La domanda non è chiara allora. Perché sta confrontando ciò che desidera è -stringWithFormat:che consente la formattazione. In Swift, String(format:arguments:)sarebbe la versione Swift di Obj-C-stringWithFormat:
Chris

Controlla la data della domanda. Questo avvenne durante la prima versione di Swift quando i NSStringmetodi non erano ancora implementati in Swift String.
John Estropia,

Sono corretto. Ancora bello avere il modo più nuovo visibile per chiunque cerchi lo stesso problema in futuro
Chris

42

Non NSStringrichiesto!

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

o

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

15

Direi che entrambi

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

e

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

sono entrambi accettabili poiché l'utente ha chiesto informazioni sulla formattazione ed entrambi i casi si adattano a ciò che stanno chiedendo:

Devo creare una stringa con un formato in grado di convertire tipi int, long, double, ecc. In stringa.

Ovviamente il primo consente un controllo più preciso della formattazione rispetto al secondo, ma ciò non significa che il secondo non sia una risposta accettabile.


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

5

Prima lettura documentazione ufficiale per la lingua Swift.

La risposta dovrebbe essere

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

Qui

1) Qualsiasi valore in virgola mobile per impostazione predefinita double

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

-> Se si desidera visualizzare un valore in virgola mobile, è necessario definire esplicitamente come ad esempio un

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

Questo è molto più chiaro.


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
non è necessario utilizzare i modificatori. Possiamo anche usarlo senza i modificatori. È giusto ma il codice lungo.
Gaurav Gilani,

1

So che è passato molto tempo da questa pubblicazione, ma sono caduto in una situazione simile e ho creato una classe semplice per semplificarmi la vita.

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
    }

}

Il seguente link invia al codice sorgente completo: https://gist.github.com/dedeexe/d9a43894081317e7c418b96d1d081b25

Questa soluzione era basata su questo articolo: http://vojtastavik.com/2015/03/29/real-time-formatting-in-uitextfield-swift-basics/


1

C'è una soluzione semplice che ho imparato con "We <3 Swift" se non puoi importare Foundation , usare round () e / o non vuoi una stringa :

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

risultato: 31.726


0

Usa questo codice seguente:

    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) "

-2

Successo per provarlo:

 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))
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.