L'application calcule essentiellement l'accélération en saisissant la vitesse et le temps initial et final, puis utilise une formule pour calculer l'accélération. Cependant, comme les valeurs dans les zones de texte sont des chaînes, je ne parviens pas à les convertir en nombres entiers.
@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
Idée de base, notez que cela ne fonctionne que dans Swift 1.x (consultez Réponse de ParaSara pour voir comment cela fonctionne dans 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"
}
Mise à jour pour Swift 4
...
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
...
Update Update for Swift 2.0 :
La méthode toInt()
reçoit une erreur. Parce que, dans Swift 2.x, la fonction .toInt()
a été supprimée de String. En remplacement, Int a maintenant un initialiseur qui accepte une chaîne:
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
myString.toInt()
- convertit la valeur de la chaîne en int.
Swift 3.x
Si vous avez un entier caché à l'intérieur d'une chaîne, vous pouvez convertir en utilisant le constructeur de l'entier, comme ceci:
let myInt = Int(textField.text)
Comme avec les autres types de données (Float et Double), vous pouvez également convertir à l'aide de NSString:
let myString = "556"
let myInt = (myString as NSString).integerValue
Xcode 8.3.2 • Swift 3.1
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)
}
}
Extensions, structures et initialiseurs requis:
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
}
}
Vous voulez utiliser NSNumberFormatter().numberFromString(yourNumberString)
. C’est génial car il renvoie une option que vous pouvez ensuite tester avec un "if let" pour déterminer si la conversion a réussi. par exemple.
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
let stringNumber = "123"
let number = Int(stringNumber) //here number is of type "Int?"
//using Forced Unwrapping
if number != nil {
//string is converted to Int
}
vous pouvez également utiliser une liaison facultative autre qu'une liaison forcée.
par exemple:
if let number = Int(stringNumber) {
// number is of type Int
}
// Xcode 8.1 et Swift 3.0
Nous pouvons également le gérer par liaison facultative, simplement
let occur = "10"
if let occ = Int(occur) {
print("By optional binding :", occ*2) // 20
}
Swift 3
Le moyen le plus simple et le plus sûr est:
@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"
}
}
Evitez les valeurs invalides en configurant le type de clavier sur le pavé numérique:
textFieldA.keyboardType = .numberPad
textFieldB.keyboardType = .numberPad
Dans Swift 4:
extension String {
var numberValue:NSNumber? {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter.number(from: self)
}
}
let someFloat = "12".numberValue
j'ai créé un programme simple dans lequel vous avez 2 champs de texte que vous prenez en entrée de l'utilisateur et que vous ajoutez pour simplifier la compréhension.
@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)"
}
j'espère que cela t'aides.
Swift 3.0
Essayez ceci, vous n’avez besoin de vérifier aucune condition. J’ai tout fait, utilisez cette fonction. Envoyez n'importe quoi chaîne, numéro, float, double, etc. vous obtenez un nombre sous forme de valeur ou 0 s'il est incapable de convertir votre valeur
Une fonction:
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
}
Utilisation: Ajouter la fonction ci-dessus dans le code et convertir utiliser let myNumber = getNumber(number: myString)
si la myString
a un nombre ou une chaîne, elle retourne le nombre sinon elle retourne 0
Exemple 1:
let number:String = "9834"
print("printing number \(getNumber(number: number))")
Sortie: printing number 9834
Exemple 2:
let number:Double = 9834
print("printing number \(getNumber(number: number))")
Sortie: printing number 9834
Exemple 3:
let number = 9834
print("printing number \(getNumber(number: number))")
Sortie: printing number 9834
Latest Swift3 ce code consiste simplement à convertir une chaîne en int
let myString = "556"
let myInt = Int(myString)
À propos de int () et de Swift 2.x: si vous obtenez une valeur nulle après la conversion, cochez si vous essayez de convertir une chaîne avec un grand nombre (par exemple: 1073741824), dans ce cas, essayez:
let bytesInternet : Int64 = Int64(bytesInternetString)!
Dans Swift 4.2 et Xcode 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)
Comme une chaîne peut contenir des caractères non numériques, vous devez utiliser une variable guard
pour protéger l'opération. Exemple:
guard let labelInt:Int = Int(labelString) else {
return
}
useLabelInt()
// 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);
pour Swift3.x
extension String {
func toInt(defaultValue: Int) -> Int {
if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
return n
} else {
return defaultValue
}
}
}
Utilisez ceci:
// 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"
}
OR
Créez votre UITextField KeyboardType en tant que DecimalTab à partir de votre XIB ou de votre storyboard, et supprimez toute condition if pour effectuer un calcul, par exemple.
var ans = a + b
answerLabel.text = "Answer is \(ans)"
Comme le type de clavier est DecimalPad, il n’ya aucune chance de saisir d’autres 0-9 ou.
J'espère que cette aide !!
Dans Swift 2.x, la fonction .toInt () a été supprimée de String. En remplacement, Int a maintenant un initialiseur qui accepte un String
Int (myString)
Dans votre cas, vous pouvez utiliser Int (textField.text!) Au lieu de textField.text! .ToInt ()
Swift 1.x
let myString: String = "256"
let myInt: Int? = myString.toInt()
Swift 2.x, 3.x
let myString: String = "256"
let myInt: Int? = Int(myString)
Ça marche pour moi
var a:Int? = Int(userInput.text!)
Utile pour String to Int et d'autres types
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
}
}
Utilisez-le comme:
"123".toInt() // 123
Question: la chaîne "4.0000" ne peut pas être convertie en entier avec Int ("4.000")?
Réponse: La chaîne de vérification Int () est un entier ou pas si oui, alors vous donnez un entier et sinon, nil. mais Float ou Double peut convertir n’importe quelle chaîne numérique en Float ou Double respectif sans donner nil. Exemple si vous avez une chaîne entière "45" mais que l'utilisation de Float ("45") vous donne une valeur de 45,0 float ou que vous utilisez Double ("4567") de 45,0.
Solution: NSString (chaîne: "45.000"). IntegerValue ou Int (Float ("45.000")!)! pour obtenir un résultat correct.
Ma solution consiste à avoir une extension générale pour la conversion de chaîne en entier.
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 5.0 et supérieur
Travailler
Si vous divisez la String
, cela crée deux substrings
et non deux Strings
. La méthode ci-dessous vérifie la valeur Any
et la convertit en NSNumber
. Il est facile de convertir une NSNumber
en Int
, Float
quel que soit le type de données dont vous avez besoin.
Code actuel
//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 }
Utilisation
if let hourVal = getNumber(number: hourStr) as? Int {
}
Passer String
pour vérifier et convertir en Double
Double(getNumber(number: dict["OUT"] ?? 0)
À partir de Swift 3 , je dois forcer mon #% @! string & int avec un "!" sinon ça ne marche pas.
Par exemple:
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
pour solution alternative. Vous pouvez utiliser l'extension d'un type natif. Vous pouvez tester avec terrain de jeu.
extension String {
func add(a: Int) -> Int? {
if let b = Int(self) {
return b + a
}
else {
return nil
}
}
}
"2" .add (1)
@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
}
Un Int dans Swift contient un initialiseur qui accepte une chaîne. Il retourne un Int optionnel? car la conversion peut échouer si la chaîne ne contient pas un nombre.
En utilisant une instruction if let, vous pouvez valider si la conversion a réussi.
Donc, votre code devient quelque chose comme ça:
@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
}
}
J'ai récemment eu le même problème. La solution ci-dessous est un travail pour moi:
let strValue = "123"
let result = (strValue as NSString).integerValue