ios - how - Convertir cadena a Int con Swift
string valueof swift (26)
A partir de Swift 3 , tengo que forzar mi #% @! string & int con un "!" de lo contrario simplemente no funciona.
Por ejemplo:
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
La aplicación básicamente calcula la aceleración ingresando la velocidad y el tiempo iniciales y finales, y luego usa una fórmula para calcular la aceleración. Sin embargo, como los valores en los cuadros de texto son cadenas, no puedo convertirlos a números enteros.
@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
Acerca de int () y Swift 2.x: si obtiene un valor nulo después de la verificación, si intenta convertir una cadena con un número grande (por ejemplo: 1073741824), en este caso intente:
let bytesInternet : Int64 = Int64(bytesInternetString)!
Debido a que una cadena puede contener caracteres no numéricos, debe usar una guard
para proteger la operación. Ejemplo:
guard let labelInt:Int = Int(labelString) else {
return
}
useLabelInt()
En Swift 4.2 y Xcode 10
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)
En Swift 4:
extension String {
var numberValue:NSNumber? {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter.number(from: self)
}
}
let someFloat = "12".numberValue
Esto funciona para mi
var a:Int? = Int(userInput.text!)
He creado un programa simple, en el que tiene 2 campos de texto, toma el formulario de entrada del usuario y los agrega para que sea más fácil de entender. Busque el código a continuación.
@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)"
}
espero que esto ayude.
Idea básica, tenga en cuenta que esto solo funciona en Swift 1.x (verifique la respuesta de ParaSara para ver cómo funciona en 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"
}
Actualización para Swift 4
...
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
...
Mi solución es tener una extensión general para la conversión de cadena a 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
}
}
}
Para la solución alternativa. Puede utilizar la extensión de un tipo nativo. Se puede probar con zona de juegos.
extension String {
func add(a: Int) -> Int? {
if let b = Int(self) {
return b + a
}
else {
return nil
}
}
}
"2" .add (1)
Pregunta: la cadena "4.0000" no se puede convertir en entero utilizando Int ("4.000")?
Respuesta: Int () la cadena de verificación es un número entero o no si es así y luego le da un número entero y de lo contrario nulo pero Float o Double pueden convertir cualquier cadena de número a respectivo Float o Double sin dar nil. Por ejemplo, si tiene una cadena de enteros "45" pero el uso de Float ("45") le da un valor flotante de 45.0 o el uso de Doble ("4567") le da 45.0.
Solución: NSString (cadena: "45.000"). IntegerValue o Int (Float ("45.000")!)! para obtener el resultado correcto.
Quieres usar NSNumberFormatter().numberFromString(yourNumberString)
. Es genial porque devuelve una opción que luego puede probar con un "if let" para determinar si la conversión fue exitosa. p.ej.
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
}
Recientemente tengo el mismo problema. A continuación la solución es trabajo para mí:
let strValue = "123"
let result = (strValue as NSString).integerValue
Utilizar esta:
// 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"
}
O
Haga su UITextField KeyboardType como DecimalTab desde su XIB o guión gráfico, y elimine cualquier condición if para realizar cualquier cálculo, es decir.
var ans = a + b
answerLabel.text = "Answer is /(ans)"
Debido a que el tipo de teclado es DecimalPad, no hay posibilidad de ingresar otro 0-9 o.
Espero que esto ayude !!
para Swift3.x
extension String {
func toInt(defaultValue: Int) -> Int {
if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
return n
} else {
return defaultValue
}
}
}
myString.toInt()
: convierte el valor de cadena en int.
Swift 3.x
Si tiene un entero oculto dentro de una cadena, puede convertir utilizando el constructor del entero, como este:
let myInt = Int(textField.text)
Al igual que con otros tipos de datos (flotante y doble), también puede convertir utilizando NSString:
let myString = "556"
let myInt = (myString as NSString).integerValue
En Swift 2.x, la función .toInt () se eliminó de String. En reemplazo, Int ahora tiene un inicializador que acepta una cadena
Int (myString)
En su caso, podría usar Int (textField.text!) En lugar 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)
// Xcode 8.1 y Swift 3.0
También podemos manejarlo por Encuadernación Opcional, Simplemente
let occur = "10"
if let occ = Int(occur) {
print("By optional binding :", occ*2) // 20
}
El último swift3 este código es simplemente para convertir la cadena a int
let myString = "556"
let myInt = Int(myString)
Respuesta de actualización para swift 2.0 :
toInt()
método toInt()
recibe un error. Porque, en Swift 2.x, la función .toInt()
se eliminó de String. En reemplazo, Int ahora tiene un inicializador que acepta una cadena:
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
Swift 3.0
Intente esto, no necesita verificar ninguna condición. He hecho todo, solo use esta función. Envía cualquier cadena, número, flotador, doble, etc. obtiene un número como valor o 0 si no puede convertir su valor
Función:
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
}
Uso: Agregue la función anterior en el código y para convertir use let myNumber = getNumber(number: myString)
si myString
tiene un número o una cadena, devuelve el número; de lo contrario, devuelve 0
Ejemplo 1:
let number:String = "9834"
print("printing number /(getNumber(number: number))")
Salida: printing number 9834
Ejemplo 2:
let number:Double = 9834
print("printing number /(getNumber(number: number))")
Salida: printing number 9834
Ejemplo 3:
let number = 9834
print("printing number /(getNumber(number: number))")
Salida: printing number 9834
Swift 3
La forma más sencilla y segura es:
@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"
}
}
Evite valores no válidos estableciendo el tipo de teclado en el teclado numérico:
textFieldA.keyboardType = .numberPad
textFieldB.keyboardType = .numberPad
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)
}
}
Extensiones requeridas, estructuras e inicializadores:
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
}
}
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
}
También puede utilizar el enlace opcional que no sea el enlace forzado.
p.ej:
if let number = Int(stringNumber) {
// number is of type Int
}
// 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);
@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
}