बदलना स्ट्रिंग को स्विफ्ट में फ्लोट में


101

मैं एक UITextField से ली गई संख्याओं को परिवर्तित करने की कोशिश कर रहा हूं, जिसे मैं मानता हूं, वास्तव में स्ट्रिंग्स हैं, और उन्हें फ्लोट में परिवर्तित करते हैं, इसलिए मैं उन्हें गुणा कर सकता हूं।

मेरे पास दो UITextfields हैं जो इस प्रकार घोषित हैं:

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

जब उपयोगकर्ता एक UIButton दबाता है, तो मैं उस उपयोगकर्ता की मजदूरी की गणना करना चाहता हूं जो मैं कमाता हूं, लेकिन मैं नहीं कर सकता, क्योंकि मुझे उन्हें पहले तैरने के लिए बदलने की आवश्यकता है, इससे पहले कि मैं उनका उपयोग कर सकूं।

मुझे पता है कि ऐसा करके उन्हें एक पूर्णांक में कैसे परिवर्तित किया जाए:

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

हालांकि, मुझे नहीं पता कि उन्हें फ्लोट में कैसे बदलना है।

जवाबों:


200

स्विफ्ट 2.0+

अब स्विफ्ट 2.0 के साथ आप केवल Float(Wage.text)एक Float?प्रकार का रिटर्न का उपयोग कर सकते हैं । नीचे दिए गए समाधान की तुलना में अधिक स्पष्ट है जो अभी लौटता है 0

यदि आप किसी कारण से 0अमान्य के Floatलिए एक मूल्य चाहते हैं तो आप इसका उपयोग कर सकते हैं Float(Wage.text) ?? 0जो 0कि वैध नहीं होने पर वापस आ जाएगा Float


पुराना हल

इसे संभालने का सबसे अच्छा तरीका है डायरेक्ट कास्टिंग:

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) में टेक्स्ट को कॉपी करने से रोकने में मदद करेगा ।

जाहिर है, अगर ऐप्पल floatValueस्विफ्ट को जोड़ता है तो यह एक अपवाद को फेंक देगा, लेकिन यह इस समय में अच्छा हो सकता है। यदि वे इसे बाद में जोड़ते हैं, तो आपको अपने कोड को संशोधित करने के लिए सभी को एक्सटेंशन हटाने की आवश्यकता है और सब कुछ मूल रूप से काम करेगा, क्योंकि आप पहले से ही कॉल कर रहे हैं .floatValue!

इसके अलावा, चर और स्थिरांक एक कम मामले (सहित IBOutlets) के साथ शुरू होना चाहिए


विस्तार की आवश्यकता नहीं है, पुल स्वतः स्विफ्ट द्वारा किया जाता है, जैसा कि @tom बताता है कि आपको सभी की आवश्यकता Wage.text.floatValue है। निश्चित नहीं है कि यह उत्तर और अभी पोस्ट किए जाने के बीच बदल गया है, लेकिन यह कुछ समय के लिए रहा है।
स्केचटेक

3
@GoodbyeStackOverflow, मैं बीटा 4 का उपयोग कर रहा हूं और यह निश्चित रूप से काम नहीं करता है। शायद उन्होंने इसे बीटा 5 में बदल दिया? NSStringहै floatValueविस्तार लेकिन Stringऐसा नहीं करता। त्रुटि प्राप्त करें:'String' does not have member named floatValue
Firo

यह कारण हो सकता है। इसके अलावा, क्या आपके पास अपनी फ़ाइल के शीर्ष पर आयात फाउंडेशन है?
स्केचटेक

मैं इसे बहुत सुरक्षित नहीं मानता, कम से कम स्विफ्ट मानकों के लिए, क्योंकि अगर स्ट्रिंग एक संख्या नहीं है, तो NSString.floatValue सिर्फ रिटर्न 0. यह एक अपवाद या कम से कम रिटर्न एनआईएल को ट्रिगर करना चाहिए।
Ixx जूल

let floatValue = (Float)(Wage.text)... स्विफ्ट 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"

मुझे लगता है कि यह सबसे अच्छा समाधान है (कम से कम स्विफ्ट 4+ के लिए), इसका मुख्य कारण यह है कि यह एक वैकल्पिक लौटाता है (जैसा कि कुछ गलत है, तो NSString.floatValueबस वापस लौटें 0।)। नोट जो NSNumberFormatterबदल दिया गया था NumberFormatter
रोम

9

अपडेट करें

स्वीकृत उत्तर, करने के तरीके पर अधिक निर्भर करता है

स्विफ्ट 1

यह 2015 में पॉल हेगार्टी ने स्टैनफोर्ड के CS193p वर्ग पर दिखाया है:

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

आप हर बार ऐसा न करने के लिए एक गणना की हुई संपत्ति भी बना सकते हैं

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

5

स्वीकृत समाधान का उपयोग करते हुए, मुझे लग रहा था कि मेरे "1.1" (.floatValue रूपांतरण का उपयोग करते समय) 1.10000002384186 में परिवर्तित हो जाएगा, जो कि मैं नहीं चाहता था। हालाँकि, अगर मैंने इसके बजाय .doubleValue का उपयोग किया, तो मुझे वह 1.1 मिलेगा जो मैं चाहता था।

इसलिए उदाहरण के लिए, स्वीकृत समाधान का उपयोग करने के बजाय, मैंने इसके बजाय इसका उपयोग किया:

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

मेरे मामले में मुझे डबल-परिशुद्धता की आवश्यकता नहीं थी, लेकिन .floatValue का उपयोग मुझे उचित परिणाम नहीं दे रहा था।

यदि कोई अन्य उसी मुद्दे पर चल रहा होता है, तो चर्चा में इसे जोड़ना चाहता है।


5

नीचे आपको एक वैकल्पिक फ़्लोट दिया जाएगा, स्टिक ए! अंत में अगर आपको पता हो कि यह एक फ्लोट है, या अगर / चलो का उपयोग करें।

let wageConversion = Float(wage.text)

4

यहाँ rdprado के जवाब से पॉल हेगार्टी के समाधान का एक स्विफ्ट 3 अनुकूलन है, इसके साथ वैकल्पिक के लिए कुछ जाँच के साथ इसे जोड़ा गया है (प्रक्रिया के किसी भी भाग में विफल होने पर 0.0 लौटता है):

var wageFloat:Float = 0.0

if let wageText = wage.text {
    if let wageNumber = NumberFormatter().number(from: wageText) {
        wageFloat = wageNumber.floatValue
    }
}

वैसे, मैंने स्टैनफोर्ड के CS193p वर्ग को आईट्यून्स यूनिवर्सिटी का उपयोग करके लिया था जब वह अभी भी ऑब्जेक्टिव-सी पढ़ा रहा था।

मुझे पॉल हेगार्टी एक शानदार प्रशिक्षक के रूप में मिले, और मैं स्विफ्ट में एक आईओएस डेवलपर के रूप में शुरू करने वाले किसी को भी कक्षा की सिफारिश करूंगा।


1
स्विफ्ट 3 या बाद के लिए यह एकमात्र सही उत्तर है। आपको NumberFormatterउपयोगकर्ता द्वारा फ़्लोटिंग पॉइंट नंबरों से निपटने के लिए ए का उपयोग करना चाहिए ।
रामादेवी

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

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

3
बताएं कि यह कोड क्यों काम करता है। यह इसके संचालन की समझ के बिना नकल और चिपकाने से रोकता है।
रियरींग



1

आपके पास दो विकल्प हैं जो काफी समान हैं (दृष्टिकोण और परिणाम के अनुसार):

// 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 () बीटा 5 में हटा दिया गया था
carmen_munich

1

Double() एक इंट से डबल बनाता है, इस तरह:

var convertedDouble = Double(someInt)

ध्यान दें कि यह तभी काम करेगा जब आपके पाठ में वास्तव में एक संख्या हो। चूंकि Wageएक टेक्स्ट फ़ील्ड है, तो उपयोगकर्ता जो भी चाहें दर्ज कर सकता है और जब आप लौटे हुए वैकल्पिक को अनबॉक्स करने जाते हैं तो यह रनटाइम त्रुटि को ट्रिगर करेगा 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()!)
}

खैर, मैं केवल उपयोगकर्ता को संख्याओं में दर्ज करने की अनुमति दे रहा हूं क्योंकि कीपैड एक दशमलव पैड है, इसलिए वे वास्तव में संख्याओं के अलावा किसी अन्य चीज में प्रवेश नहीं कर सकते हैं।
स्टीफन फॉक्स

1
wageConversionFloatफ्लोट कभी नहीं होगा, यह सीधे दुर्घटनाग्रस्त हो जाता है अगर इनपुट स्ट्रिंग फ्लोट की तरह है 234.56। यह एक स्वीकृत / उत्क्रमित समाधान कैसे हो सकता है ...?
होलेक्स

यदि पाठ में दशमलव मान समाहित है तो यह उत्तर काम नहीं करता है। उदाहरण - 3यदि पाठ फ़ील्ड में है तो यह उत्तर वापस आ जाएगा 3.5। ऐसा इसलिए है क्योंकि पाठ को पहले a में परिवर्तित किया जाता है Int, फिर Inta में परिवर्तित किया जाता है Float
rmaddy

1
@StephenFox ध्यान रखें कि उपयोगकर्ता गैर-संख्यात्मक पाठ को पाठ क्षेत्र में पेस्ट कर सकता है या उपयोगकर्ता के पास एक बाहरी कीबोर्ड हो सकता है। डेटा प्रविष्टि सुनिश्चित करने के लिए कभी भी केवल कीबोर्ड पर निर्भर न रहें।
16

वास्तव में यह पूरी संख्याओं के साथ काम करता है, केवल दशमलव नहीं। एक दशमलव एक घातक त्रुटि फेंक देगा!
माइल्स वर्क्स

1

मुझे UITextField का इनपुट मान लेने और इसे फ़्लोट में डालने का एक और तरीका मिला:

    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 उत्तर देखें
carmen_munich

@PartiallyFrozenOJ क्या आपने toDouble()"10" स्ट्रिंग के साथ कार्य करने की कोशिश की है मेरा मतलब है कि अगर कोई दशमलव नहीं है। यह वैसे भी दुर्घटनाग्रस्त हो जाएगा। क्योंकि उस स्थिति में गिनती 1 होगी और आप इसे संभाल नहीं रहे हैं। यह दुर्घटनाग्रस्त हो जाएगा else if comps[0] == "" || comps[1] == ""। वैसे भी आप रूपांतरण में इतने गंभीर हैं।
द टाइगर

@PartiallyFrozenOJ लेकिन अगर हालत 2014 में भी यही थी। वैसे भी कोई बात नहीं!
द टाइगर

0

संपूर्णता के लिए यह एक ऐसा समाधान है UITextFieldजिसके विस्तार का उपयोग करके एक अलग स्थान पर भी विचार किया जा सकता है।

स्विफ्ट 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
    }
}

एक सामान्य समाधान के रूप में इसे संभवतः वापस करना चाहिए Float?और अमान्य मानों का इलाज नहीं करना चाहिए 0.0let val = field.floatValue ?? 0.0यदि कॉल करने वाले को शून्य परिणाम के रूप में खराब परिणाम का इलाज करना चाहिए तो कॉलर को कुछ करने दें ।
रामादेवी

0

स्विफ्ट 4/5, फ्लोट (मान) का उपयोग करें।

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 () बीटा 5 में हटा दिया गया था
carmen_munich

-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
जैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.