在Swift中将字符串转换为NSNumber

73

我找到了一种将字符串转换为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 - TonyMkenu
9个回答

162

Swift 3.0

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

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

Swift 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")!

Swift 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")
}

1
我的数量是long long而不是integer,将integer替换为long long会显示错误吗? - user2413621
1
也许您可以更新您的问题,并提供您想要的字符串格式? - Wez
交换2.0和1.0的答案,将2.0置于顶部。 - SwiftArchitect
@SwiftArchitect 如果您认为我的答案结构可以更好,请随意进行编辑。 - Wez
如果我这样做,可能会被拒绝为“没有改进”(-: - SwiftArchitect
显示剩余4条评论

16

或者只需在一行中完成:

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

3
像David Berry在下面评论中所说的那样,使用此类NSNumberFormatter时要小心,因为创建它们的成本很高。最好进行缓存或者如果需要使用相同的格式化程序多次,则使用单例模式。 - Harry Bloom
1
已针对Swift 5进行更新: NumberFormatter().number(from: "55")! - Anna Billstrom

9
在最新的 Swift 中:
let number = NumberFormatter().number(from: "1234")

8

Swift 2

试试这个:

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

Swift 3.x

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

1
使用Swift 3.x,现在可以这样写:NSNumber.init(value: Int32("22")!) - Athir Nuaimi
2
NSNumber(value: Int32("22")!) - Peter Kreinz

6

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

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

4
请注意,NSNumberFormatter的创建成本很高,应尽可能缓存而不是每次使用时都创建它。 - David Berry

3

Swift 5

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

2

我在Swift 3/4中使用扩展(extension)功能,它非常酷。

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)

-1

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

等等。


-5
尝试一次。
let myString = "123"
let myInt = NSNumber(value: Int(myString) ?? 0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接