【问题标题】:String to NSNumber in SwiftSwift中的字符串到NSNumber
【发布时间】:2015-02-19 11:53:18
【问题描述】:

我找到了一种将 String 转换为 NSNumber 的方法,但是代码是在 Objective-C 中的。我已尝试将其转换为 Swift,但无法正常工作。

我正在使用的代码:

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
f.numberStyle = NSNumberFormatterDecimalStyle;
NSNumber *myNumber = [f numberFromString:@"42222222222"];

在 Swift 中我是这样使用它的:

var i = NSNumberFormatter.numberFromString("42")

但是这段代码不起作用。我做错了什么?

【问题讨论】:

  • 试试这个 NSNumberFormatter().numberFromString("42")!.doubleValue

标签: ios swift ios8 nsnumber


【解决方案1】:

斯威夫特 3.0

NSNumber(integer:myInteger) 已更改为 NSNumber(value:myInteger)

let someString = "42222222222"
if let myInteger = Int(someString) {
    let myNumber = NSNumber(value:myInteger)
}

斯威夫特 2.0

像这样使用Int() 初始化器。

let someString = "42222222222"
if let myInteger = Int(someString) {
    let myNumber = NSNumber(integer:myInteger)
    print(myNumber)
} else {
    print("'\(someString)' did not convert to an Int")
}

如果您已经知道字符串将完美转换或者您根本不在乎,这可以在一行中完成。

let myNumber = Int("42222222222")!

斯威夫特 1.0

使用toInt() 方法。

let someString = "42222222222"
if let myInteger = someString.toInt() {
    let myNumber = NSNumber(integer:myInteger)
    println(myNumber)
} else {
    println("'\(someString)' did not convert to an Int")
}

【讨论】:

  • 我的号码 long long 不是整数,将整数替换为 longlong 显示错误?
  • 你是说你的字符串不是这种格式:“42”吗?
  • 也许你可以用你想要的格式的字符串更新你的问题?
  • 交换 2.0 和 1.0 的答案,将 2.0 放在首位。
  • @SwiftArchitect 如果您觉得可以更好地构建我的答案,请随时编辑我的答案。
【解决方案2】:

或者只写一行:

NSNumberFormatter().numberFromString("55")!.decimalValue

【讨论】:

  • 就像 David Berry 在下面评论的那样,创建这样的 NSNumberFormatter 时要小心,因为它们的创建成本很高。如果多次使用相同的格式化程序,更好的缓存或使用单例。
  • 已针对 Swift 5 更新:NumberFormatter().number(from: "55")!
【解决方案3】:

在最新的 Swift 中:

let number = NumberFormatter().number(from: "1234")

【讨论】:

    【解决方案4】:

    斯威夫特 2

    试试这个:

    var num = NSNumber(int: Int32("22")!)
    

    Swift 3.x

     NSNumber(value: Int32("22")!)
    

    【讨论】:

    • 现在是 Swift 3.x。NSNumber.init( value: Int32("22")!)
    • 无需使用 '.init' 进行初始化。简单写: NSNumber(value: Int32("22")!)
    【解决方案5】:

    如果必须使用NSNumberFormatter,可以使用以下代码。 使用Wezly的方法更简单。

    let formatter = NSNumberFormatter()
    formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle;
    if let number = formatter.numberFromString("42") {
        println(number)
    }
    

    【讨论】:

    • 另请注意,NSNumberFormatter 的创建成本很高,应尽可能缓存,而不是每次使用时都创建。
    【解决方案6】:

    我确实在 swift 3/4 中使用了扩展,这很酷。

    extension String {
        var numberValue: NSNumber? {
            if let value = Int(self) {
                return NSNumber(value: value)
            }
            return nil
        }
    }
    

    然后只需使用以下代码:

    stringVariable.numberValue
    

    很酷的是,您不需要一连串if 语句来解开可选值。 例如,

    if let _ = stringVariable, let intValue = Int(stringVariable!) {
        doSomething(NSNumber.init(value: intValue))
    }
    

    可以替换为:

    doSomething(stringVariable?.numberValue)
    

    【讨论】:

      【解决方案7】:

      斯威夫特 5

      let myInt = NumberFormatter().number(from: "42")
      

      【讨论】:

        【解决方案8】:

        ("23" as NSString).integerValue ("23.5" as NSString).doubleValue

        等等。

        【讨论】:

          【解决方案9】:

          尝试一次

          let myString = "123"
          let myInt = NSNumber(value: Int(myString) ?? 0)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多