关于ios:使用Swift将String转换为Int

Converting String to Int with Swift

该应用程序基本上通过输入初始和最终速度和时间来计算加速度,然后使用公式来计算加速度。 但是,由于文本框中的值是字符串,我无法将它们转换为整数。

1
2
3
4
5
6
7
8
9
10
11
12
@IBOutlet var txtBox1 : UITextField
@IBOutlet var txtBox2 : UITextField
@IBOutlet var txtBox3 : UITextField
@IBOutlet var lblAnswer : UILabel


@IBAction func btn1(sender : AnyObject) {

    let answer1 ="The acceleration is"
    var answer2 = txtBox1
    var answer3 = txtBox2
    var answer4 = txtBox3


更新swift 2.0的答案:

toInt()方法给出了错误。因为,在Swift 2.x中,.toInt()函数已从String中删除。在替换中,Int现在有一个接受String的初始化器:

1
2
let a:Int? = Int(firstText.text)     // firstText is UITextField  
let b:Int? = Int(secondText.text)   // secondText is UITextField


基本的想法,请注意,这仅适用于Swift 1.x(查看ParaSara的答案,了解它在Swift 2.x中是如何工作的):

1
2
3
4
5
6
7
8
9
10
11
    // toInt returns optional that's why we used a:Int?
    let a:Int? = firstText.text.toInt() // firstText is UITextField
    let b:Int? = secondText.text.toInt() // secondText is UITextField

    // check a and b before unwrapping using !
    if a && b {
        var ans = a! + b!
        answerLabel.text ="Answer is \(ans)" // answerLabel ie UILabel
    } else {
        answerLabel.text ="Input values are not numeric"
    }

Swift 4的更新

1
2
3
4
...
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
...


myString.toInt() - 将字符串值转换为int。

Swift 3.x

如果你有一个隐藏在字符串中的整数,你可以使用整数的构造函数进行转换,如下所示:

1
let myInt = Int(textField.text)

与其他数据类型(Float和Double)一样,您也可以使用NSString进行转换:

1
2
let myString ="556"
let myInt = (myString as NSString).integerValue


Xcode 8.3.2? Swift 3.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class IntegerField: UITextField {
    var integer: Int {
        return string.digits.integer
    }
    override func willMove(toSuperview newSuperview: UIView?) {
        addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        keyboardType = .numberPad
        textAlignment = .right
        editingChanged()
    }
    func editingChanged() {
        text = Formatter.decimal.string(for: integer)
        print(integer)
    }
}

必需的扩展,结构和初始化器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
extension Sequence where Iterator.Element == UnicodeScalar {
    var string: String { return String(String.UnicodeScalarView(self)) }
}

extension Formatter {
    static let decimal = NumberFormatter(numberStyle: .decimal)
}

extension UITextField {
    var string: String { return text ??"" }
}

extension String {
    private static var digitsPattern = UnicodeScalar("0")..."9"
    var digits: String {
        return unicodeScalars.filter { String.digitsPattern ~= $0 }.string
    }
    var integer: Int { return Int(self) ?? 0 }
}

extension NumberFormatter {
    convenience init(numberStyle: Style) {
        self.init()
        self.numberStyle = numberStyle
    }
}


你想用NSNumberFormatter().numberFromString(yourNumberString)。它很棒,因为它返回一个可选项,然后您可以使用"if let"进行测试,以确定转换是否成功。
例如。

1
2
3
4
5
6
7
     var myString ="\(10)"
     if let myNumber = NSNumberFormatter().numberFromString(myString) {
          var myInt = myNumber.integerValue
          // do what you need to do with myInt
     } else {
          // what ever error code you need to write
     }


swift 4.0

1
2
3
4
5
6
7
8
9
let stringNumber ="123"
let number = Int(stringNumber) //here number is of type"Int?"


//using Forced Unwrapping

if number != nil {        
 //string is converted to Int
}

除了强制绑定之外,您还可以使用Optional Binding。

例如:

1
2
3
  if let number = Int(stringNumber) {
   // number is of type Int
  }

// Xcode 8.1和swift 3.0

我们也可以通过Optional Binding来处理它

1
2
3
4
5
6
let occur ="10"

if let occ = Int(occur) {
        print("By optional binding :", occ*2) // 20

    }

在Swift 4.2和Xcode 10.1中

1
2
3
4
5
6
7
8
9
let string:String ="789"
let intValue:Int = Int(string)!
print(intValue)

let integerValue:Int = 789
let stringValue:String = String(integerValue)
    //OR
//let stringValue:String ="\(integerValue)"
print(stringValue)

斯威夫特3

最简单,最安全的方法是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@IBOutlet var textFieldA  : UITextField
@IBOutlet var textFieldB  : UITextField
@IBOutlet var answerLabel : UILabel

@IBAction func calculate(sender : AnyObject) {

      if let intValueA = Int(textFieldA),
            let intValueB = Int(textFieldB) {
            let result = intValueA + intValueB
            answerLabel.text ="The acceleration is \(result)"
      }
      else {
             answerLabel.text ="The value \(intValueA) and/or \(intValueB) are not a valid integer value"
      }        
}

避免将键盘类型设置为数字键盘的无效值:

1
2
 textFieldA.keyboardType = .numberPad
 textFieldB.keyboardType = .numberPad


在Swift 4中:

1
2
3
4
5
6
7
8
extension String {            
    var numberValue:NSNumber? {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        return formatter.number(from: self)
    }
}
let someFloat ="12".numberValue

我做了一个简单的程序,你有2个txt字段你从用户输入并添加它们以使其更容易理解请找到下面的代码。

1
2
3
4
5
6
7
8
9
10
@IBOutlet weak var result: UILabel!
@IBOutlet weak var one: UITextField!
@IBOutlet weak var two: UITextField!

@IBAction func add(sender: AnyObject) {        
    let count = Int(one.text!)
    let cal = Int(two.text!)
    let sum = count! + cal!
    result.text ="Sum is \(sum)"
}

希望这可以帮助。


最新的swift3这段代码只是将字符串转换为int

1
2
let myString ="556"
let myInt = Int(myString)

关于int()和Swift 2.x:如果你在转换检查后得到一个nil值,如果你试图转换一个大数字的字符串(例如:1073741824),在这种情况下尝试:

1
let bytesInternet : Int64 = Int64(bytesInternetString)!


Swift 3.0

试试这个,你不需要检查我做过的所有条件只是使用这个功能。发送任何字符串,数字,浮点数,双精度等。你得到一个数字作为值,如果它无法转换你的值,则为0

功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func getNumber(number: Any?) -> NSNumber {
    guard let statusNumber:NSNumber = number as? NSNumber else
    {
        guard let statString:String = number as? String else
        {
            return 0
        }
        if let myInteger = Int(statString)
        {
            return NSNumber(value:myInteger)
        }
        else{
            return 0
        }
    }
    return statusNumber
}

用法:
在代码中添加上述函数并转换使用
let myNumber = getNumber(number: myString)
如果myString有一个数字或字符串,则返回数字,否则返回0

例1:

1
2
let number:String ="9834"
print("printing number \(getNumber(number: number))")

输出:printing number 9834

例2:

1
2
let number:Double = 9834
print("printing number \(getNumber(number: number))")

输出:printing number 9834

例3:

1
2
let number = 9834
print("printing number \(getNumber(number: number))")

输出:printing number 9834


对于String到Int和其他类型很有用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
extension String {
        //Converts String to Int
        public func toInt() -> Int? {
            if let num = NumberFormatter().number(from: self) {
                return num.intValue
            } else {
                return nil
            }
        }

        //Converts String to Double
        public func toDouble() -> Double? {
            if let num = NumberFormatter().number(from: self) {
                return num.doubleValue
            } else {
                return nil
            }
        }

        /// EZSE: Converts String to Float
        public func toFloat() -> Float? {
            if let num = NumberFormatter().number(from: self) {
                return num.floatValue
            } else {
                return nil
            }
        }

        //Converts String to Bool
        public func toBool() -> Bool? {
            return (self as NSString).boolValue
        }
    }

使用它像:

1
"123".toInt() // 123

由于字符串可能包含非数字字符,因此应使用guard来保护操作。例:

1
2
3
4
5
guard let labelInt:Int = Int(labelString) else {
    return
}

useLabelInt()

在Swift 2.x中,.toInt()函数已从String中删除。在替换中,Int现在有一个接受String的初始化器

INT(MyString的)

在您的情况下,您可以使用textField.text!.toInt()的Int(textField.text!)

Swift 1.x

1
2
let myString: String ="256"
let myInt: Int? = myString.toInt()

Swift 2.x,3.x

1
2
let myString: String ="256"
let myInt: Int? = Int(myString)

用这个:

1
2
3
4
5
6
7
8
9
10
11
// get the values from text boxes
    let a:Double = firstText.text.bridgeToObjectiveC().doubleValue
    let b:Double = secondText.text.bridgeToObjectiveC().doubleValue

//  we checking against 0.0, because above function return 0.0 if it gets failed to convert
    if (a != 0.0) && (b != 0.0) {
        var ans = a + b
        answerLabel.text ="Answer is \(ans)"
    } else {
        answerLabel.text ="Input values are not numberic"
    }

要么

从您的XIB或故事板中将您的UITextField KeyboardType设置为DecimalTab,并删除任何if条件以进行任何计算,即。

1
2
var ans = a + b
answerLabel.text ="Answer is \(ans)"

因为键盘类型是DecimalPad,所以没有机会输入其他0-9或。

希望这有帮助!!


这适合我

1
var a:Int? = Int(userInput.text!)


1
2
3
4
5
6
7
8
//  To convert user input (i.e string) to int for calculation.I did this , and it works.


    let num:Int? = Int(firstTextField.text!);

    let sum:Int = num!-2

    print(sum);

对于Swift3.x

1
2
3
4
5
6
7
8
9
extension String {
    func toInt(defaultValue: Int) -> Int {
        if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
            return n
        } else {
            return defaultValue
        }
    }
}

我最近遇到了同样的问题。以下解决方案对我有用:

1
2
        let strValue ="123"
        let result = (strValue as NSString).integerValue

替代解决方案。您可以使用本机类型的扩展名。你可以在游乐场测试。

1
2
3
4
5
6
7
8
9
10
extension String {
    func add(a: Int) -> Int? {
        if let b = Int(self) {
            return b + a
        }
        else {
            return nil
        }
    }    
}

"2"。新增(1)


Swift 5.0及以上版本

工作

如果您要拆分String,它会创建两个substrings而不是两个Strings。下面的方法将检查Any并将其转换为t0 NSNumber,它很容易将NSNumber转换为IntFloat您需要的数据类型。

实际代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Convert Any To Number Object Removing Optional Key Word.
public func getNumber(number: Any) -> NSNumber{
 guard let statusNumber:NSNumber = number as? NSNumber  else {
    guard let statString:String = number as? String else {
        guard let statSubStr : Substring = number as? Substring else {
            return 0
        }
        if let myInteger = Int(statSubStr) {
            return NSNumber(value:myInteger)
        }
        else{
            return 0
        }
    }

    if let myInteger = Int(statString) {
        return NSNumber(value:myInteger)
    }
    else if let myFloat = Float(statString) {
        return NSNumber(value:myFloat)
    }else {
        return 0
    }
}
return statusNumber }

用法

1
2
3
if let hourVal = getNumber(number: hourStr) as? Int {

}

传递String以检查并转换为Double

1
Double(getNumber(number:  dict["OUT"] ?? 0)


问题:字符串"4.0000"无法使用Int("4.000")转换为整数?

答案:Int()检查字符串是否为整数,如果是,则给出整数,否则为nil。但是Float或Double可以将任何数字字符串转换为相应的Float或Double而不给出nil。例如,如果你有"45"整数字符串但使用Float("45")给你45.0浮点值或使用Double("4567")给你45.0。

解决方案:NSString(字符串:"45.000")。integerValue或Int(Float("45.000")!)!得到正确的结果。


我的解决方案是对字符串到int转换进行一般扩展。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
extension String {

 // default: it is a number suitable for your project if the string is not an integer

    func toInt(default: Int) -> Int {
        if let result = Int(self) {
            return result
        }
        else {
            return default  
        }
    }

}

Swift中的Int包含一个接受String的初始化器。它返回一个可选的Int?因为如果字符串不包含数字,转换可能会失败。

通过使用if let语句,您可以验证转换是否成功。

所以你的代码变成这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@IBOutlet var txtBox1 : UITextField
@IBOutlet var txtBox2 : UITextField
@IBOutlet var txtBox3 : UITextField
@IBOutlet var lblAnswer : UILabel

@IBAction func btn1(sender : AnyObject) {

    let answer1 ="The acceleration is"
    var answer2 = txtBox1
    var answer3 = txtBox2
    var answer4 = txtBox3

    if let intAnswer = Int(txtBox1.text) {
      // Correctly converted
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@IBAction func calculateAclr(_ sender: Any) {
    if let addition = addition(arrayString: [txtBox1.text, txtBox2.text, txtBox3.text]) {
      print("Answer = \(addition)")
      lblAnswer.text ="\(addition)"
    }
}

func addition(arrayString: [Any?]) -> Int? {

    var answer:Int?
    for arrayElement in arrayString {
        if let stringValue = arrayElement, let intValue = Int(stringValue)  {
            answer = (answer ?? 0) + intValue
        }
    }

    return answer
}

至于快速3,我必须强迫我的#%@! string&int with"!"否则它只是不起作用。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
let prefs = UserDefaults.standard
var counter: String!
counter = prefs.string(forKey:"counter")
print("counter: \(counter!)")


var counterInt = Int(counter!)
counterInt = counterInt! + 1
print("counterInt: \(counterInt!)")

OUTPUT:
counter: 1
counterInt: 2


在Swift 4中将String值转换为Integer

1
2
3
4
5
let strValue:String ="100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!