Swift를 사용하여 문자열을 Int로 변환


352

이 응용 프로그램은 기본적으로 초기 및 최종 속도와 시간을 입력하여 가속을 계산 한 다음 공식을 사용하여 가속을 계산합니다. 그러나 텍스트 상자의 값은 문자열이므로 정수로 변환 할 수 없습니다.

@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

7
시도하지는 않았지만 다음과 같은 값을 캐스팅 할 수 있습니다.var answer1 = Int(txtBox1.text)
Daniel

문자열이 "23.0"이라고 가정하면 Int ( "23.0")로 캐스트하면 nil을 반환합니다.이 경우 먼저 Double / Float로 캐스트 한 다음 다시 Int로 캐스트해야합니다.
Ariven Nadar

답변:


326

기본 아이디어, 이것은 Swift 1.x에서만 작동한다는 점에 유의하십시오 ( Swift 2.x에서 어떻게 작동하는지 보려면 ParaSara의 답변 을 확인하십시오).

    // 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"
    }

스위프트 4 업데이트

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

고마워요. 그러나 숫자에 부동 소수점도 포함시키기를 원하기 때문에 문제가 있습니다. 다시 감사합니다.
Marwan Qasem 2018 년

4
float가 필요하고 실제로 float가 아닌 Double을 원한다면 toInt ()는 그렇게하지 않습니다. 상상력과 사용 가능한 문서를 사용하여 적합한 기능을 찾을 수 있습니까?
gnasher729

4
나는 얻는다 'NSString' does not have a member named 'toInt'. 어떤 아이디어?
Matej

1
NSString그리고 String두 개의 서로 다른 개체와 다른 방법이있다. NSString라는 방법이있다.intValue
바이런 Coetsee

7
이 솔루션은 Swift2에만 적합하지 않은 Swift에만 적합했습니다. 이제 당신은 사용해야합니다 : Int (firstText.text)
gurehbgui

337

swift 2.0 업데이트 답변 :

toInt()방법에 오류가 발생했습니다. Swift 2.x에서는 .toInt()함수가 문자열에서 제거 되었기 때문 입니다. 대신, Int는 이제 String을 허용하는 이니셜 라이저를 갖습니다.

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

''를 생략하면 왜 오류가 발생하는지 물어볼 수 있습니까? 숯? 'a'를 선택 사항으로 명시해야하는 이유는 무엇입니까?
Manos Serifios 2016 년

1
@ManosSerifios이 토론이 도움이 될 수도 있습니다 : stackoverflow.com/questions/32621022/…
Paraneetharan Saravanaperumal

실제로 관련이 없지만 생성자 접근 방식은 항상 선호되며 Int to Strings에서 더 읽기 쉽습니다. "\(someInt)"좋지 않다는 String(someInt)읽기가 훨씬 쉽다
Honey

인쇄 Int(firstText.text)!중이며 여전히 옵션이 표시됩니다. 왜? 포장을 풀지 않았습니까?
Honey

문자열이 인 경우 충돌이 발생합니다 nil. 이 경우와 같이 문자열이 UI 요소에서 나오는 경우에는 발생할 수 없습니다. 그러나 충돌을 방지하는 한 가지 방법은 문자열에 기본값을 추가하는 것 let a:Int? = Int(firstText.text ?? "")입니다.
Jens

85

myString.toInt() -문자열 값을 int로 변환합니다.

스위프트 3.x

문자열 안에 정수가 숨겨져 있으면 다음과 같이 정수의 생성자를 사용하여 변환 할 수 있습니다.

let myInt = Int(textField.text)

다른 데이터 유형 (Float 및 Double)과 마찬가지로 NSString을 사용하여 변환 할 수도 있습니다.

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

1
이 실제로 다른 사람의 모든 해안에 그가 요구 한 것이 아니다 문자열로 정수, 어떻게 OP에게, 질문에 대한 답
aremvee

1
스위프트 3의 예?
피터 크라이 츠

pls는 후손의 희망 혼란 부족에 대한 "최신 스위프트 버전"을 명확히 :)
Alex Hall

@aremvee 정수를 문자열로 "캐스트"한다는 의미입니까? 그리고 이것은 다른 답변이하지 않는 질문에 정확히 어떻게 대응합니까?
Alex Hall

31

편집 / 업데이트 : Xcode 11.4 • Swift 5.2

코드를 통해 주석을 확인하십시오


IntegerField.swift 파일 내용 :

import UIKit

class IntegerField: UITextField {

    // returns the textfield contents, removes non digit characters and converts the result to an integer value
    var value: Int { string.digits.integer ?? 0 }

    var maxValue: Int = 999_999_999
    private var lastValue: Int = 0

    override func willMove(toSuperview newSuperview: UIView?) {
        // adds a target to the textfield to monitor when the text changes
        addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        // sets the keyboard type to digits only
        keyboardType = .numberPad
        // set the text alignment to right
        textAlignment = .right
        // sends an editingChanged action to force the textfield to be updated
        sendActions(for: .editingChanged)
    }
    // deletes the last digit of the text field
    override func deleteBackward() {
        // note that the field text property default value is an empty string so force unwrap its value is safe
        // note also that collection remove at requires a non empty collection which is true as well in this case so no need to check if the collection is not empty.
        text!.remove(at: text!.index(before: text!.endIndex))
        // sends an editingChanged action to force the textfield to be updated
        sendActions(for: .editingChanged)
    }
    @objc func editingChanged() {
        guard value <= maxValue else {
            text = Formatter.decimal.string(for: lastValue)
            return
        }
        // This will format the textfield respecting the user device locale and settings
        text = Formatter.decimal.string(for: value)
        print("Value:", value)
        lastValue = value
    }
}

프로젝트에 이러한 확장을 추가해야합니다.


확장자 UITextField.swift 파일 내용 :

import UIKit
extension UITextField {
    var string: String { text ?? "" }
}

확장명 Formatter.swift 파일 내용 :

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

확장자 NumberFormatter.swift 파일 내용 :

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

확장명 StringProtocol.swift 파일 내용 :

extension StringProtocol where Self: RangeReplaceableCollection {
    var digits: Self { filter(\.isWholeNumber) }
    var integer: Int? { Int(self) }
}

샘플 프로젝트


27

사용할 수 있습니다 NSNumberFormatter().numberFromString(yourNumberString). if let전환이 성공했는지 테스트 하기 위해 테스트 할 수있는 선택 사항을 반환하기 때문에 좋습니다 . 예.

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
}

스위프트 5

var myString = "\(10)"
if let myNumber = NumberFormatter().number(from: myString) {
    var myInt = myNumber.intValue
    // do what you need to do with myInt
  } else {
    // what ever error code you need to write
  }

1
Xcode 7이 'intValue'로 빌드되지 않으므로 방금 'myNumber.integerValue'로 변경했습니다. 후자는 Int32 값입니다
brainray

21

스위프트 4.0

let stringNumber = "123"
let number = Int(stringNumber) //here number is of type "Int?"


//using Forced Unwrapping

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

강제 바인딩 이외의 선택적 바인딩을 사용할 수도 있습니다.

예 :

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

14

// Xcode 8.1 및 swift 3.0

옵션 바인딩으로 간단히 처리 할 수도 있습니다.

let occur = "10"

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

    }

11

에서 스위프트 4.2엑스 코드 10.1

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)

7

스위프트 3

가장 간단하고 안전한 방법은 다음과 같습니다.

@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"
      }        
}

키보드 유형을 숫자 패드로 설정하는 잘못된 값을 피하십시오.

 textFieldA.keyboardType = .numberPad
 textFieldB.keyboardType = .numberPad

7

스위프트 4에서 :

extension String {            
    var numberValue:NSNumber? {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        return formatter.number(from: self)
    }
}
let someFloat = "12".numberValue

4

2 txt 필드가있는 간단한 프로그램을 만들었습니다. 입력 양식을 사용자에게 가져 와서 이해하기 쉽도록 추가하여 아래 코드를 찾으십시오.

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

도움이 되었기를 바랍니다.


4

스위프트 3.0

시도해보십시오. 모든 기능을 수행 한 모든 상태를 확인하지 않아도됩니다. 문자열, 숫자, 부동 소수점, 이중 등을 보내십시오. 숫자를 값으로 얻거나 값을 변환 할 수없는 경우 0을 얻습니다

함수:

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 :

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

산출: printing number 9834

예 2 :

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

산출: printing number 9834

예 3 :

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

산출: printing number 9834


4

String to Int 및 기타 유형에 유용

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
        }
    }

다음과 같이 사용하십시오.

"123".toInt() // 123

3

int () 및 Swift 2.x 정보 : 변환 검사 후 nil 값을 얻는 경우 큰 숫자 (예 : 1073741824)로 문자열을 변환하려고하면 다음을 시도하십시오.

let bytesInternet : Int64 = Int64(bytesInternetString)!

1
고맙습니다.이 사건에 도움이되었습니다. Int ()는 16 자리 숫자로 나를 위해 일했지만 최근에 실패하기 시작했습니다.
Ryan Boyd

3

최신 swift3 이 코드는 단순히 문자열을 int로 변환하는 것입니다.

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

2

문자열에 숫자가 아닌 문자가 포함될 수 있으므로 a guard를 사용하여 작업을 보호해야합니다. 예:

guard let labelInt:Int = Int(labelString) else {
    return
}

useLabelInt()

2

최근에 같은 문제가 발생했습니다. 아래 솔루션이 나를 위해 일합니다.

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

1

이것을 사용하십시오 :

// 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 조건을 제거하십시오.

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

키보드 유형이 DecimalPad이므로 다른 0-9 또는을 입력 할 기회가 없습니다.

이 도움을 바랍니다!


1
//  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);

1

이것은 나를 위해 작동

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

이것은 의견에 제공된 솔루션과 어떻게 다릅니 까?
Prune

2
주석에 제공된 해결책에 "!"이 없습니다. Swift 2 이상에서 예상됩니다
Naishta

1

Swift3.x 용

extension String {
    func toInt(defaultValue: Int) -> Int {
        if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
            return n
        } else {
            return defaultValue
        }
    }
}

0

대체 솔루션. 확장은 기본 유형을 사용할 수 있습니다. 운동장에서 테스트 할 수 있습니다.

extension String {
    func add(a: Int) -> Int? {
        if let b = Int(self) {
            return b + a
        }
        else {
            return nil
        }
    }     
}

"2".add (1)


0

내 해결책은 문자열을 int로 변환하는 일반적인 확장 기능을 사용하는 것입니다.

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  
        }
    }

}

0
@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
}

0

질문 : 문자열 "4.0000"을 Int ( "4.000")를 사용하여 정수로 변환 할 수 없습니까?

답변 : Int () 검사 문자열이 정수인지 여부입니다. 그렇다면 정수를, 그렇지 않으면 nil을 지정하십시오. Float 또는 Double은 nil을 지정하지 않고 임의의 숫자 문자열을 각각의 Float 또는 Double로 변환 할 수 있습니다. 예를 들어 "45"정수 문자열이 있지만 Float ( "45")를 사용하면 45.0 부동 소수점 값을 제공하거나 Double ( "4567")을 사용하면 45.0이 표시됩니다.

해결책 : NSString (string : "45.000"). integerValue 또는 Int (Float ( "45.000")!)! 올바른 결과를 얻을 수 있습니다.


0

Swift의 Int에는 문자열을 허용하는 이니셜 라이저가 포함되어 있습니다. 선택적 Int? 문자열에 숫자가 없으면 변환이 실패 할 수 있습니다.

if let 문을 사용하면 변환 성공 여부를 확인할 수 있습니다.

따라서 코드는 다음과 같습니다.

@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
    }
}

0

스위프트 5.0 이상

분할하는 String경우 두 개가 substrings아닌 두 개를 만듭니다 Strings. 아래의 메소드는 a 를 변환하기 쉽고 , 어떤 데이터 유형이 필요한지 확인 Any하고 변환 합니다.NSNumberNSNumberIntFloat

실제 코드

//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 }

용법

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

}

String확인하고 변환하기 위해 전달Double

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

0

Swift5 float 또는 int 문자열을 int로 :

extension String {
    func convertStringToInt() -> Int {
        return Int(Double(self) ?? 0.0)
    }
}

let doubleStr = "4.2"
// print 4
print(doubleStr.convertStringToInt())

let intStr = "4"
// print 4
print(intStr.convertStringToInt())

-1

현재로 빠른 3 , 나는 나의 # %의 강제해야 @! "!"문자열 & int 그렇지 않으면 그냥 작동하지 않습니다.

예를 들면 다음과 같습니다.

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

그냥 할 수 없어 var counterInt = counter.map { Int($0) }? 어디에서 counter누가String?
마틴

@Martin-아니요.? 선택 사항이므로 카운터 문자열에 "선택 사항"이라는 단어를 추가합니다.
Sam B

IMHO, 선택 사항을 강제로 풀지 마십시오. 사용 guardif let진술 선호
Martin

-1

Swift 4에서 문자열 값을 정수로 변환

let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.