Obter valor inteiro da string em swift

134

Então eu posso fazer isso:

var stringNumb: NSString = "1357"

var someNumb: CInt = stringNumb.intValue

Mas não consigo encontrar a maneira de fazê-lo c / a String. Eu gostaria de fazer algo como:

var stringNumb: String = "1357"

var someNumb: Int = Int(stringNumb)

Isso também não funciona:

var someNumbAlt: Int = myString.integerValue
Logan
fonte
1
var someNumb: Int? = Int(stringNumb)ouvar someNumb = Int(stringNumb)
SwiftArchitect

Respostas:

179

Swift 2.0, você pode inicializar Inteiro usando o construtor

var stringNumber = "1234"
var numberFromString = Int(stringNumber)
Buru
fonte
14
No Swift 2.0, você não tem mais o toInt()método como parte dele String. Portanto, esse Intconstrutor é agora a única maneira de converter seqüências de caracteres em ints.
Morgan Wilde
1
O ponto e vírgula não é necessário
Sebastian
Pode dizer como lidar com se o usuário insere o número mais do que um número limite de Int64 no campo de texto
Khushboo Dhote
1
@Sebastian não é tão frustrante? :)
Victor
94

Eu usaria:

var stringNumber = "1234"
var numberFromString = stringNumber.toInt()
println(numberFromString)

Nota toInt():

Se a sequência representa um número inteiro que se encaixa em um Int, retorna o número inteiro correspondente.

CW0007007
fonte
5
Isso funcionou, mas se você declarar a var explicitamente, você precisa adicionar um ponto de exclamação: var someNumb: Int = stringNumber.toInt()!como @NateCook apontou
Logan
Não estou declarando isso explicitamente. O compilador sabe que numberFromString deve ser um int porque é inicializado como um ...
CW0007007
Eu sei que você não é, mas eu sou. Eu tive que fazer esse ajuste para fazer isso. Seu código está correto, basta adicioná-lo como um comentário.
Logan
Sim, ele retornará um valor apenas se o valor se encaixar em um Int, conforme indicado na nota. Caso contrário, ele retornará nulo ...
CW0007007 /
5
Em vez de colocar !na chamada, você pode declarar seu variável como opcional: someNumb: Int? = stringNumber.toInt(). Em seguida, o sistema de segurança de tipo estará ciente de que foopode não existir. É !claro que a colocação falhará se sua string não puder ser convertida em um número.
precisa saber é o seguinte
18

No Swift 3.0

Tipo 1: Converter NSString em String

    let stringNumb:NSString = "1357"
    let someNumb = Int(stringNumb as String) // 1357 as integer

Tipo 2: Se a String tiver apenas Inteiro

    let stringNumb = "1357"
    let someNumb = Int(stringNumb) // 1357 as integer

Tipo 3: se a cadeia tiver valor flutuante

    let stringNumb = "13.57"
    if let stringToFloat = Float(stringNumb){
        let someNumb = Int(stringToFloat)// 13 as Integer
    }else{
       //do something if the stringNumb not have digit only. (i.e.,) let stringNumb = "13er4"
    }
Rajamohan S
fonte
O código para "Tipo 3" não é ideal. Em vez de verificar stringToFloatis != nil, você deve usar if let.
Rdddy 17/07
11

O método que você deseja é toInt()- você deve ter um pouco de cuidado, pois toInt()retorna um Int opcional.

let stringNumber = "1234"
let numberFromString = stringNumber.toInt()
// numberFromString is of type Int? with value 1234

let notANumber = "Uh oh"
let wontBeANumber = notANumber.toInt()
// wontBeANumber is of type Int? with value nil
Nate Cook
fonte
mas da mesma forma, toInt()é o caminho certo para fazê-lo. opcionais são uma parte essencial da língua
Jiaaro
Obviamente, você só precisa estar ciente de que está trabalhando com um Int opcional, não com um Int.
Nate Cook
5

Se você é capaz de usar NSStringapenas um .

É bem parecido com o objetivo-c. Todo o tipo de dados existe, mas requer a as NSStringadição

    var x = "400.0" as NSString 

    x.floatValue //string to float
    x.doubleValue // to double
    x.boolValue // to bool
    x.integerValue // to integer
    x.intValue // to int

Também temos uma toInt()função adicionada. Consulte a Apple Inc. "A linguagem de programação Swift". iBooks. https://itun.es/us/jEUH0.l página 49

x.toInt()
John Riselvato
fonte
esqueceu de adicionar o as NSString. fixa-lo @gwcoffey
John Riselvato
2
Não quero usar o NSString, veja a pergunta.
Logan
4

a resposta acima não me ajudou, pois meu valor de string era "700,00"

com Swift 2.2 isso funciona para mim

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

Passei myInt para NSFormatterClass

let formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle
formatter.maximumFractionDigits = 0

let priceValue = formatter.stringFromNumber(myInt!)!

//Now priceValue is700

Graças a esta postagem no blog.

swiftBoy
fonte
1
Esta pergunta é sobre como obter um número inteiro de uma String. No seu caso, você não tem um Int, você tem um Double. No Swift, use Double()da mesma maneira que estamos usando Int(). Não há necessidade de usar a ponte para NSString.
Eric Aya
Hey @EricD, obrigado pela sua sugestão, mas " Eu queria o Inteiro somente porque estou passando Int para a classe NSNumberFormatter para conversor de moeda".
swiftBoy
1
Bem, neste caso, você pode usar Double() e usar Int(). Assim: if let d = Double("700.00") { let i = Int(d); print (i) }:)
Eric Aya
2

Você pode fazer a ponte de String para NSString e converter de CInt para Int assim:

var myint: Int = Int(stringNumb.bridgeToObjectiveC().intValue)
Connor
fonte
1

Eu escrevi uma extensão para esse fim. Sempre retorna um Int. Se a sequência não couber em um Int, é retornado 0.

extension String {
    func toTypeSafeInt() -> Int {
        if let safeInt = self.toInt() {
            return safeInt
        } else {
            return 0
        }
    }
}
timo-haas
fonte
2
Isto pode ser escrito de forma mais sucinta como return self.toInt() ?? 0. Provavelmente é melhor simplesmente escrever dessa maneira em linha do que ter um método de extensão para isso.
jlong64
0

Uma solução mais geral pode ser uma extensão

extension String {
    var toFloat:Float {
        return Float(self.bridgeToObjectiveC().floatValue)
    }
    var toDouble:Double {
        ....
    }
    ....
}

isso, por exemplo, estende o objeto String nativo rápido por toFloat

loopmasta
fonte
0

Converter String em Int no Swift 2.0:

var str:NSString = Data as! NSString
var cont:Int = str.integerValue

usar .intergerValue or intValue for Int32

Pablo Ruan
fonte
0

Probabilidades 8: 1 (*)

var stringNumb: String = "1357"
var someNumb = Int(stringNumb)

ou

var stringNumb: String = "1357"
var someNumb:Int? = Int(stringNumb)

Int(String)retorna um opcional Int?, não um Int.


Uso seguro: não desembrulhe explicitamente

let unwrapped:Int = Int(stringNumb) ?? 0

ou

if let stringNumb:Int = stringNumb { ... }

(*) Nenhuma das respostas realmente abordou por que var someNumb: Int = Int(stringNumb)não estava funcionando.

SwiftArchitect
fonte
Obrigado @ user3441734. Eu não deveria ter usado elenco .
SwiftArchitect
0

Maneira simples, mas suja

// Swift 1.2
if let intValue = "42".toInt() {
    let number1 = NSNumber(integer:intValue)
}
// Swift 2.0
let number2 = Int(stringNumber)

// Using NSNumber
let number3 = NSNumber(float:("42.42" as NSString).floatValue)

O caminho da extensão

Isso é melhor, realmente, porque funcionará bem com códigos de idioma e decimais.

extension String {

    var numberValue:NSNumber? {
        let formatter = NSNumberFormatter()
        formatter.numberStyle = .DecimalStyle
        return formatter.numberFromString(self)
    }
}

Agora você pode simplesmente fazer:

let someFloat = "42.42".numberValue
let someInt = "42".numberValue
Kevin R
fonte