Estou tentando converter números retirados de um UITextField, que presumo que sejam na verdade Strings, e convertê-los em Float, para que possa multiplicá-los.
Eu tenho dois UITextfield
s que são declarados da seguinte forma:
@IBOutlet var wage: UITextField
@IBOutlet var hour: UITextField
Quando o usuário pressiona um UIButton, quero calcular os salários que o usuário ganha, mas não posso, pois preciso primeiro convertê-los em flutuadores, antes de poder usá-los.
Eu sei como convertê-los em um número inteiro fazendo o seguinte:
var wageConversion:Int = 0
wageConversion = wage.text.toInt()!
No entanto, não tenho ideia de como convertê-los em flutuadores.
fonte
NSString
temfloatValue
extensão, masString
não tem. Obter erro:'String' does not have member named floatValue
let floatValue = (Float)(Wage.text)
... Em Swift 2.0Porque em algumas partes do mundo, por exemplo, uma vírgula é usada em vez de um decimal. É melhor criar um NSNumberFormatter para converter uma string em float.
fonte
Eu converto String em Float desta forma:
fonte
NSString.floatValue
, que simplesmente retorna0
se algo estiver errado.). Observe queNSNumberFormatter
foi alteradoNumberFormatter
.Atualizar
A resposta aceita mostra uma forma mais atualizada de fazer
Swift 1
É assim que Paul Hegarty demonstrou na classe CS193p de Stanford em 2015:
Você pode até criar uma propriedade computada para não ter que fazer isso todas as vezes
fonte
Usando a solução aceita, eu estava descobrindo que meu "1.1" (ao usar a conversão .floatValue) seria convertido para 1.10000002384186, o que não era o que eu queria. No entanto, se eu usasse o .doubleValue em vez disso, obteria o 1.1 que queria.
Então, por exemplo, em vez de usar a solução aceita, usei esta:
No meu caso, não precisei de precisão dupla, mas usar o .floatValue não estava me dando o resultado adequado.
Só queria adicionar isso à discussão, caso outra pessoa esteja enfrentando o mesmo problema.
fonte
Abaixo, você encontrará um Float opcional, coloque um! no final, se você souber que é um Float, ou use if / let.
fonte
Aqui está uma adaptação do Swift 3 da solução de Paul Hegarty da resposta de rdprado, com algumas verificações de opcionais adicionados a ela (retornando 0,0 se qualquer parte do processo falhar):
A propósito, eu fiz o curso CS193p de Stanford usando a iTunes University quando ela ainda ensinava Objective-C.
Descobri que Paul Hegarty é um instrutor FANTÁSTICO, e eu recomendo a classe para qualquer pessoa que esteja começando como desenvolvedor iOS em Swift !!!
fonte
NumberFormatter
para lidar com os números de ponto flutuante inseridos pelo usuário.fonte
In swift 4
fonte
fonte
return Float(self)
?Você tem duas opções que são bastante semelhantes (pela abordagem e resultado):
fonte
Double()
constrói um Double a partir de um Int, assim:var convertedDouble = Double(someInt)
Observe que isso só funcionará se o seu texto realmente contiver um número. Como
Wage
é um campo de texto, o usuário pode inserir o que quiser e isso irá disparar um erro de tempo de execução quando você for desempacotar o opcional retornadotoInt()
. Você deve verificar se a conversão foi bem-sucedida antes de forçar o unboxing.Editar:
Se você tiver certeza de que o texto será um número inteiro, você pode fazer algo assim (observe que
text
em UITextField também é opcional)):fonte
wageConversionFloat
nunca será o float, ele trava diretamente se a string de entrada for um tipo de float234.56
. como poderia ser uma solução aceita / votada ...?3
se o campo de texto tiver3.5
. Isso ocorre porque o texto é primeiro convertido em um eInt
, em seguida, oInt
é convertido em aFloat
.Eu descobri outra maneira de pegar um valor de entrada de um UITextField e convertê-lo em um float:
fonte
você pode usar,
Se você quiser arredondar o flutuante para 2 casas decimais:
fonte
É assim que eu abordei. Eu não queria "cruzar a ponte", já que foi removido do Xcode 6 beta 5 de qualquer maneira, rápido e sujo:
fonte
toDouble()
funcionar com a string "10", quero dizer, se não houver decimal. Vai travar de qualquer maneira. Porque nesse caso a contagem será 1 e você não está lidando com isso. Ele vai travar emelse if comps[0] == "" || comps[1] == ""
. De qualquer forma, você é tão sério na conversão.Para fins de integridade, esta é uma solução que usa uma extensão da
UITextField
qual também pode considerar um local diferente.Para Swift 3+
fonte
Float?
e não tratar valores inválidos como0.0
. Deixe o chamador fazer algo comolet val = field.floatValue ?? 0.0
se um determinado caso devesse tratar o resultado ruim como zero.Swift 4/5, use apenas Float (valor).
Resposta: 123200
fonte
Usa isto:
fonte
Jeito fácil:
você pode usar a mesma abordagem para outros cálculos, espero que ajude !!
fonte
float