স্ট্রিং থেকে সুইফটে রূপান্তর করুন


101

আমি ইউআইটিেক্সটফিল্ড থেকে নেওয়া সংখ্যাগুলি রূপান্তর করার চেষ্টা করছি, যা আমি অনুমান করি যে এটি আসলে স্ট্রিংস এবং সেগুলিকে ফ্লোটে রূপান্তর করতে চেষ্টা করছি, তাই আমি তাদের সংখ্যা বৃদ্ধি করতে পারি।

আমার দুটি UITextfieldটি রয়েছে যা নীচে ঘোষণা করা হয়েছে:

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

যখন ব্যবহারকারী একটি ইউআইবাটন টিপে আমি ব্যবহারকারীর উপার্জন অনুযায়ী মজুরি গণনা করতে চাই, তবে আমি সেগুলি ব্যবহারের আগে আমি তাদের প্রথমে ভাসমান রূপান্তরিত করতে পারি না।

আমি এটি করে কীভাবে তাদের পূর্ণসংখ্যায় রূপান্তর করতে জানি:

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

তবে এগুলিকে কীভাবে ফ্লোটে রূপান্তর করা যায় সে সম্পর্কে আমার কোনও ধারণা নেই।

উত্তর:


200

সুইফট 2.0+

এখন সুইফট ২.০ দিয়ে আপনি কেবল ব্যবহার করতে পারেন Float(Wage.text)যা কোন Float?প্রকারটি দেয় returns নীচের সমাধানের চেয়ে আরও স্পষ্ট যা কেবলমাত্র ফিরে আসে 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)


এক্সটেনশানটির প্রয়োজন নেই, ব্রিজটি স্বয়ংক্রিয়ভাবে সুইফ্ট দ্বারা সম্পন্ন হবে, যেমন @ টম আপনাকে জানায় যে Wage.text.floatValue need উত্তর পোস্ট হওয়ার পরে এবং এখন এটির মধ্যে পরিবর্তন হয়েছে কিনা তা নিশ্চিত নন, তবে এটি কিছুক্ষণের জন্য রয়েছে।
স্কেচিটেক

4
@ গুডবাইস্ট্যাক ওভারফ্লো, আমি বিটা 4 ব্যবহার করছি এবং এটি অবশ্যই কাজ করবে না। তারা কি এটি বিটা 5 এ পরিবর্তন করেছেন? NSStringহয়েছে floatValueএক্সটেনশন কিন্তু Stringনা। ত্রুটি পান:'String' does not have member named floatValue
ফিরো

এটি কারণ হতে পারে। এছাড়াও, আপনার ফাইলের শীর্ষে কি আমদানি ফাউন্ডেশন রয়েছে?
স্কেচিটেক

আমি এটিকে খুব নিরাপদ হিসাবে বিবেচনা করি না, কমপক্ষে সুইফ্ট স্ট্যান্ডার্ডের জন্য, যেহেতু স্ট্রিংটি একটি সংখ্যা না হয় তবে এনএসএসটিং.ফ্লোয়াট ভ্যালু মাত্র 0 প্রদান করে This
আইএক্সএক্স

let floatValue = (Float)(Wage.text)... সুইফট ২.০
থাইগার

23

কারণ বিশ্বের কিছু অংশে উদাহরণস্বরূপ, দশমিকের পরিবর্তে একটি কমা ব্যবহার করা হয়। একটি স্ট্রিংকে ফ্লোটে রূপান্তর করতে একটি এনএসএনম্বারফর্মেটর তৈরি করা ভাল।

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++ এর জন্য), এটি প্রধান কারণ এটি একটি alচ্ছিক ( NSString.floatValueযার বিপরীতে , যা 0কিছু ভুল হলে কেবল ফিরে আসে ) ফেরত দেয় । নোট যে NSNumberFormatterপরিবর্তন করা হয়েছিল NumberFormatter
রোম

9

হালনাগাদ

গৃহীত উত্তরটি আরও এক যুগোপযোগী করার পদ্ধতি দেখায়

সুইফট ঘ

2015 সালে স্ট্যানফোর্ডের সিএস 193 পি ক্লাসে পল হেগার্টি এইভাবে দেখিয়েছেন:

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 তে রূপান্তরিত হবে যা আমি যা চাইছিলাম তা নয়। তবে আমি যদি এর পরিবর্তে। ডাবলভ্যালুটি ব্যবহার করি তবে আমি যে 1.1 চেয়েছিলাম তা পেয়ে যাব।

সুতরাং উদাহরণস্বরূপ, গৃহীত সমাধানটি ব্যবহার না করে পরিবর্তে আমি এটি ব্যবহার করেছি:

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

আমার ক্ষেত্রে আমার ডাবল-স্পষ্টকরণের দরকার ছিল না, তবে। ফ্লোটভ্যালু ব্যবহার করা আমাকে সঠিক ফলাফল দিচ্ছিল না।

অন্য কেউ একই ইস্যুতে চলেছে সে ক্ষেত্রে এটি কেবল আলোচনায় যুক্ত করতে চেয়েছিলেন।


5

নীচে আপনি একটি alচ্ছিক ফ্লোট দেবেন, একটি লাঠি! শেষে যদি আপনি এটি ভাসমান হতে জেনে থাকেন, বা যদি / ব্যবহার করেন তবে তা ব্যবহার করুন।

let wageConversion = Float(wage.text)

4

এখানে rdprado এর উত্তর থেকে পল হেগার্টির দ্রবণটির একটি সুইফট 3 রূপান্তর রয়েছে, এতে বিকল্পগুলির জন্য কিছু পরীক্ষার যোগ করা হয়েছে (প্রক্রিয়াটির কোনও অংশ ব্যর্থ হলে ০.০ ফিরে আসা):

var wageFloat:Float = 0.0

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

যাইহোক, আমি স্টানফোর্ডের আইটিউনস বিশ্ববিদ্যালয় ব্যবহার করে সিএস 193 পি ক্লাস নিয়েছিলাম যখন এটি এখনও অবজেক্টিভ-সি পড়ছিল।

আমি পল হেগার্টিকে একজন ফ্যান্টাসটিক প্রশিক্ষক হিসাবে পেয়েছি এবং আমি সুইফটে আইওএস বিকাশকারী হিসাবে যে কোনও ব্যক্তিকে ক্লাস করার পরামর্শ দিচ্ছি !!!


4
এটি সুইফট 3 বা তার পরে একমাত্র সঠিক উত্তর। NumberFormatterব্যবহারকারী প্রবেশ করা ভাসমান পয়েন্ট নম্বর মোকাবেলা করতে আপনাকে অবশ্যই একটি ব্যবহার করতে হবে ।
rmaddy

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

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

4
এই কোডটি কেন কাজ করে তা ব্যাখ্যা করুন। এটি এর ক্রিয়াকলাপটি না বুঝে অনুলিপি করা এবং আটকানো প্রতিরোধ করে।
রাইরিং



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;

4
BridgeToOjjectiveC () বিটা 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)
}

সম্পাদনা করুন:

আপনি যদি নিশ্চিত হন যে পাঠ্যটি একটি পূর্ণসংখ্যা হবে তবে আপনি এর মতো কিছু করতে পারেন (নোট textকরুন ইউআইটিেক্সটফিল্ডেও এটি Oচ্ছিক)):

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

ঠিক আছে, আমি কেবলমাত্র ব্যবহারকারীকে সংখ্যায় প্রবেশ করতে দিচ্ছি কারণ কীপ্যাডটি একটি দশমিক প্যাড, তাই তারা সংখ্যা ছাড়া অন্য কোনওটিতে প্রবেশ করতে পারে না।
স্টিফেন ফক্স

4
wageConversionFloatফ্লোট কখনও হবে না, ইনপুট স্ট্রিংয়ের মতো এক ধরণের ভাসা থাকলে তা সরাসরি ক্রাশ হয় 234.56। কীভাবে এটি একটি গৃহীত / উন্নত সমাধান হতে পারে ...?
হোলএক্স

যদি পাঠ্যের দশমিক মান থাকে তবে এই উত্তরটি কার্যকর হয় না। উদাহরণ - 3পাঠ্য ক্ষেত্রটি থাকলে এই উত্তরটি ফিরে আসবে 3.5। এটি কারণ পাঠ্যটি প্রথমে একটিতে রূপান্তরিত হয় Int, তারপরে Intএটিটিকে একটিতে রূপান্তর করা হয় Float
rmaddy

4
@ স্টেফেনফক্স মনে রাখবেন যে কোনও ব্যবহারকারী পাঠ্য ক্ষেত্রে অ-সংখ্যাযুক্ত পাঠ্য আটকে দিতে পারে বা ব্যবহারকারীর একটি বাহ্যিক কীবোর্ড থাকতে পারে। ডেটা এন্ট্রি নিশ্চিত করতে কখনই কেবল কীবোর্ডের উপর নির্ভর করবেন না।
rmaddy

আসলে এটি দশমিক নয়, পুরো সংখ্যা সহ কাজ করে। দশমিক একটি মারাত্মক ত্রুটি নিক্ষেপ করবে!
মাইল

1

আমি একটি ইউআইটিেক্সটফিল্ডের একটি ইনপুট মান নিতে এবং এটি একটি ফ্লোটে কাস্ট করার অন্য উপায় খুঁজে পেয়েছি:

    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

এইভাবে আমি এটির কাছে পৌঁছেছি। আমি "ব্রিজটি অতিক্রম করতে" চাইনি, কারণ এটি এক্সকোড 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")
}

4
কারণ বিশ্বের কিছু অংশে উদাহরণস্বরূপ, দশমিকের পরিবর্তে একটি কমা ব্যবহার করা হয়। একটি স্ট্রিংকে ফ্লোটে রূপান্তর করতে একটি এনএসএনম্বারফর্মেটর তৈরি করা ভাল। @ দিমিত্রিফুয়ারলে উত্তরটি দেখুন
carmen_munich

@ পার্টালিটি ফ্রোজেনওজে আপনি কি toDouble()"10" স্ট্রিং দিয়ে ফাংশনটি চেষ্টা করেছেন মানে যদি কোন দশমিক না থাকে। এটি যাইহোক ক্রাশ হবে। কারণ সেক্ষেত্রে গণনা 1 হবে এবং আপনি এটি পরিচালনা করছেন না। এটি ক্রাশ হবে else if comps[0] == "" || comps[1] == ""। যাইহোক আপনি রূপান্তর হিসাবে এত গুরুতর।
দ্য টাইগার

@ পার্টালিটি ফ্রোজেন ওজে তবে 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.0। কলকারীকে এমন কিছু করতে দিন যেমন let val = field.floatValue ?? 0.0কোনও প্রদত্ত কেস খারাপ ফলাফলটিকে শূন্য হিসাবে গণ্য করে।
rmaddy 20'18


-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"
    }

4
BridgeToOjjectiveC () বিটা 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"
}

আপনি অন্যান্য গণনার জন্য একই পদ্ধতির ব্যবহার করতে পারেন, এই সহায়তার আশা করি !!


4
এই হিসাবে দুর্দান্ত, তিনি জিজ্ঞাসা করেছিলেনfloat
জ্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.