Swift 如何使用数字格式化程序?

Swift 如何使用数字格式化程序?,swift,Swift,我在使用NumberFormatter时遇到问题。我希望变量输出只包含一定数量的数字 例如,3.14而不是3.14567899 我收到对成员“stringfrom:”的不明确引用时出错: 正确的方法是什么?代码中的问题恰恰在于您提到的那一行: output = formatter.string(from: NSNumber(value: Double(lengthTextFieldValue)! * 12)) 主要问题是Double的初始值设定项返回可选值。您可以通过将初始化包装在if-let

我在使用NumberFormatter时遇到问题。我希望变量输出只包含一定数量的数字

例如,3.14而不是3.14567899

我收到对成员“stringfrom:”的不明确引用时出错:


正确的方法是什么?

代码中的问题恰恰在于您提到的那一行:

output = formatter.string(from: NSNumber(value: Double(lengthTextFieldValue)! * 12))
主要问题是Double的初始值设定项返回可选值。您可以通过将初始化包装在if-let语句中来缓解,例如:

if let myDouble = Double(lengthTextFieldValue) {
    // your code
}
或者使用速记版本,假设您愿意接受一个中性数字,例如0或1:

let myDouble = Double(lengthTextFieldValue) ?? 0
初始化Double后,还可以将其四舍五入到所需的小数位数:

extension Double {
    func rounded(toPlaces places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}
string返回一个可选值。 所以,您应该检查输出是否为零或非零。 ? 在Typelike字符串之后,表示值是可选的。可选值可能为零


双字符串初始值设定项返回可选值。您需要将其展开或使用nil合并操作符。DoublelengthTextFieldValue??0顺便说一句,无需初始化新的NSNumber对象。您可以使用格式化程序的方法stringfor:Any并传递一个Double。我认为您错过了代码末尾的输出=Formatter.stringfrom:NSNumbervalue:DoublelengthTextFieldValue*12@OKMIN我尝试了这个方法,但出现了一个错误,错误是:无法将“String”类型的值赋给“Double”类型。我是swift的新手,如何添加扩展名Double。还有什么要补充的吗?@AmaniH没有,没必要,把它放在一个单独的文件里,你就可以走了。你可能需要在顶部导入基础。
extension Double {
    func rounded(toPlaces places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}
func calculateLength() {

    let formatter = NumberFormatter()
    formatter.numberStyle = .decimal
    formatter.minimumFractionDigits = 2
    formatter.maximumFractionDigits = 2


    print(startingLength)
    print(endingLength)
    if startingLength == "Feet" && endingLength == "Inches" {
        if let output = formatter.string(from: NSNumber(value: Double(lengthTextFieldValue) * 12)) {
            print(output)
            lengthOutputLabel.text = ("\(lengthTextFieldValue) ft = \(output) inches")
        }
    }
}