web-dev-qa-db-ja.com

AppleのSwiftでStringをfloatに変換します

私はUITextFieldから取得した数値を変換しようとしていますが、これは実際には文字列であり、浮動小数点数に変換するので、乗算できます。

次のように宣言されているUITextfieldsが2つあります。

@IBOutlet var wage: UITextField
@IBOutlet var hour: UITextField

ユーザーがUIButtonを押すと、ユーザーが稼ぐ賃金を計算したいのですが、使用する前にまずフロートに変換する必要があるため、計算できません。

私はこれを行うことで整数に変換する方法を知っています:

var wageConversion:Int = 0
wageConversion = wage.text.toInt()!

ただし、それらをfloatに変換する方法はわかりません。

90
Stephen Fox

Swift 2.0+

Swift 2.では、Float?型を返すFloat(Wage.text)を使用できます。 0を返すだけの以下のソリューションよりも明確です。

何らかの理由で無効なFloat0値が必要な場合は、有効な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を含む)

186
Firo

たとえば、世界の一部の地域では、小数の代わりにコンマが使用されるためです。 NSNumberFormatterを作成して、文字列をfloatに変換するのが最善です。

let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let number = numberFormatter.numberFromString(self.stringByTrimmingCharactersInSet(Wage.text))
22
Dmitri Fuerle

この方法でStringをFloatに変換します。

let numberFormatter = NSNumberFormatter()
let number = numberFormatter.numberFromString("15.5")
let numberFloatValue = number.floatValue

println("number is \(numberFloatValue)") // prints "number is 15.5"
14
Mert

更新

受け入れられた答えは、より最新の方法を示しています

スイフト1

これは、ポール・ヘガティが2015年にスタンフォードのCS193pクラスで示した方法です。

wageConversion = NSNumberFormatter().numberFromString(wage.text!)!.floatValue

毎回実行する必要がないため、計算されたプロパティを作成することもできます

var wageValue: Float {
        get {
            return NSNumberFormatter().numberFromString(wage.text!)!.floatValue
        }
        set {
            wage.text = "\(newValue)"
        }
    }
9
rdprado

以下は、オプションのフロートを提供します!最後にフロートであることがわかっている場合、またはif/letを使用します。

let wageConversion = Float(wage.text)
5
bandejapaisa

受け入れられたソリューションを使用して、「1.1」(。floatValue変換を使用する場合)が1.10000002384186に変換されることがわかりましたが、これは望んでいたものではありませんでした。ただし、代わりに.doubleValueを使用した場合、必要な1.1が取得されます。

したがって、たとえば、受け入れられたソリューションを使用する代わりに、私はこれを代わりに使用しました:

var WageConversion = (Wage.text as NSString).doubleValue

私の場合、倍精度は必要ありませんでしたが、.floatValueを使用しても適切な結果が得られませんでした。

他の誰かが同じ問題に遭遇した場合に備えて、ディスカッションにこれを追加したかっただけです。

5
Yjo-jo
import Foundation
"-23.67".floatValue // => -23.67

let s = "-23.67" as NSString
s.floatValue // => -23.67
3
tom
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開発者として始めた人にはこのクラスを強くお勧めします!!!

3
Carl Smith

Swift 4

let Totalname = "10.0" //Now it is in string

let floatVal  = (Totalname as NSString).floatValue //Now converted to float
1
Raghib Arshi

(アプローチと結果から)よく似た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;
1
Michael Dorner

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()!)
}
1
Lance

UITextFieldの入力値を取得して、floatにキャストする別の方法を見つけました。

    var tempString:String?
    var myFloat:Float?

    @IBAction func ButtonWasClicked(_ sender: Any) {
       tempString = myUITextField.text
       myFloat = Float(tempString!)!
    }
1
Wayne Lampiasi

完全を期すため、これは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
    }
}
0
vadian

これは私がそれにアプローチした方法です。とにかく、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")
}
0
xBACP