私はUITextFieldから取得した数値を変換しようとしていますが、これは実際には文字列であり、浮動小数点数に変換するので、乗算できます。
次のように宣言されているUITextfield
sが2つあります。
@IBOutlet var wage: UITextField
@IBOutlet var hour: UITextField
ユーザーがUIButtonを押すと、ユーザーが稼ぐ賃金を計算したいのですが、使用する前にまずフロートに変換する必要があるため、計算できません。
私はこれを行うことで整数に変換する方法を知っています:
var wageConversion:Int = 0
wageConversion = wage.text.toInt()!
ただし、それらをfloatに変換する方法はわかりません。
Swift 2.では、Float?
型を返すFloat(Wage.text)
を使用できます。 0
を返すだけの以下のソリューションよりも明確です。
何らかの理由で無効なFloat
の0
値が必要な場合は、有効なFloat
でない場合に0
を返すFloat(Wage.text) ?? 0
を使用できます。
これを処理する最良の方法は、直接キャストです。
var WageConversion = (Wage.text as NSString).floatValue
私も実際にこれを使用するためにextension
を作成しました:
extension String {
var floatValue: Float {
return (self as NSString).floatValue
}
}
これで、var WageConversion = Wage.text.floatValue
を呼び出すだけで、拡張機能がブリッジを処理できるようになります。
これは、実際のフロート(.
を使用した入力)を処理でき、ユーザーが入力フィールド(12p.34
、または12.12.41
でさえ)にテキストをコピーするのを防ぐのにも役立つため、適切な実装です。
明らかに、AppleがSwiftにfloatValue
を追加すると、これは例外をスローしますが、それまではナイスかもしれません。後で追加する場合、コードを変更するために必要なことは、拡張機能を削除するだけです。.floatValue
を呼び出しているため、すべてがシームレスに機能します。
また、変数と定数は小文字で始まる必要があります(IBOutlets
を含む)
たとえば、世界の一部の地域では、小数の代わりにコンマが使用されるためです。 NSNumberFormatterを作成して、文字列をfloatに変換するのが最善です。
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let number = numberFormatter.numberFromString(self.stringByTrimmingCharactersInSet(Wage.text))
この方法でStringをFloatに変換します。
let numberFormatter = NSNumberFormatter()
let number = numberFormatter.numberFromString("15.5")
let numberFloatValue = number.floatValue
println("number is \(numberFloatValue)") // prints "number is 15.5"
更新
受け入れられた答えは、より最新の方法を示しています
スイフト1
これは、ポール・ヘガティが2015年にスタンフォードのCS193pクラスで示した方法です。
wageConversion = NSNumberFormatter().numberFromString(wage.text!)!.floatValue
毎回実行する必要がないため、計算されたプロパティを作成することもできます
var wageValue: Float {
get {
return NSNumberFormatter().numberFromString(wage.text!)!.floatValue
}
set {
wage.text = "\(newValue)"
}
}
以下は、オプションのフロートを提供します!最後にフロートであることがわかっている場合、またはif/letを使用します。
let wageConversion = Float(wage.text)
受け入れられたソリューションを使用して、「1.1」(。floatValue変換を使用する場合)が1.10000002384186に変換されることがわかりましたが、これは望んでいたものではありませんでした。ただし、代わりに.doubleValueを使用した場合、必要な1.1が取得されます。
したがって、たとえば、受け入れられたソリューションを使用する代わりに、私はこれを代わりに使用しました:
var WageConversion = (Wage.text as NSString).doubleValue
私の場合、倍精度は必要ありませんでしたが、.floatValueを使用しても適切な結果が得られませんでした。
他の誰かが同じ問題に遭遇した場合に備えて、ディスカッションにこれを追加したかっただけです。
import Foundation
"-23.67".floatValue // => -23.67
let s = "-23.67" as NSString
s.floatValue // => -23.67
extension String {
func floatValue() -> Float? {
return Float(self)
}
}
Rdpradoの回答からPaul HegartyのソリューションをSwift 3適応したものに、オプションを追加してチェックします(プロセスの一部が失敗した場合は0.0を返します)。
var wageFloat:Float = 0.0
if let wageText = wage.text {
if let wageNumber = NumberFormatter().number(from: wageText) {
wageFloat = wageNumber.floatValue
}
}
ちなみに、まだObjective-Cを教えていたときに、私はiTunes Universityを使用してスタンフォード大学のCS193pクラスを受講しました。
Paul Hegartyはファンタスティックなインストラクターであることがわかったので、SwiftでiOS開発者として始めた人にはこのクラスを強くお勧めします!!!
Swift 4
let Totalname = "10.0" //Now it is in string
let floatVal = (Totalname as NSString).floatValue //Now converted to float
(アプローチと結果から)よく似た2つのオプションがあります。
// option 1:
var string_1 : String = "100"
var double_1 : Double = (string_1 as NSString).doubleValue + 99.0
// option 2:
var string_2 : NSString = "100"
// or: var string_2 = "100" as NSString
var number_2 : Double = string_2.doubleValue;
Double()
は、次のようにIntからDoubleを構築します。
var convertedDouble = Double(someInt)
これは、テキストに実際に数字が含まれている場合にのみ機能することに注意してください。 Wage
はテキストフィールドであるため、ユーザーは好きなものを入力でき、toInt()
から返されたOptionalをunboxすると、ランタイムエラーが発生します。強制的にアンボックス化する前に、変換が成功したことを確認する必要があります。
if let wageInt = Wage.text?.toInt() {
//we made it in the if so the conversion succeeded.
var wageConversionDouble = Double(wageInt)
}
編集:
テキストが整数であることが確実な場合、次のようなことができます(UITextFieldのtext
もオプションです)。
if let wageText = Wage.text {
var wageFloat = Double(wageText.toInt()!)
}
UITextFieldの入力値を取得して、floatにキャストする別の方法を見つけました。
var tempString:String?
var myFloat:Float?
@IBAction func ButtonWasClicked(_ sender: Any) {
tempString = myUITextField.text
myFloat = Float(tempString!)!
}
完全を期すため、これはUITextField
の拡張子を使用するソリューションであり、異なるロケールを考慮することもできます。
Swift 3+の場合
extension UITextField {
func floatValue(locale : Locale = Locale.current) -> Float {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.locale = locale
let nsNumber = numberFormatter.number(from: text!)
return nsNumber == nil ? 0.0 : nsNumber!.floatValue
}
}
これは私がそれにアプローチした方法です。とにかく、Xcode 6ベータ5から削除されたため、「橋を渡る」ことはしたくありませんでした。
extension String {
// converting a string to double
func toDouble() -> Double? {
// split the string into components
var comps = self.componentsSeparatedByString(".")
// we have nothing
if comps.count == 0 {
return nil
}
// if there is more than one decimal
else if comps.count > 2 {
return nil
}
else if comps[0] == "" || comps[1] == "" {
return nil
}
// grab the whole portion
var whole = 0.0
// ensure we have a number for the whole
if let w = comps[0].toInt() {
whole = Double(w)
}
else {
return nil
}
// we only got the whole
if comps.count == 1 {
return whole
}
// grab the fractional
var fractional = 0.0
// ensure we have a number for the fractional
if let f = comps[1].toInt() {
// use number of digits to get the power
var toThePower = Double(countElements(comps[1]))
// compute the fractional portion
fractional = Double(f) / pow(10.0, toThePower)
}
else {
return nil
}
// return the result
return whole + fractional
}
// converting a string to float
func toFloat() -> Float? {
if let val = self.toDouble() {
return Float(val)
}
else {
return nil
}
}
}
// test it out
var str = "78.001"
if let val = str.toFloat() {
println("Str in float: \(val)")
}
else {
println("Unable to convert Str to float")
}
// now in double
if let val = str.toDouble() {
println("Str in double: \(val)")
}
else {
println("Unable to convert Str to double")
}