Bagaimana cara membuat string dengan format?

187

Saya perlu membuat string dengan format yang dapat mengkonversi tipe int, panjang, ganda dll menjadi string. Menggunakan Obj-C, saya bisa melakukannya melalui cara di bawah ini.

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

Bagaimana caranya melakukan hal yang sama dengan swift?

Apurv
sumber

Jawaban:

386

Saya pikir ini dapat membantu Anda:

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

Contoh hasil:

timeNow in hex: 5cdc9c8d
realityone
sumber
1
Jawaban bagus! Ini benar-benar cara yang tepat untuk melakukannya. Untuk yang lain, perhatikan bahwa metode kelas "stringWithFormat" akan dikonversi menjadi panggilan init di kelas dengan "WithFormat" berubah menjadi argumen pertama bernama "format:". Pertanyaan awal tidak menambahkan pemformatan khusus, seperti mengubah jumlah desimal floating point untuk ditampilkan, jika ada, milik Anda akan menjadi satu-satunya jawaban!
David H
4
Apakah Anda akan menautkan ke dokumentasi? Saya mengalami kesulitan melacaknya.
dumbledad
3
Metode ini berasal dari NSStringdalam Foundationkerangka . Jadi, Anda harus import Foundationmembuat ini berfungsi dengan benar. Kalau tidak, ekspresi akan memanggil String.init<T>(T), dan itu akan menghasilkan sesuatu seperti "(\"%@%x %x\", 10)"bukan.
eonil
1
@realityone, apa %@%xarti simbol? Bisakah Anda mengarahkan saya ke sumber di mana saya bisa belajar lebih banyak tentang hal itu.
bibscy
90

tidak ada yang spesial

let str = NSString(format:"%d , %f, %ld, %@", INT_VALUE, FLOAT_VALUE, LONG_VALUE, STRING_VALUE)
Bryan Chen
sumber
49
let str = "\(INT_VALUE), \(FLOAT_VALUE), \(DOUBLE_VALUE), \(STRING_VALUE)"

Pembaruan: Saya menulis jawaban ini sebelum Swift String(format:)menambahkan ke API-nya. Gunakan metode yang diberikan oleh jawaban teratas .

John Estropia
sumber
6
Saya tidak berpikir ini benar-benar menjawab pertanyaan karena tidak ada format. Dengan menggunakan metode ini, Anda tidak dapat memformat jumlah desimal yang ada di floating point Anda. Menggunakan String(format:arguments:)akan lebih tepat untuk menambahkan pemformatan
Chris
4
OP tidak meminta pemformatan apa pun, hanya cara untuk membuat string dengan format yang dapat mengubah tipe int, long, double dll menjadi string .
John Estropia
Pertanyaannya tidak jelas. Karena dia membandingkan apa yang dia inginkan -stringWithFormat:yang memungkinkan pemformatan. Dalam Swift, String(format:arguments:)akan menjadi versi Swift Obj-C-stringWithFormat:
Chris
Periksa tanggal pertanyaan. Ini adalah selama rilis pertama Swift ketika NSStringmetode belum diterapkan di Swift String.
John Estropia
Saya berdiri dikoreksi. Masih bagus untuk memiliki cara yang lebih baru terlihat bagi siapa pun yang mencari masalah yang sama di masa depan
Chris
42

Tidak NSStringdiperlukan!

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

atau

String(format:"Value: %3.2f\tResult: %3.2f", 2.7, 99.8)
Durul Dalkanat
sumber
15

Saya berpendapat bahwa keduanya

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

dan

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

keduanya dapat diterima karena pengguna bertanya tentang pemformatan dan kedua kasus sesuai dengan apa yang mereka minta:

Saya perlu membuat string dengan format yang dapat mengkonversi tipe int, panjang, ganda dll menjadi string.

Jelas yang pertama memungkinkan kontrol yang lebih baik atas format daripada yang terakhir, tetapi itu tidak berarti yang terakhir bukanlah jawaban yang dapat diterima.

Lance Clark
sumber
5
var str = "\(INT_VALUE) , \(FLOAT_VALUE) , \(DOUBLE_VALUE), \(STRING_VALUE)"
apel
sumber
5

Pertama baca dokumentasi resmi untuk bahasa Swift.

Jawabannya seharusnya

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

Sini

1) Setiap nilai floating point secara default double

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

-> Jika Anda ingin menampilkan nilai floating point maka Anda perlu secara eksplisit mendefinisikan seperti

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

Ini jauh lebih jelas.

iPatel
sumber
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);
Awais Chatha
sumber
2
tidak perlu menggunakan pengubah. Kita juga bisa menggunakannya tanpa pengubah. Itu benar tetapi kode panjang.
Gaurav Gilani
1

Saya tahu banyak waktu telah berlalu sejak penerbitan ini, tetapi saya telah jatuh dalam situasi yang sama dan membuat kelas sederhana untuk menyederhanakan hidup saya.

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
    }

}

Tautan ikuti kirim ke kode sumber lengkap: https://gist.github.com/dedeexe/d9a43894081317e7c418b96d1d081b25

Solusi ini didasarkan pada artikel ini: http://vojtastavik.com/2015/03/29/real-time-formatting-in-uitextfield-swift-basics/

dede.exe
sumber
1

Ada solusi sederhana yang saya pelajari dengan "We <3 Swift" jika Anda tidak dapat mengimpor Foundation , gunakan round () dan / atau tidak ingin String :

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

hasil: 31.726

Paula Hasstenteufel
sumber
0

Gunakan kode berikut ini:

    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) "
PREMKUMAR
sumber
-2

Berhasil mencobanya:

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

sumber