使用numberformatter将字符串Swift转换为double将返回nil

时间:2017-10-22 20:27:20

标签: ios swift

我正在尝试转换用户输入的文本字段的值。由于用户也可以输入欧洲数字格式的十进制值,我使用numberformatter。这就是我的尝试:

let newprice = MaximumPriceLabel.text as! String
print(newprice) -> result: Optional("10,00")
print(formatter.number(from: newprice as String)) -> result: nil
print(Double(formatter.number(from: ("10,11"))!)) -> result: 10.11 -> that is what I want

因此在变量newprice中存储了一个值,但在格式化时,它返回nil。当我用手动值测试时,它可以工作。有什么我做错了吗? Formatter.local设置为Locale.current。

更新:问题似乎是MaximumPriceLabel.text不仅包含我需要的值,还包含文本"可选(" 10,00" ) - 转换为数字时失败。该值填充如下:

 self.MaximumPriceLabel.text = String(describing: formatter.string(from: NSNumber(value: desprice)))

当我之后进行打印时,我会收到"可选("可选(\" 10,00 \")")" - >即使我先清除变量MaximumPriceLabel.text。

1 个答案:

答案 0 :(得分:1)

你需要学习如何处理选项。

您的第一个问题是如何设置标签的文本。请注意,NumberFormatter string(from:)会返回可选的String。永远不要使用String(describing:)来向用户显示信息。那应该只用于调试。

首先改变:

self.MaximumPriceLabel.text = String(describing: formatter.string(from: NSNumber(value: desprice)))

为:

if let text = formatter.string(from: NSNumber(value: desprice)) {
    MaximumPriceLabel.text = text
}

这将解决标签文本Optional(...)

的问题

然后,将标签文本转换回字符串的代码需要更新为:

if let newprice = MaximumPriceLabel.text {
    if let price = formatter.number(from: newprice) {
        print("The price is \(price)")
    } else {
        print("Invalid number: \(newprice)")
    }
}