ChatGPT解决这个技术问题 Extra ChatGPT

使用 Swift 将 String 转换为 Int

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

@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
没有尝试过,但也许您可以转换 var answer1 = Int(txtBox1.text) 之类的值
如果您的字符串假设为“23.0”,那么如果您将其转换为 Int("23.0"),它将返回 nil,对于这种情况,您首先需要转换为 Double/Float,然后再次转换为 Int。

P
Pranav Kasetti

Swift 2.0+ 的更新答案:

toInt() 方法给出错误,因为它已从 Swift 2.x 中的 String 中删除。相反,Int 类型现在有一个接受 String 的初始化程序:

let a: Int? = Int(firstTextField.text)
let b: Int? = Int(secondTextField.text)

我能问一下为什么我在省略“?”时会出错?字符?为什么我需要将“a”声明为可选?
@ManosSerifios 这个讨论可能会有所帮助:stackoverflow.com/questions/32621022/…
并不真正相关,但构造函数方法对于 Int to Strings 始终是首选且更具可读性。 "\(someInt)" 不好 String(someInt) 更容易阅读
我正在打印 Int(firstText.text)!,然后我仍然看到可选的。为什么?我没有拆开它吗?
当字符串为 nil 时,这将崩溃。当字符串来自这种情况下的 UI 元素时,可能不会发生。但防止崩溃的一种方法是向字符串添加默认值:let a:Int? = Int(firstText.text ?? "")
A
Anton Belousov

基本理念,请注意,这只适用于 Swift 1.x(查看 ParaSara's answer 了解它在 Swift 2.x 中的工作方式):

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

谢谢这个作品。但是,我有一个问题,因为我希望数字也包括浮点数。再次感谢。
如果你需要浮点数(你真的想要 Double,而不是浮点数), toInt() 不会这样做。你能用你的想象力和可用的文档来找到一个合适的函数吗?
我得到'NSString' does not have a member named 'toInt'。有任何想法吗?
NSStringString 是两个不同的对象,具有不同的方法。 NSString 有一个名为 .intValue 的方法
这个解决方案只适用于 Swift 而不适用于 Swift2。现在你应该使用: Int(firstText.text)
K
Kumar KL

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

斯威夫特 3.x

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

let myInt = Int(textField.text)

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

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

这实际上回答了这个问题,所有其他人都告诉 OP 如何将整数作为字符串滑行,这不是他要问的
请澄清“最新的 Swift 版本”,以免后人产生混淆 :)
@aremvee您的意思是“将”整数“转换”为字符串吗?这到底是做什么的,它回答了其他答案没有回答的问题?
T
Theo

您可以使用 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
  }

我只是将其更改为“myNumber.integerValue”,因为 Xcode 7 不会使用“intValue”构建。后者是 Int32 值
L
Leo Dabus

编辑/更新: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 ?? "" }
}

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

Sample project


O
OOMMEN

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

C
CupawnTae

//Xcode 8.1 和 swift 3.0

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

let occur = "10"

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

    }

L
Leo Dabus

在 Swift 4.2 和 Xcode 10.1 中

let string = "789"
if let intValue = Int(string) {
    print(intValue)
}

let integerValue = 789
let stringValue = String(integerValue)

或者

let stringValue = "\(integerValue)"
print(stringValue)

关于:Int(字符串)!如果字符串为零,则 Int? optional 将是 nil ,然后解开 nil optional 将导致崩溃
@jcpennypincher,你能更新答案吗?或发布新答案,它可以对其他人有所帮助。谢谢你。
J
John R Perry

斯威夫特 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

g
garg

在 Swift 4 中:

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

V
Viral Savaliya

对 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

c
chedabob

我制作了一个简单的程序,其中您有 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)"
}

希望这可以帮助。


K
Koushik

斯威夫特 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


A
Alessandro Ornano

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

let bytesInternet : Int64 = Int64(bytesInternetString)!

谢谢你这对我的案子有用。 Int() 使用 16 位数字为我工作,但最近开始失败。
s
shim

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

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

R
RonTLV

因为字符串可能包含非数字字符,您应该使用 guard 来保护操作。例子:

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

useLabelInt()

N
Nirmalsinh Rathod

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

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

f
fzh

Swift5 将浮点数或整数字符串转换为整数:

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

N
Narendar Singh Saini

用这个:

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

或者

将您的 UITextField KeyboardType 从您的 XIB 或情节提要中设为 DecimalTab,并删除任何 if 条件以进行任何计算,即。

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

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

希望这有帮助!


J
Jenny
//  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);

r
rptwsthi

这对我有用

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

这与评论中给出的解决方案有何不同?
评论中给出的解决方案缺少“!”最后,预计在 Swift 2 及更高版本中
D
DàChún

对于 Swift3.x

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

P
Pengguna

斯威夫特 4,斯威夫特 5

有不同的情况可以从某物转换为某物数据类型,这取决于输入。

如果输入数据类型是Any,我们必须在转换为实际数据类型之前使用as,然后再转换为我们想要的数据类型。例如:

func justGetDummyString() -> Any {
  return "2000"
}
let dummyString: String = (justGetDummyString() as? String) ?? "" // output = "2000"
let dummyInt: Int = Int(dummyString) ?? 0 // output = 2000

D
Durul Dalkanat

替代解决方案。您可以使用扩展本机类型。您可以在操场上进行测试。

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

“2”.add(1)


f
flame3

我的解决方案是对字符串到 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  
        }
    }

}

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

R
Ravi Kumar

问题:字符串“4.0000”不能使用 Int(“4.000”) 转换为整数?

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

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


P
Patrick

Swift 中的 Int 包含一个接受 String 的初始化程序。它返回一个可选的 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
    }
}

K
Koushik

Swift 5.0 及更高版本

在职的

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

实际代码

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

S
Sam B

从 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 - 没有。使其成为可选的,因此将“可选”一词添加到计数器字符串中。
恕我直言,你不应该强行打开你的选项。首选使用 guardif let 语句