จะสร้างสตริงที่มีรูปแบบได้อย่างไร?


187

ฉันต้องการสร้างสตริงที่มีรูปแบบซึ่งสามารถแปลงชนิด int, long, double ฯลฯ เป็นสตริง เมื่อใช้ Obj-C ฉันสามารถทำได้ผ่านวิธีด้านล่าง

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

ทำอย่างไรกับ swift

คำตอบ:


386

ฉันคิดว่านี่จะช่วยคุณได้:

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

ตัวอย่างผลลัพธ์:

timeNow in hex: 5cdc9c8d

1
คำตอบที่ดี! นี่เป็นวิธีที่ถูกต้องอย่างแน่นอน สำหรับคนอื่น ๆ โปรดทราบว่าวิธีการเรียน "stringWithFormat" ได้รับการแปลงเป็นการโทรเริ่มต้นในชั้นเรียนด้วย "WithFormat" กลายเป็นอาร์กิวเมนต์แรกชื่อ "รูปแบบ:" คำถามเดิมไม่ได้เพิ่มการจัดรูปแบบเฉพาะเช่นการเปลี่ยนจำนวนทศนิยมที่จะแสดงถ้าเขามีคุณจะเป็นคำตอบเดียว!
David H

4
คุณจะลิงค์ไปที่เอกสารหรือไม่ ฉันมีปัญหาในการติดตามมัน
dumbledad

3
วิธีการนี้จะมาจากNSStringในFoundationกรอบ ดังนั้นคุณต้องimport Foundationทำให้มันทำงานได้อย่างถูกต้อง มิฉะนั้นการแสดงออกจะเรียกString.init<T>(T)และมันจะผลิตสิ่งที่ต้องการ"(\"%@%x %x\", 10)"แทน
eonil

1
@realityone %@%xสัญลักษณ์ใดที่มีความหมายว่าอย่างไร คุณช่วยชี้ให้ฉันเป็นแหล่งข้อมูลที่ฉันสามารถเรียนรู้เพิ่มเติมเกี่ยวกับมันได้ไหม
บรรณานุกรม



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

อัปเดต:ฉันเขียนคำตอบนี้ก่อนที่ Swift จะString(format:)เพิ่มเป็น API ใช้วิธีการที่กำหนดโดยคำตอบด้านบน


6
ฉันไม่คิดว่านี่เป็นคำตอบที่แท้จริงเพราะไม่มีการจัดรูปแบบ เมื่อใช้วิธีนี้คุณจะไม่สามารถจัดรูปแบบจำนวนทศนิยมที่มีในทศนิยมของคุณ การใช้String(format:arguments:)จะเหมาะสมกว่าในการเพิ่มการจัดรูปแบบ
Chris

4
สหกรณ์ไม่ได้ขอจัดรูปแบบใด ๆ เพียงแค่วิธีการสร้างสตริงที่มีรูปแบบที่สามารถแปลง int ยาวคู่อื่น ๆ ประเภทเป็นสตริง
John Estropia

คำถามนั้นไม่ชัดเจน เพราะเขาเปรียบเทียบสิ่งที่เขาต้องการ-stringWithFormat:ซึ่งช่วยให้การจัดรูปแบบ ใน Swift String(format:arguments:)จะเป็น Obj-C's รุ่น Swift-stringWithFormat:
Chris

ตรวจสอบวันที่ของคำถาม นี้เป็นช่วงการเปิดตัวครั้งแรกของสวิฟท์เมื่อวิธีการยังไม่ดำเนินการในสวิฟท์NSString String
John Estropia

ฉันยืนแก้ไขแล้ว ยังดีที่มีวิธีการใหม่ที่มองเห็นได้สำหรับทุกคนที่ค้นหาปัญหาเดียวกันในอนาคต
Chris

42

ไม่NSStringจำเป็น!

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

หรือ

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

15

ฉันจะยืนยันว่าทั้งสอง

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

และ

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

ทั้งสองยอมรับได้เนื่องจากผู้ใช้ถามเกี่ยวกับการจัดรูปแบบและทั้งสองกรณีเหมาะสมกับสิ่งที่พวกเขาขอ:

ฉันต้องการสร้างสตริงที่มีรูปแบบซึ่งสามารถแปลงชนิด int, long, double ฯลฯ เป็นสตริง

เห็นได้ชัดว่าอดีตช่วยให้การควบคุมการจัดรูปแบบที่ดีกว่าหลัง แต่ไม่ได้หมายความว่าหลังไม่ได้คำตอบที่ยอมรับได้



5

ก่อนอื่นให้อ่านเอกสารอย่างเป็นทางการสำหรับภาษา Swift

คำตอบควรเป็น

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

ที่นี่

1) ค่าทศนิยมใด ๆ โดยค่าเริ่มต้น double

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

-> หากคุณต้องการแสดงค่าจุดลอยตัวคุณจำเป็นต้องกำหนดเช่นนี้อย่างชัดเจน

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

ชัดเจนกว่านี้อีก


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
ไม่จำเป็นต้องใช้ตัวดัดแปลง เรายังสามารถใช้มันได้โดยไม่ต้องดัดแปลง มันถูกต้อง แต่รหัสยาว
Gaurav Gilani

1

ฉันรู้ว่าเวลาผ่านไปนานนับตั้งแต่ตีพิมพ์นี้ แต่ฉันตกอยู่ในสถานการณ์ที่คล้ายคลึงกันและสร้างคลาส simples เพื่อทำให้ชีวิตของฉันง่ายขึ้น

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
    }

}

ลิงค์ติดตามส่งไปยังรหัสที่มาที่สมบูรณ์: https://gist.github.com/dedeexe/d9a43894081317e7c418b96d1d081b25

วิธีนี้เป็นพื้นฐานของบทความนี้: http://vojtastavik.com/2015/03/29/real-time-formatting-in-uitextfield-swift-basics/


1

มีวิธีง่ายๆที่ฉันเรียนรู้ด้วย "We <3 Swift" ถ้าคุณไม่สามารถนำเข้า Foundationใช้round ()และ / หรือไม่ต้องการString :

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

ผล: 31.726


0

ใช้รหัสต่อไปนี้:

    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

ประสบความสำเร็จในการลอง:

 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))
        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.