Swift中的字符串插值

时间:2014-08-31 19:33:15

标签: string swift string-interpolation

swift中的函数在Swift中采用任何数字类型(Int,Double,Float,UInt等)。 该函数将数字转换为字符串

函数签名如下:

func swiftNumbers <T : NumericType> (number : T) -> String {
    //body
}

NumericType 是一个自定义协议,已添加到Swift中的数字类型中。

在函数体内,该数字应转换为字符串:

我使用以下

var stringFromNumber = "\(number)"

这不是那么优雅,PLUS:如果数字的绝对值严格低于0.0001则给出:

"\(0.000099)" //"9.9e-05"

或者数字是一个大数字:

"\(999999999999999999.9999)" //"1e+18"

有没有办法解决这个字符串插值限制? (不使用Objective-C)

P.S:

NumberFormater无法正常工作

import Foundation

let number : NSNumber = 9_999_999_999_999_997

let formatter = NumberFormatter()
formatter.minimumFractionDigits = 20
formatter.minimumIntegerDigits = 20
formatter.minimumSignificantDigits = 40

formatter.string(from: number) // "9999999999999996.000000000000000000000000"

let stringFromNumber = String(format: "%20.20f", number) // "0.00000000000000000000"

3 个答案:

答案 0 :(得分:9)

Swift String Interpolation

1)为字符串添加不同的类型

2)表示字符串是由常量,变量,文字或表达式的混合创建的。

示例:

let length:Float = 3.14
var breadth = 10
var myString = "Area of a rectangle is length*breadth"
myString = "\(myString) i.e. = \(length)*\(breadth)"    

输出:

3.14
10
Area of a rectangle is length*breadth
Area of a rectangle is length*breadth i.e. = 3.14*10

答案 1 :(得分:5)

使用Swift String初始值设定项:String(format: <#String#>, arguments: <#[CVarArgType]#>) 例如: let stringFromNumber = String(format: "%.2f", number)

答案 2 :(得分:0)

字符串插值从 Swift 最早的时候就已经存在,但在 Swift 5.0 中,它进行了大规模的改革,以使其更快、更强大。

let name = "Ashwinee Dhakde"
print("Hello, I'm \(name)")

使用 Swift 5.0 中新的字符串插值系统,我们可以扩展 String.StringInterpolation 以添加我们自己的自定义插值,如下所示:

extension String.StringInterpolation {
    mutating func appendInterpolation(_ value: Date) {
    let formatter = DateFormatter()
    formatter.dateStyle = .full

    let dateString = formatter.string(from: value)
    appendLiteral(dateString)
    }
}

用法:print("Today's date is \(Date()).")

我们甚至可以提供用户定义的名称来使用字符串插值,让我们通过一个例子来理解。

extension String.StringInterpolation {
    mutating func appendInterpolation(JSON JSONData: Data) {
        guard
            let JSONObject = try? JSONSerialization.jsonObject(with: JSONData, options: []),
            let jsonData = try? JSONSerialization.data(withJSONObject: JSONObject, options: .prettyPrinted) else {
            appendInterpolation("Invalid JSON data")
            return
        }
        appendInterpolation("\n\(String(decoding: jsonData, as: UTF8.self))")
    }
}


print("The JSON is \(JSON: jsonData)")

每当我们想在字符串插值语句中提供“JSON”时,它都会打印 .prettyPrinted

是不是很酷!!