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

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)

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.


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

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

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

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.


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)

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

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


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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.