73

I found a method to convert String to NSNumber, but the code is in Objective-C. I have tried converting it to Swift but it is not working.

The code I am using:

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

and in Swift I am using it in this way:

var i = NSNumberFormatter.numberFromString("42")

But this code is not working. What am I doing wrong?

pkamb
  • 33,281
  • 23
  • 160
  • 191
user2413621
  • 2,916
  • 7
  • 24
  • 28

9 Answers9

161

Swift 3.0

NSNumber(integer:myInteger) has changed to NSNumber(value:myInteger)

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

Swift 2.0

Use the Int() initialiser like this.

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

This can be done in one line if you already know the string will convert perfectly or you just don't care.

let myNumber = Int("42222222222")!

Swift 1.0

Use the toInt() method.

let someString = "42222222222"
if let myInteger = someString.toInt() {
    let myNumber = NSNumber(integer:myInteger)
    println(myNumber)
} else {
    println("'\(someString)' did not convert to an Int")
}
Community
  • 1
  • 1
Wez
  • 10,555
  • 5
  • 49
  • 63
16

Or do it just in one line:

NSNumberFormatter().numberFromString("55")!.decimalValue
polarware
  • 2,499
  • 1
  • 24
  • 18
  • 3
    Like David Berry commented below, be careful with creating NSNumberFormatters like this as they are expensive to create. Better caching or using a singleton if using the same formatter more than once. – Harry Bloom Dec 21 '17 at 13:13
  • 1
    Has been updated for Swift 5: ```NumberFormatter().number(from: "55")!``` – Anna Billstrom Nov 14 '20 at 23:21
9

In latest Swift:

let number = NumberFormatter().number(from: "1234")
Hemang
  • 26,840
  • 19
  • 119
  • 186
8

Swift 2

Try this:

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

Swift 3.x

 NSNumber(value: Int32("22")!)
Noor
  • 967
  • 7
  • 18
Vikram Biwal
  • 2,618
  • 1
  • 25
  • 36
6

You can use the following code if you must use NSNumberFormatter. It's simpler to use Wezly's method.

let formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle;
if let number = formatter.numberFromString("42") {
    println(number)
}
rakeshbs
  • 24,392
  • 7
  • 73
  • 63
  • 4
    Note also that `NSNumberFormatter` is expensive to create, and should be cached whenever possible instead of being created every time it's used. – David Berry Feb 19 '15 at 14:28
2

I do use extension in swift 3/4 and it's cool.

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

and then just use following code:

stringVariable.numberValue

What is cool is that you don't need a chain of if statements to unwrap the optional values. For instance,

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

can be replaced by:

doSomething(stringVariable?.numberValue)
Pei
  • 11,452
  • 5
  • 41
  • 45
2

Swift 5

let myInt = NumberFormatter().number(from: "42")
Manish
  • 608
  • 1
  • 11
  • 23
-1

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

and so on .

Ahmed Samir
  • 291
  • 3
  • 6
-5

Try Once

let myString = "123"
let myInt = NSNumber(value: Int(myString) ?? 0)
Rameshios
  • 1
  • 4