Swiftで文字列をFloatに変換する


101

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

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

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

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

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

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

しかし、それらを浮動小数点数に変換する方法がわかりません。

回答:


200

Swift 2.0以降

今でスウィフト2.0あなただけ使用することができFloat(Wage.text)返すFloat?タイプを。ただ返す以下のソリューションよりも明確です0

何らかの理由で0無効な値が必要な場合は、有効でない場合に返される値をFloat使用できます。Float(Wage.text) ?? 00Float


古いソリューション

これを処理する最良の方法は直接キャストです:

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がfloatValueSwiftにを追加した場合、これは例外をスローしますが、当面はそれでいいかもしれません。後で追加する場合、コードを変更するために必要なのは拡張機能を削除することだけであり、すでに呼び出しているので、すべてがシームレスに機能します.floatValue

また、変数と定数は小文字で始める必要があります(を含むIBOutlets


拡張機能は必要ありません。@ tomが必要なのはWage.text.floatValueだけなので、ブリッジはSwiftによって自動的に行われます。投稿された回答と現在の回答との間でこれが変わったかどうかはわかりませんが、しばらく前からありました。
sketchyTech 2014

3
@GoodbyeStackOverflow、私はベータ4を使用していますが、確実に機能しません。多分彼らはベータ5でそれを変更しましたか?NSString持っているfloatValue拡張子はなく、Stringしません。エラーを取得:'String' does not have member named floatValue
Firo

これが理由かもしれません。また、ファイルの先頭にFoundationをインポートしていますか?
sketchyTech 2014

文字列が数値でない場合、NSString.floatValueは単に0を返すため、これは少なくともSwift標準では安全とは考えていません。これにより、例外がトリガーされるか、少なくともnilが返されます。
Ixx

let floatValue = (Float)(Wage.text)... Swift 2.0で
TheTiger

23

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

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

18

私はこのように文字列をフロートに変換します:

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

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

これが最良の解決策であると思います(少なくともSwift 4+の場合)。主な理由は、オプションが返されることです(何かが間違っている場合にNSString.floatValue単に返さ0れるとは対照的です)。NSNumberFormatter変更されNumberFormatterたことに注意してください。
Rom

9

更新

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

スウィフト1

これは、2015年にPaul HegartyがスタンフォードのCS193pクラスで示した方法です。

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

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

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

5

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

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

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

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

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


5

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

let wageConversion = Float(wage.text)

4

これは、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開発者として始めた人には、このクラスを強くお勧めします。


1
これがSwift 3以降の唯一の正解です。NumberFormatterユーザーが入力した浮動小数点数を処理するには、a を使用する必要があります。
rmaddy

3
import Foundation
"-23.67".floatValue // => -23.67

let s = "-23.67" as NSString
s.floatValue // => -23.67

3
このコードが機能する理由を説明してください。これにより、操作を理解せずにコピーして貼り付けることができなくなります。
rayryeng

3

迅速に4

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

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


1

(アプローチと結果によって)非常に似ている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;

2
bridgeToObjectiveC()はBeta 5で削除されました
carmen_munich 2014

1

Double() 次のように、IntからDoubleを構築します。

var convertedDouble = Double(someInt)

これは、テキストに実際に数字が含まれている場合にのみ機能することに注意してください。以来Wageテキストフィールドで、ユーザーは、彼らが望むものは何でも入ることができますし、オプションから返さUnboxのために行くとき、これはランタイムエラーがトリガされますtoInt()。展開を強制する前に、変換が成功したことを確認する必要があります。

if let wageInt = Wage.text?.toInt() {
    //we made it in the if so the conversion succeeded.
    var wageConversionDouble = Double(wageInt)
}

編集:

テキストが整数になることが確実な場合は、次のようにすることができます(textUITextFieldもオプションであることに注意してください)。

if let wageText = Wage.text {
    var wageFloat = Double(wageText.toInt()!)
}

ええと、キーパッドは10進数パッドなので、ユーザーが数字を入力することだけを許可しているため、実際には数字以外の文字を入力することはできません。
スティーブンフォックス

1
wageConversionFloatfloatになることはありません234.56。入力文字列がのようなfloatの場合、直接クラッシュします。それはどのように受け入れられ/賛成された解決策になるのでしょうか...?
holex

テキストに10進値が含まれている場合、この回答は機能しません。例-この回答は3、テキストフィールドにがある場合に返されます3.5。これは、テキストが最初にに変換されInt、次にIntがに変換されるためFloatです。
rmaddy 14

1
@StephenFoxユーザーが数値以外のテキストをテキストフィールドに貼り付けることができるか、ユーザーが外部キーボードを使用している可能性があることに注意してください。データ入力を確実にするためにキーボードだけに依存しないでください。
rmaddy 2014

実際には、小数ではなく整数で機能します。小数は致命的なエラーをスローします!
Miles Works

1

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

    var tempString:String?
    var myFloat:Float?

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

1

使用できます

let wg = Float(wage.text!)

フロートを小数点以下2桁に丸める場合:

let wg = Float(String(format: "%.2f",wage.text!)

0

これが私がそれに取り組んだ方法です。とにかく、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")
}

1
たとえば、世界の一部の地域では、小数点の代わりにカンマが使用されているためです。文字列を浮動小数点数に変換するNSNumberFormatterを作成するのが最善です。@DmitriFuerle Answerをご覧ください
carmen_munich 2014年

@PartiallyFrozenOJ toDouble()「10」の文字列で関数を試しましたか。つまり、小数がない場合です。とにかくクラッシュします。その場合、カウントは1になり、処理しません。でクラッシュしelse if comps[0] == "" || comps[1] == ""ます。とにかく、あなたは改心にとても真剣です。
TheTiger

@PartiallyFrozenOJしかし、2014年も条件が同じだった場合。とにかく問題ありません!
TheTiger、2016年

0

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

一般的な解決策として、これはおそらくa Float?を返し、無効な値をとして扱わないはず0.0です。let val = field.floatValue ?? 0.0与えられたケースが悪い結果をゼロとして扱うべきであるかのように、呼び出し側に何かをさせましょう。
rmaddy

0

Swift 4/5、Float(value)のみを使用します。

let string_value : String = "123200"

let float_value : Float = Float(string_value)

print(float_value)

回答:123200


-1

これを使って:

 // get the values from text boxes
    let a:Double = firstText.text.bridgeToObjectiveC().doubleValue
    let b:Double = secondText.text.bridgeToObjectiveC().doubleValue

//  we checking against 0.0, because above function return 0.0 if it gets failed to convert
    if (a != 0.0) && (b != 0.0) {
        var ans = a + b
        answerLabel.text = "Answer is \(ans)"
    } else {
        answerLabel.text = "Input values are not numberic"
    }

1
bridgeToObjectiveC()はBeta 5で削除されました
carmen_munich 2014

-4

簡単な方法:

// toInt returns optional that's why we used a:Int?
let a:Int? = firstText.text.toInt()
let b:Int? = secondText.text.toInt()

// check a and b before unwrapping using !
if a && b {
    var ans = a! + b!
    answerLabel.text = "Answer is \(ans)"
} else {
    answerLabel.text = "Input values are not numberic"
}

他の計算にも同じアプローチを使用できます。


3
これだけでなく、彼は求めていましたfloat
ジャック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.