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

Swift 4のアップデート

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

この作品に感謝します。ただし、数値に浮動小数点も含めたいので、問題があります。再度、感謝します。
Marwan Qasem 14年

4
浮動小数点数が必要な場合(そして本当に浮動小数点数ではなくDoubleが必要な場合)、toInt()はそれを行いません。想像力と利用可能なドキュメントを使用して、適切な関数を見つけられますか?
gnasher729 2014年

4
わかります'NSString' does not have a member named 'toInt'。何か案は?
Matej 2014年

1
NSStringおよびString2つの異なるオブジェクトであり、メソッドも異なります。NSStringと呼ばれるメソッドがあります.intValue
Byron Coetsee 2015年

7
このソリューションはSwiftにのみ適切で、Swift2には適切ではありませんでした。今すぐ使用する必要があります:Int(firstText.text)
gurehbgui

337

swift 2.0の回答を更新

toInt()メソッドにはエラーが発生します。なぜなら、Swift 2.xでは、この.toInt()関数はStringから削除されたからです。代わりに、Intには文字列を受け入れる初期化子があります。

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)!していますが、それでもオプションが表示されます。どうして?開封していませんか?
ハニー、

文字列がの場合、これはクラッシュしますnil。この場合のように、文字列がUI要素からのものである場合は、発生しない可能性があります。ただし、クラッシュを防ぐ1つの方法は、デフォルト値を文字列に追加することですlet a:Int? = Int(firstText.text ?? "")
Jens

85

myString.toInt() -文字列値をintに変換します。

Swift 3.x

文字列内に整数が隠れている場合は、次のように整数のコンストラクタを使用して変換できます。

let myInt = Int(textField.text)

他のデータ型(FloatおよびDouble)と同様に、NSStringを使用して変換することもできます。

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

1
これは実際に質問に答えます。他のすべては、整数として文字列として
惰走

1
Swift 3の例?
Peter Kreinz、2016年

plsは、後世に期待される混乱の欠如のために「最新のSwiftバージョン」を明確化します:)
Alex Hall

@aremvee整数を文字列として「キャスト」するという意味ですか?そして、これは正確に何をしますか?
アレックスホール

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の値です
ブレインレイ2015年

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.2Xcodeの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)

に関して:Int(string)!文字列がnilの場合、Int?optionalはnilになり、nil optionalをアンラップするとクラッシュします
jcpennypincher

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

Swift 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

Swift 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から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桁の数字で機能していましたが、最近失敗し始めました。
ライアンボイド

3

最新のswift3このコードは単に文字列をintに変換するためのものです

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

2

文字列には数値以外の文字が含まれている可能性があるguardため、操作を保護するにはa を使用する必要があります。例:

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

これはコメントで与えられた解決策とどう違うのですか?
2015年

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()チェック文字列が整数であるかどうか。しかし、FloatまたはDoubleは、nilを指定せずに、任意の数値文字列をそれぞれのFloatまたはDoubleに変換できます。「45」の整数文字列があるがFloat( "45")を使用すると45.0 float値が得られる、または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

Swift 5.0以降

ワーキング

分割するString場合は、2 つではsubstringsなく2つ作成されますStrings。方法下記これがチェックされますAnyし、それをT0変換NSNumber変換するその簡単NSNumberIntFloatデータが必要なタイプ今まで何を。

実際のコード

//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 string to 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

とおりSWIFT 3、私は私の#%を強制的に持っています@!「!」を含む文字列と整数 それ以外の場合は機能しません。

例えば:

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

私見、オプションを強制的にアンラップしないでください。使用guardif let説明を好む
マーティン

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