Formatlı bir dize nasıl oluşturulur?


187

Ben int, uzun, çift vb türleri dizeye dönüştürebilirsiniz biçimi ile bir dize oluşturmak gerekiyor. Obj-C kullanarak bunu aşağıdaki yolla yapabilirim.

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

Swift ile nasıl yapılır?

Yanıtlar:


387

Bunun size yardımcı olabileceğini düşünüyorum:

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

Örnek sonuç:

timeNow in hex: 5cdc9c8d

1
Mükemmel cevap! Bunu yapmanın kesinlikle doğru yolu budur. Diğerleri için, "stringWithFormat" sınıf yönteminin, "WithFormat" adlı "in:" adlı ilk bağımsız değişken haline dönüştürülmüş sınıftaki bir init çağrısına dönüştürüldüğünü unutmayın. Orijinal soru, görüntülenecek kayan nokta ondalık sayısını değiştirmek gibi belirli bir biçimlendirme eklemedi, eğer olsaydı, tek cevap sizin olurdu!
David H

4
Belgelere bağlantı verir misiniz? İzlerken sorun yaşıyorum.
Dumbledad

3
Bu yöntem geliyor NSStringyılında Foundationçerçevede . Bu yüzden bunu import Foundationdoğru bir şekilde yapmak için yapmanız gerekir . Aksi takdirde ifade çağıracak String.init<T>(T)ve "(\"%@%x %x\", 10)"yerine bir şey üretecektir .
eonil

1
@realityone %@%xSemboller ne anlama geliyor? Beni bu konuda daha fazla bilgi edinebileceğim bir kaynağa yönlendirebilir misiniz?
bibscy


90

Özel birşey yok

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

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

Güncelleme: Bu cevabı Swift'in String(format:)API'sine eklemeden önce yazdım . Üst cevapta verilen yöntemi kullanın .


6
Bunun aslında soruyu cevapladığını sanmıyorum çünkü biçimlendirme yok. Bu yöntemi kullanarak kayan noktalarınızda kaç ondalık sayı olacağını biçimlendiremezsiniz. String(format:arguments:)Biçimlendirme eklemek için kullanmak daha uygun olacaktır
Chris

4
OP herhangi bir biçimlendirme istemedi, int, long, double vb. Türlerini dizgeye dönüştürebilen biçime sahip bir dize oluşturmanın bir yolu değildi .
John Estropia

O zaman soru belirsiz. Çünkü -stringWithFormat:biçimlendirmeye izin veren ne istediğini karşılaştırıyor . Swift'te, String(format:arguments:)Obj-C'nin Swift versiyonu olacaktı-stringWithFormat:
Chris

Sorunun tarihini kontrol edin. Bu Swift'in NSStringhenüz piyasaya sürülmediği yöntemlerde Swift'in ilk sürümünde oldu String.
John Estropia

Ben düzeltilmiş duruyorum. Gelecekte aynı sorunu arayan herkes için daha yeni bir yolun görünür olması hala iyi
Chris

42

Gerek yok NSString!

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

veya

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

15

Her ikisinin de

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

ve

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

kullanıcı biçimlendirme hakkında bilgi istediğinden ve her iki durum da istediklerine uyduğundan beri kabul edilebilir:

Ben int, uzun, çift vb türleri dizeye dönüştürebilirsiniz biçimi ile bir dize oluşturmak gerekiyor.

Açıkçası, ilk, biçimlendirme üzerinde sonrakinden daha iyi bir kontrole izin verir, ancak bu, ikincisinin kabul edilebilir bir cevap olmadığı anlamına gelmez.


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

5

Önce Swift dili için resmi belgeleri okuyun .

Cevap olmalı

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

Buraya

1) Varsayılan olarak herhangi bir kayan nokta değeri double

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

-> Kayan nokta değerini görüntülemek istiyorsanız, açık bir şekilde

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

Bu çok daha açık.


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
değiştiricilerin kullanılmasına gerek yoktur. Ayrıca değiştiriciler olmadan da kullanabiliriz. Doğru ama uzun kod.
Gaurav Gilani

1

Bu yayından bu yana çok zaman geçtiğini biliyorum, ama benzer bir duruma düştüm ve hayatımı basitleştirmek için basit bir sınıf yarattım.

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
    }

}

Aşağıdaki bağlantı tüm kaynak koduna gönderilir: https://gist.github.com/dedeexe/d9a43894081317e7c418b96d1d081b25

Bu çözüm şu makaleye dayandırılmıştır: http://vojtastavik.com/2015/03/29/real-time-formatting-in-uitextfield-swift-basics/


1

Foundation'ı içe aktaramıyorsanız , round () kullanın ve / veya bir String istemiyorsanız "We <3 Swift" ile öğrendiğim basit bir çözüm var :

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

sonuç: 31.726


0

Aşağıdaki kodu kullanın:

    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

Deneme başarısı:

 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))
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.