Làm thế nào để tạo một chuỗi với định dạng?


187

Tôi cần tạo một chuỗi với định dạng có thể chuyển đổi các kiểu int, long, double, v.v. thành chuỗi. Sử dụng Obj-C, tôi có thể thực hiện thông qua cách bên dưới.

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

Làm thế nào để làm tương tự với swift?

Câu trả lời:


385

Tôi nghĩ rằng điều này có thể giúp bạn:

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

Kết quả ví dụ:

timeNow in hex: 5cdc9c8d

1
Câu trả lời chính xác! Đây hoàn toàn là cách chính xác để làm điều đó. Đối với những người khác, lưu ý rằng phương thức lớp "stringWithFormat" được chuyển đổi thành lệnh gọi init trên lớp với "WithFormat" được chuyển thành đối số đầu tiên có tên là "định dạng:". Câu hỏi ban đầu không thêm bất kỳ định dạng cụ thể nào, như thay đổi số thập phân dấu phẩy động để hiển thị, nếu anh ta có, câu trả lời của bạn sẽ là câu trả lời duy nhất!
David H

4
Bạn sẽ liên kết đến các tài liệu? Tôi gặp khó khăn khi theo dõi nó xuống.
dumbledad

3
Phương pháp này đến từ NSStringtrong Foundationkhuôn khổ . Vì vậy, bạn phải import Foundationlàm điều này để hoạt động chính xác. Nếu không, biểu thức sẽ gọi String.init<T>(T), và nó sẽ tạo ra một cái gì đó như "(\"%@%x %x\", 10)"thay vì.
Eonil

1
@realityone %@%xbiểu tượng có nghĩa là gì? Bạn có thể chỉ cho tôi một tài nguyên nơi tôi có thể tìm hiểu thêm về nó.
bibscy


89

không có gì đặc biệt

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

Cập nhật: Tôi đã viết câu trả lời này trước khi Swift String(format:)thêm vào API của nó. Sử dụng phương pháp được đưa ra bởi câu trả lời hàng đầu .


6
Tôi không nghĩ rằng điều này thực sự trả lời câu hỏi vì không có định dạng. Sử dụng phương pháp này, bạn không thể định dạng có bao nhiêu số thập phân trong các điểm nổi của mình. Sử dụng String(format:arguments:)sẽ phù hợp hơn để thêm định dạng
Chris

4
OP đã không yêu cầu bất kỳ định dạng nào, chỉ là một cách để tạo một chuỗi với định dạng có thể chuyển đổi các kiểu int, long, double, v.v. thành chuỗi .
John Estropia

Câu hỏi không rõ ràng. Bởi vì anh ta so sánh những gì anh ta muốn -stringWithFormat:cho phép định dạng. Trong Swift, String(format:arguments:)sẽ là phiên bản Swift của Obj-C's-stringWithFormat:
Chris

Kiểm tra ngày của câu hỏi. Đây là trong lần phát hành đầu tiên của Swift khi NSStringcác phương thức chưa được triển khai trong Swift String.
John Estropia

Tôi đứng sửa. Vẫn tốt để có cách hiển thị mới hơn cho bất kỳ ai đang tìm kiếm cùng một vấn đề trong tương lai
Chris

42

Không NSStringyêu cầu!

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

hoặc là

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

15

Tôi sẽ tranh luận rằng cả hai

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

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

đều được chấp nhận vì người dùng đã hỏi về định dạng và cả hai trường hợp đều phù hợp với những gì họ đang yêu cầu:

Tôi cần tạo một chuỗi với định dạng có thể chuyển đổi các kiểu int, long, double, v.v. thành chuỗi.

Rõ ràng cái trước cho phép kiểm soát định dạng tốt hơn định dạng sau, nhưng điều đó không có nghĩa là cái sau không phải là một câu trả lời chấp nhận được.


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

5

Đầu tiên đọc tài liệu chính thức cho ngôn ngữ Swift.

Trả lời nên

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

Đây

1) Mọi giá trị dấu phẩy động theo mặc định double

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

-> Nếu bạn muốn hiển thị giá trị dấu phẩy động thì bạn cần xác định rõ ràng như

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

Điều này là rõ ràng hơn nhiều.


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
không cần sử dụng công cụ sửa đổi. Chúng tôi cũng có thể sử dụng nó mà không cần sửa đổi. Nó đúng nhưng mã dài.
Gaurav Gilani

1

Tôi biết rất nhiều thời gian đã trôi qua kể từ lần xuất bản này, nhưng tôi đã rơi vào tình huống tương tự và tạo ra một lớp mô phỏng để đơn giản hóa cuộc sống của tôi.

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
    }

}

Liên kết sau gửi đến mã nguồn hoàn chỉnh: https://gist.github.com/dedeexe/d9a43894081317e7c418b96d1d081b25

Giải pháp này dựa trên bài viết này: http : // vojtastasta.com/2015/03/29/real-time-formatted-in-uitextfield-swift-basics/


1

Có một giải pháp đơn giản mà tôi đã học được với "Chúng tôi <3 Swift" nếu bạn không thể nhập Foundation , sử dụng round () và / hoặc không muốn có Chuỗi :

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

kết quả: 31.726


0

Sử dụng mã sau đây:

    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

Thành công để thử nó:

 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))
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.