XCode 6的Swift中的String to Double [重复]

Posted

技术标签:

【中文标题】XCode 6的Swift中的String to Double [重复]【英文标题】:String to Double in XCode 6's Swift [duplicate] 【发布时间】:2014-10-05 01:00:51 【问题描述】:

如何在 Swift 中将字符串转换为双精度值?我已经尝试过 string.doubleValue 或 string.bridgeToObjectiveC().doubleValue ,但都不起作用。有什么想法吗?

【问题讨论】:

你是如何尝试的?他们以什么方式“不工作”? bridgeToObjectC() 自 XCode6 beta5 以来已被删除。 【参考方案1】:

您可以创建一个只读的计算属性字符串扩展来帮助您将字符串转换为双精度:

你可以使用 NSNumberFormatter

extension String 
    struct Number 
        static let formatter = NSNumberFormatter()
    
    var doubleValue: Double 
        return Number.formatter.numberFromString(self)?.doubleValue ?? 0
    

或者您可以将其转换为 NSString 并提取其 doubleValue 属性:

extension String 
    var ns: NSString 
        return self
    
    var doubleValue: Double 
        return ns.doubleValue
    


"2.35".doubleValue + 3.3 // 5.65

【讨论】:

这在模拟器中运行良好,为什么在我的 iPhone6 (ios8.4) 上不行。此解决方案工作正常:http://***.com/questions/24031621/swift-how-to-convert-string-to-double【参考方案2】:

根据 2015 年冬季斯坦福 CS193p 课程,在 Swift 中从字符串获取双精度的正确方法是使用 NSNumberFormatter 而不是 NSString:

let decimalAsString = "123.45"
let decimalAsDouble = NSNumberFormatter().numberFromString(decimalAsString)!.doubleValue

如果您想要安全(关于可选的展开和小数分隔符),您可以使用:

 let decimalAsString = "123.45"
 var formatter = NSNumberFormatter()
 formatter.locale = NSLocale(localeIdentifier: "en_US")
 if let decimalAsDoubleUnwrapped = formatter.numberFromString(decimalAsString) 
   decimalAsDouble = decimalAsDoubleUnwrapped.doubleValue

如果你解析一个 XML 或 JSON 文件并且你需要确保你有一个可以转换为 Double 的字符串,安全解包特别有用(如果你强制解包一个实际上是 nil 的选项,程序会崩溃) .

/!\ 编辑:小心,NSNumberFormatter 的工作方式与 NSString 不同。 NSString 允许您执行以下操作:(dictionary[key] as NSString).doubleValue,前提是 dictionary[key] 使用了 '.'作为小数点分隔符(如“123.45”)。 但是 NSNumberFormatter() 默认情况下会使用您当前的系统语言环境初始化 NSNumberFormatter 的实例! 因此,NSNumberFormatter().numberFromString(decimalAsString)!.doubleValue 可以在美国设备上使用 123.45,但不能在法国设备上使用! 例如,如果您正在解析 JSON 文件,并且您知道值是使用 '.' 存储的。作为小数点分隔符,您需要相应地设置 NSNumberFormatter 实例的语言环境:

var formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "en_US")

然后:

let decimalAsString = "123.45"
if let decimalAsDoubleUnwrapped = NSNumberFormatter().numberFromString(decimalAsString) 
   decimalAsDouble = decimalAsDoubleUnwrapped.doubleValue

在这种情况下,decimalAsDouble 将正确返回 123.45 作为 doubleValue。

但如果 decimalAsString = "123,45",它将返回 nil。 或者如果 NSLocale 设置为“fr_FR”。 另一方面,使用带有 fr_FR 的 NSLocale 的 NSNumberFormatter 可以完美地处理“123,45”,但返回 nil 和“​​123.45”。

我认为这值得提醒。 我相应地更新了我的答案。

编辑:另外,NSNumberFormatter 不知道如何处理“+2.45%”或“0.1146”之类的东西(您必须非常精确地定义 NSNumberFormatter 实例的属性)。 NSString 本身就可以。

【讨论】:

@Leonardo:是的,感谢您的指正!【参考方案3】:

你总是可以像这样从 String 转换为 NSString

let str = "5"
let dbl = (str as NSString).doubleValue

【讨论】:

NSString 的 floatValue 和 doubleValue 方法仅在数字使用美式点分隔符时有效。 This property uses formatting information stored in the non-localized value; use an NSScanner object for localized scanning of numeric values from a string.【参考方案4】:

试试这个:

var a:Double=NSString(string: "232.3").doubleValue

【讨论】:

【参考方案5】:

试试这个:

let str = "5"
let double = Double(str.toInt()!)

另一种方法是:

let mySwiftString = "5"
var string = NSString(string: mySwiftString)
string.doubleValue

后一篇贴在这里:

Swift - How to convert String to Double

【讨论】:

我认为第一个选项是不正确的,因为浮点数之后会丢失所有内容。

以上是关于XCode 6的Swift中的String to Double [重复]的主要内容,如果未能解决你的问题,请参考以下文章

未定义符号:Swift.String.unicodeScalars.getter:XCode 13 中的 Swift.String.UnicodeScalarView

如何在 Xcode 6.1 的 Swift 中使用 NSURL?

Xcode 6 - SWIFT - 访问数组时出错

将 xcode 6 beta 6 升级到 xcode 6 GM 种子后的 Swift 编译器错误

Swift 3(Xcode 8 beta 6)localizedStringWithFormat

Swift 4.2,Xcode 游乐场中的 String firstIndex() 函数错误