我正在尝试用swift语言编写一个BMI程序。 我有这个问题:如何转换字符串为双精度?
在Objective-C中,我可以这样做:
double myDouble = [myString doubleValue];
但是如何在Swift语言中实现这一点呢?
我正在尝试用swift语言编写一个BMI程序。 我有这个问题:如何转换字符串为双精度?
在Objective-C中,我可以这样做:
double myDouble = [myString doubleValue];
但是如何在Swift语言中实现这一点呢?
当前回答
斯威夫特4
extension String {
func toDouble() -> Double {
let nsString = self as NSString
return nsString.doubleValue
}
}
其他回答
斯威夫特4
extension String {
func toDouble() -> Double {
let nsString = self as NSString
return nsString.doubleValue
}
}
Swift 4.2+字符串到双
您应该使用新的类型初始化器在字符串和数值类型(Double, Float, Int)之间进行转换。它将返回一个可选类型(Double?),它将有正确的值,如果字符串不是数字,则为nil。
注意:不建议使用NSString doubleValue属性,因为如果值不能转换(即:错误的用户输入),它将返回0。
let lessPrecisePI = Float("3.14")
let morePrecisePI = Double("3.1415926536")
let invalidNumber = Float("alphabet") // nil, not a valid number
打开值,使用if/let来使用它们
if let cost = Double(textField.text!) {
print("The user entered a value price of \(cost)")
} else {
print("Not a valid number: \(textField.text!)")
}
可以使用NumberFormatter类转换格式化的数字和货币。
let formatter = NumberFormatter()
formatter.locale = Locale.current // USA: Locale(identifier: "en_US")
formatter.numberStyle = .decimal
let number = formatter.number(from: "9,999.99")
货币格式
let usLocale = Locale(identifier: "en_US")
let frenchLocale = Locale(identifier: "fr_FR")
let germanLocale = Locale(identifier: "de_DE")
let englishUKLocale = Locale(identifier: "en_GB") // United Kingdom
formatter.numberStyle = .currency
formatter.locale = usLocale
let usCurrency = formatter.number(from: "$9,999.99")
formatter.locale = frenchLocale
let frenchCurrency = formatter.number(from: "9999,99€")
// Note: "9 999,99€" fails with grouping separator
// Note: "9999,99 €" fails with a space before the €
formatter.locale = germanLocale
let germanCurrency = formatter.number(from: "9999,99€")
// Note: "9.999,99€" fails with grouping separator
formatter.locale = englishUKLocale
let englishUKCurrency = formatter.number(from: "£9,999.99")
在我的博客文章中阅读更多关于将String转换为Double类型(和货币)的内容。
在字符串包含其他字符的情况下:“27.8°C”,“52.523553 kM”或“Total: 349.0”。
这适用于Swift 4:
let anyString = "52.523553 kM"
let digitsCharacterSet = CharacterSet.init(charactersIn: "0123456789.")
let doubleResult = Double(anyString.components(separatedBy:digitsCharacterSet.inverted).joined())
谨慎!这对包含多个的字符串无效。比如“27.8°C 3.5 kM”
如前所述,实现这一目标的最佳方法是直接铸造:
(myString as NSString).doubleValue
在此基础上,你可以创建一个流畅的本地Swift String扩展:
extension String {
var doubleValue: Double {
return (self as NSString).doubleValue
}
}
这允许你直接使用:
myString.doubleValue
它会帮你选角。如果苹果确实添加了一个doubleValue到本地字符串,你只需要删除扩展和其余的代码将自动编译好!
Swift 2更新 有新的可失败的初始化器,允许你以更习惯和安全的方式来做这件事(正如许多答案所指出的,NSString的double值不是很安全,因为它对非数字值返回0。这意味着"foo"和"0"的doubleValue是相同的。)
let myDouble = Double(myString)
这将返回一个可选值,因此在诸如传入"foo"时doubleValue将返回0,可失败的初始化器将返回nil。您可以使用守卫、if-let或映射来处理Optional<Double>
原来的帖子: 你不需要像接受的答案那样使用NSString构造函数。你可以像这样简单地桥接它:
(swiftString as NSString).doubleValue