সুইফট - স্ট্রিংকে ডাবল রূপান্তর করতে কীভাবে


242

আমি দ্রুত ভাষায় একটি বিএমআই প্রোগ্রাম লেখার চেষ্টা করছি। এবং আমি এই সমস্যা পেয়েছি: একটি স্ট্রিংকে একটি ডাবলে রূপান্তর করব কীভাবে?

অবজেক্টিভ-সিতে, আমি এটি এর মতো করতে পারি:

double myDouble = [myString doubleValue];

তবে আমি কীভাবে সুইফট ভাষায় এটি অর্জন করতে পারি?


1
এই সুইফট 2 পরিবর্তিত হয়েছে, নতুন ডাবল () failable সূচনাকারী ব্যবহার করে নতুন উত্তর দেখার stackoverflow.com/a/32850058/276626
পল Solt

উত্তর:


205

ডাবল থেকে স্ট্রিং 4.2+ স্ট্রিং

আপনার স্ট্রিং এবং সংখ্যাসূচক ধরণের (ডাবল, ফ্লোট, ইনট) মধ্যে রূপান্তর করতে নতুন ধরণের প্রারম্ভিক ব্যবহার করা উচিত। এটি একটি ptionচ্ছিক প্রকার (ডাবল?) ফিরিয়ে দেবে যার সঠিক মান বা শূন্য থাকবে যদি স্ট্রিং নম্বর না থাকে।

দ্রষ্টব্য: এনএসএসস্ট্রিং ডাবলভ্যালু সম্পত্তিটি সুপারিশ করা হয় না কারণ মান রূপান্তর করতে না পারলে এটি 0 প্রদান করে (যেমন: খারাপ ব্যবহারকারী ইনপুট)।

let lessPrecisePI = Float("3.14")

let morePrecisePI = Double("3.1415926536")
let invalidNumber = Float("alphabet") // nil, not a valid number

মানগুলি যদি / চলুন ব্যবহার করে তাদের ব্যবহার করতে মোড়ক করুন

if let cost = Double(textField.text!) {
    print("The user entered a value price of \(cost)")
} else {
    print("Not a valid number: \(textField.text!)")
}

আপনি NumberFormatterক্লাস ব্যবহার করে ফর্ম্যাট সংখ্যা এবং মুদ্রা রূপান্তর করতে পারেন ।

let formatter = NumberFormatter()
formatter.locale = Locale.current // USA: Locale(identifier: "en_US")
formatter.numberStyle = .decimal
let number = formatter.number(from: "9,999.99")

মুদ্রার ফর্ম্যাটগুলি

let usLocale = Locale(identifier: "en_US")
let frenchLocale = Locale(identifier: "fr_FR")
let germanLocale = Locale(identifier: "de_DE")
let englishUKLocale = Locale(identifier: "en_GB") // United Kingdom
formatter.numberStyle = .currency

formatter.locale = usLocale
let usCurrency = formatter.number(from: "$9,999.99")

formatter.locale = frenchLocale
let frenchCurrency = formatter.number(from: "9999,99€")
// Note: "9 999,99€" fails with grouping separator
// Note: "9999,99 €" fails with a space before the €

formatter.locale = germanLocale
let germanCurrency = formatter.number(from: "9999,99€")
// Note: "9.999,99€" fails with grouping separator

formatter.locale = englishUKLocale
let englishUKCurrency = formatter.number(from: "£9,999.99")

স্ট্রিংকে ডাবল ধরণের (এবং মুদ্রা) রূপান্তর করা সম্পর্কে আমার ব্লগ পোস্টে আরও পড়ুন ।


2
অন্য সমস্যাটি হ'ল এটি 1,000.00 ব্যতীত বিভিন্ন লোকালয়ে সংখ্যাগুলি সমর্থন করে না, আপনি যদি 1,000,00 এর মতো অন্যান্য ফর্ম্যাট ব্যবহার করেন তবে এটি শেষের সাথে 2 দশমিকটি কেটে ফেলবে। অবজেক্ট-সি-এর জন্য এটি কি ঘটছে। - অ্যাপলের ডকুমেন্টেশন অনুসারে: (এগুলি স্থানীয়ভাবে সচেতন নয়) নীচের সুবিধাদির পদ্ধতিগুলি সমস্ত প্রাথমিক স্পেস অক্ষর (হোয়াইটস্পেসসেট) এড়িয়ে যায় এবং অনুসরণীয় অক্ষরগুলিকে উপেক্ষা করে। এগুলি লোকাল-সচেতন নয়। আরও শক্তিশালী এবং লোকাল-সচেতন সংখ্যার পার্সিংয়ের জন্য এনএসএস স্ক্যানার বা এনএসএনম্বারফর্ম্যাটর ব্যবহার করা যেতে পারে।
এমএসকেডাব্লু

@mskw আমি মুদ্রাকে পার্স করতে সংখ্যার ফরম্যাটার ব্যবহারের বিষয়ে আরও বিশদ যুক্ত করেছি। আমার কোডে আমি একসাথে একাধিক ফরম্যাটারে স্ট্রিং করব if / let সিনট্যাক্স ব্যবহার করে রূপান্তর করার চেষ্টা করি যাতে আমি মুদ্রার বিন্যাসিত সংখ্যাগুলি ($ 1,000.00) বা ফর্ম্যাট সংখ্যা (1,000) উভয় পার্স করতে পারি। আপনি সর্বদা জানেন না যে কীভাবে ব্যবহারকারী সংখ্যা প্রবেশ করবেন, সুতরাং উভয়কে সমর্থন করতে সক্ষম হওয়া যদি / চলুন বিবৃতিগুলির একটি গ্রুপের সাথে আদর্শ।
পল সল্ট

276

সুইফট 2 আপডেটে নতুন নতুন উপলভ্য প্রারম্ভক রয়েছে যা আপনাকে আরও অচল ও নিরাপদ উপায়ে এটি করার অনুমতি দেয় (অনেক উত্তর হিসাবে উল্লেখ করা হয়েছে যে, এনএসএসটিংয়ের দ্বৈত মান খুব বেশি নিরাপদ নয় কারণ এটি অ-সংখ্যা মানের জন্য 0 প্রদান করে This এর অর্থ হ'ল doubleValueএর "foo"এবং "0"এটিগুলি একই.)

let myDouble = Double(myString)

এটি একটি alচ্ছিক প্রত্যাবর্তন করে , সুতরাং "foo"যেখানে doubleValue0 ফিরে এসেছে এমনটি পাস করার মতো ক্ষেত্রে , অনুপলব্ধ ইনটালাইজারটি ফিরে আসবে nil। আপনি একটি ব্যবহার করতে পারেন guard, if-letঅথবা mapহ্যান্ডেল করতেOptional<Double>

আসল পোস্ট: আপনাকে গৃহীত উত্তর প্রস্তাবগুলির মতো এনএসএসস্ট্রিং কনস্ট্রাক্টর ব্যবহার করার দরকার নেই। আপনি সহজেই এটি ব্রিজ করতে পারেন:

(swiftString as NSString).doubleValue

5
ওহ, জারসেন এই পদ্ধতির একটি খারাপ দিক হ'ল স্ট্রিংটি বৈধ ডাবল না হলে এটি ব্যর্থ হবে না। পরিবর্তে আপনি ঠিক 0.0 পাবেন। অর্থাৎ ফল - [NSString doubleValue]হয় Doubleহিসাবে apposed দ্রুতগতি মধ্যে Double?( Optional<Double>)। এটি সুইফ্ট স্ট্রিং ফাংশন থেকে পৃথক toInt()যা ডক্সে ফিরে আসে Int?এবং জানিয়েছে যে এটি "... নিয়মিত প্রকাশের সাথে মেলে এমন স্ট্রিংগুলি গ্রহণ করে" [- +]? [0-9] + "কেবল"
ডেরিক হ্যাথওয়ে

হ্যাঁ, ব্যবহার .toInt()করা আরও ভাল। যাইহোক, ঠিক একই জিনিসটি কীভাবে করা যায় তার আরও উত্তর ছিল তবে সুইফটে in
জারসেন

এই পদ্ধতিটি আপনাকে দৃ Foundation়ভাবে ফাউন্ডেশনে সংযুক্ত করে, এবং সম্ভবত সুইফটের কোনও অ-অ্যাপল বাস্তবায়নে কাজ করবে না।
এরিক কারবার

5
সুইফট ২.০- Double.init?(_ text: String)তে এখন পাওয়া যায় এমন প্রাপ্য আরম্ভকারী।
মিশ্র

3
এটি সেরা পদ্ধতির নয়। দশমিক বিভাজকের উপর নির্ভর করে এটি ব্যর্থ হবে। 'দিয়ে ভাল হয়ে যাবে।' তবে ',' দিয়ে নয়। এনএসএনম্বারফর্ম্যাটর বর্তমান স্থানীয়করণে ব্যবহৃত দশমিক বিভাজককে সমর্থন করবে।
জুলিয়ান ক্রোল

75

আরও কিছুটা দ্রুত NSFormatter()বোধের জন্য NSString, toালাই এড়ানো এড়ানো ব্যবহার করে এবং nilস্ট্রিংয়ের কোনও Doubleমান থাকে না এমন সময় ফিরে আসে (উদাহরণস্বরূপ "পরীক্ষা" ফিরে আসবে না 0.0)।

let double = NSNumberFormatter().numberFromString(myString)?.doubleValue

বিকল্পভাবে, সুইফটের Stringধরণ প্রসারিত :

extension String {
    func toDouble() -> Double? {
        return NumberFormatter().number(from: self)?.doubleValue
    }
}

এবং এটি ব্যবহার করুন toInt():

var myString = "4.2"
var myDouble = myString.toDouble()

এটি একটি Double?alচ্ছিক দেয় যা মোড়ক হতে হবে returns

হয় জোর করে আন-র্যাপিং সহ:

println("The value is \(myDouble!)") // prints: The value is 4.2

অথবা একটি যদি বিবৃতি দিয়ে:

if let myDouble = myDouble {
    println("The value is \(myDouble)") // prints: The value is 4.2
}

আপডেট: স্থানীয়করণের জন্য, নিম্নরূপে এনএস ফর্ম্যাটরে লোকেল প্রয়োগ করা খুব সহজ:

let formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "fr_FR")
let double = formatter.numberFromString("100,25")

অবশেষে, আপনি NSNumberFormatterCurrencyStyleযদি মুদ্রাগুলির সাথে কাজ করছেন যেখানে স্ট্রিংয়ে মুদ্রা প্রতীক রয়েছে এমন ফর্ম্যাটরটি ব্যবহার করতে পারেন ।


আমি অ্যাপ্লিকেশনগুলির জন্য স্ট্রিং ক্লাস বাড়ানোর ধারণা পছন্দ করি যা একাধিক স্থান রূপান্তর ব্যবহার করবে। তবে এনএসএনম্বারফর্মেটর আহ্বান করার জটিলতার সুবিধাটি আমি দেখতে পাচ্ছি না, যেহেতু কাস্টটি এনএসএসট্রিংয়ের কাছে cast
পরিষ্কার

12
আসলে এনএসএনম্বারফর্ম্যাটর () ব্যবহার করার সুবিধাটি হ'ল সংখ্যা ফ্রেমস্ট্রিং: পদ্ধতিটি যদি শূন্যে অক্ষর থাকে যা ডাবল না করে থাকে তবে শূন্য হবে। এনএসএসস্ট্রিংয়ের ডাবলভ্যালুতে সমস্যাটি হ'ল এটি সর্বদা একটি ডাবল (উদাহরণস্বরূপ "পরীক্ষার জন্য" 0.0) ফেরত আসবে regard সুতরাং আপনি যদি সমস্ত ধরণের স্ট্রিংয়ের সাথে কাজ করে থাকেন এবং আপনি যদি পরীক্ষা করতে চান যে স্ট্রিংটি কেবল একটি ডাবল, কোনও অতিরিক্ত অক্ষর নয়, তবে এনএসএনম্বারফর্ম্যাটটারটি ব্যবহার করার উপায়।
dirkgroten

4
এটি ফরাসি ভাষায় ব্যর্থ।
পিটার কে।

1
এটি দুর্দান্ত সমাধান, তবে কেবল এই কোডটি ব্যবহার করে এটি এমন দেশগুলিতে কার্যকর হবে না যেখানে কমাগুলি বিভাজক হিসাবে ব্যবহৃত হয় (ফ্রান্স সহ @ পিটারক হিসাবে উল্লেখ করা হয়েছে)। আমি সমাধানটির সাথে একটি মন্তব্য লেখার চেষ্টা করেছি, তবে এটি অনেক দীর্ঘ ছিল তাই পরিবর্তে আমাকে এটির উত্তর দিতে হয়েছিল। আপনি এখানে যান: পরিবর্তিত সমাধান
জ্যাকব আর

53

এখানে অন্য বিকল্পটি এটিকে রূপান্তর NSStringকরে এটি ব্যবহার করছে:

let string = NSString(string: mySwiftString)
string.doubleValue

13
আমি আশা করি এটি করার একটি ভাল উপায় ছিল। উদাহরণস্বরূপ, পার্সিং ব্যর্থ হয়েছে কিনা তা আমি কীভাবে জানতে পারি।
রায়ান হফম্যান

2
@ রায়ানহফম্যান দুর্ভাগ্যক্রমে এনএসএসআর্টিং ডাবলভ্যালু চুক্তিটি এর আগে কখনও সরবরাহ করে নি। স্ট্রিংটি কোনও সংখ্যার বৈধ উপস্থাপনা, ওভারফ্লো / আন্ডারফ্লোতে HUGE_VAL এবং -HUGE_VAL দিয়ে শুরু না হলে আপনি যা পান তা সব 0.0 হয়। পার্সিং কেন ব্যর্থ হয়েছে তা আপনি যদি জানতে চান তবে আমি বিশ্বাস করি যে আপনাকে এনএসএনম্বার ফর্ম্যাটটারটি সন্ধান করা উচিত যা আরও শক্তিশালী উপায়ে নম্বর / স্ট্রিং রূপান্তর পরিচালনার জন্য ডিজাইন করা হয়েছিল।
জারসেন

যেহেতু এই উত্তরটি খুঁজে পেতে সমস্যা হতে পারে, তাই এখানে এটি রয়েছে:(swiftString as NSString).doubleValue
শিখুন কোকোস

24

এখানে একটি এক্সটেনশন পদ্ধতি যা আপনাকে কেবল একটি সুইফ্ট স্ট্রিংয়ে ডাবলভ্যালু () কল করতে এবং ডাবল ফেরত পেতে দেয় (উদাহরণস্বরূপ আউটপুট প্রথমে আসে)

println("543.29".doubleValue())
println("543".doubleValue())
println(".29".doubleValue())
println("0.29".doubleValue())

println("-543.29".doubleValue())
println("-543".doubleValue())
println("-.29".doubleValue())
println("-0.29".doubleValue())

//prints
543.29
543.0
0.29
0.29
-543.29
-543.0
-0.29
-0.29

এখানে এক্সটেনশন পদ্ধতিটি রয়েছে:

extension String {
    func doubleValue() -> Double
    {
        let minusAscii: UInt8 = 45
        let dotAscii: UInt8 = 46
        let zeroAscii: UInt8 = 48

        var res = 0.0
        let ascii = self.utf8

        var whole = [Double]()
        var current = ascii.startIndex

        let negative = current != ascii.endIndex && ascii[current] == minusAscii
        if (negative)
        {
            current = current.successor()
        }

        while current != ascii.endIndex && ascii[current] != dotAscii
        {
            whole.append(Double(ascii[current] - zeroAscii))
            current = current.successor()
        }

        //whole number
        var factor: Double = 1
        for var i = countElements(whole) - 1; i >= 0; i--
        {
            res += Double(whole[i]) * factor
            factor *= 10
        }

        //mantissa
        if current != ascii.endIndex
        {
            factor = 0.1
            current = current.successor()
            while current != ascii.endIndex
            {
                res += Double(ascii[current] - zeroAscii) * factor
                factor *= 0.1
                current = current.successor()
           }
        }

        if (negative)
        {
            res *= -1;
        }

        return res
    }
}

কোনও ত্রুটি পরীক্ষা করা হয়নি, তবে আপনার প্রয়োজন হলে এটি যোগ করতে পারেন।


20

সুইফট 1.1 থেকে আপনি সরাসরি প্রেরণ করতে পারেন Stringথেকে const char *প্যারামিটার।

import Foundation

let str = "123.4567"
let num = atof(str) // -> 123.4567

atof("123.4567fubar") // -> 123.4567

আপনি যদি অবহেলিত পছন্দ না করেন atof:

strtod("765.4321", nil) // -> 765.4321

একটি সতর্কতামূলক: রূপান্তরকরণের আচরণের চেয়ে আলাদা NSString.doubleValue

atofএবং উপসর্গযুক্ত হেক্স স্ট্রিং strtodগ্রহণ করুন 0x:

atof("0xffp-2") // -> 63.75
atof("12.3456e+2") // -> 1,234.56
atof("nan") // -> (not a number)
atof("inf") // -> (+infinity)

আপনি যদি .doubleValueআচরণ পছন্দ করেন , আমরা এখনও CFStringসেতু ব্যবহার করতে পারি :

let str = "0xff"
atof(str)                      // -> 255.0
strtod(str, nil)               // -> 255.0
CFStringGetDoubleValue(str)    // -> 0.0
(str as NSString).doubleValue  // -> 0.0

আমি ingালাইয়ের পরিবর্তে এই পদ্ধতির ভক্ত NSString
স্যাম সোফেস

10

সুইফট ২.০-তে সর্বোত্তম উপায় হ'ল উদ্দেশ্য-সি বিকাশকারীটির মতো চিন্তাভাবনা এড়ানো। সুতরাং আপনার "স্ট্রিংকে ডাবল রূপান্তর করা উচিত নয়" আপনার "স্ট্রিং থেকে একটি ডাবলকে আরম্ভ করা উচিত"। অ্যাপল ডক এখানে: https://developer.apple.com/library/ios//docamentation/Swift/References/Swift_Double_St ساخت/index.html#//apple_ref/swift/structctr/Double/s: FSdcFMSdFSSGSqSd_

এটি একটি initচ্ছিক উদ্যোগ যাতে আপনি একটি ডিফল্ট মান সেট করতে নীল কোয়েলসিং অপারেটর (??) ব্যবহার করতে পারেন। উদাহরণ:

let myDouble = Double("1.1") ?? 0.0

Double.init?(_ text: String)সুইফট ২.০ এ উপলব্ধ হয়ে উঠুন। আপনি এটি উল্লেখ করা উচিত। অন্যান্য উত্তরগুলি এখানে নয় কারণ লোকেরা উদ্দেশ্য-সি বিকাশকারীদের মতো মনে করে তবে এই ইনিশিয়ালাইজারটি আগে পাওয়া যায় নি।
মিশ্র

সত্যিই আপনি ঠিক বলেছেন। এটি কেবল সুইফট ২.০ এ উপলব্ধ, আমি এটি উল্লেখ করব :) তবে অন্যান্য ভাষাগুলির মতো আপনিও অন্যর সাথে একটি প্রকারের সূচনা করেন এবং কোনও ধরণের অন্যকে রূপান্তর করতে সক্ষম হওয়ার আশা করা উচিত নয়। দীর্ঘ বিতর্ক তবে ওবজে-সি বিকাশকারী হিসাবে সুইফটের সাথে কোডিং করার সময় আমার অনেক খারাপ অভ্যাস আছে এবং এটি তাদের মধ্যে একটি :)
টুম

10

উপর স্যুইফ্ট 3 , আপনি ব্যবহার করতে পারেন:

if let myDouble = NumberFormatter().number(from: yourString)?.doubleValue {
   print("My double: \(myDouble)")
}

দ্রষ্টব্য: - কোনও স্ট্রিংয়ে যদি সংখ্যাসূচক সংখ্যা বা লোকেল-উপযুক্ত গ্রুপ বা দশমিক বিভাজক ব্যতীত অন্য কোনও অক্ষর থাকে তবে পার্সিং ব্যর্থ হবে। - কোনও স্ট্রিংয়ে থাকা কোনও নেতৃস্থানীয় বা অনুসরণকারী স্পেস বিভাজনকারী অক্ষর উপেক্ষা করা হবে। উদাহরণস্বরূপ, "5", "5" এবং "5" স্ট্রিংগুলি 5 নম্বর দেয়।

ডকুমেন্টেশন থেকে নেওয়া: https://developer.apple.com/references/foundation/number فارtter/1408845- সংখ্যা


10

আমি যে উত্তরটি খুঁজছিলাম তা আমি দেখিনি। এটি যে কাউকে সহায়তা করতে পারে সে ক্ষেত্রে আমি এখানে আমার পোস্ট করি। এই উত্তরটি কেবলমাত্র বৈধ যদি আপনার নির্দিষ্ট বিন্যাসের প্রয়োজন হয় না

সুইফট 3

extension String {
    var toDouble: Double {
        return Double(self) ?? 0.0
    }
}

9

এটা চেষ্টা কর:

   var myDouble = myString.bridgeToObjectiveC().doubleValue
   println(myDouble)

বিঃদ্রঃ

বিটা 5 এ সরানো হয়েছে? এটি আর কাজ করে না?


1
ব্রিজটিওজেক্টিভসি () এক্সকোড 6 বিটা 5 তে সরানো হয়েছে Mr মিঃ স্মাইলির পদ্ধতিটি এই মুহুর্তে আমি সবচেয়ে দ্রুত খুঁজে পেয়েছি
faraquet99

7

এটি @ রিউর উত্তরের ভিত্তিতে তৈরি করছে

তার সমাধান যতক্ষণ না আপনি এমন একটি দেশে রয়েছেন যতক্ষণ বিন্দু বিভাজক হিসাবে ব্যবহৃত হয়। ডিফল্টরূপে NSNumberFormatterডিভাইসগুলির লোকেল ব্যবহার করে। সুতরাং এই সমস্ত দেশে ব্যর্থ হবে যেখানে সংখ্যাকে বিভাজক হিসাবে বিন্দু ব্যবহার করে (যা সাধারণত ক্ষেত্রে হয়) যদি কমাটি ডিফল্ট বিভাজক হিসাবে ব্যবহৃত হয় (ফ্রান্সকে @ পিটারক হিসাবে উল্লিখিত) used এই এনএসএনম্বার ফর্ম্যাটারের লোকেলটি মার্কিন যুক্তরাষ্ট্রে সেট করতে এবং বিন্দুগুলি লাইনটি প্রতিস্থাপনের জন্য ব্যবহার করতে হবে

return NSNumberFormatter().numberFromString(self)?.doubleValue

সঙ্গে

let numberFormatter = NSNumberFormatter()
numberFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
return numberFormatter.numberFromString(self)?.doubleValue

সুতরাং সম্পূর্ণ কোড হয়ে যায়

extension String {
    func toDouble() -> Double? {
        let numberFormatter = NSNumberFormatter()
        numberFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
        return numberFormatter.numberFromString(self)?.doubleValue
    }
}

এটি ব্যবহার করতে, কেবল কল করুন "Your text goes here".toDouble()

এটি একটি returnচ্ছিক ফিরে আসবে Double?

@ রিউ উল্লিখিত হিসাবে আপনি হয় আনরপ্প চাপ দিতে পারেন:

println("The value is \(myDouble!)") // prints: The value is 4.2

অথবা একটি if letবিবৃতি ব্যবহার করুন :

if let myDouble = myDouble {
    println("The value is \(myDouble)") // prints: The value is 4.2
}

1
এটি সঠিক উত্তর। সুইফট 3 সংস্করণটি হবে NumberFormatter().number(from: myString)?.doubleValue
নিকোলাস লিও

7

সুইফট 4

extension String {
    func toDouble() -> Double? {
        let numberFormatter = NumberFormatter()
        numberFormatter.locale = Locale(identifier: "en_US_POSIX")
        return numberFormatter.number(from: self)?.doubleValue
    }
}


6

সুইফট: 4 এবং 5

এটি করার জন্য সম্ভবত দুটি উপায় রয়েছে:

  1. স্ট্রিং -> আন্ত -> ডাবল:

    let strNumber = "314"
    if let intFromString = Int(strNumber){
        let dobleFromInt = Double(intFromString)
        print(dobleFromInt)
    }
  2. স্ট্রিং -> এনএসএস স্ট্রিং -> ডাবল

    let strNumber1 = "314"
    let NSstringFromString = NSString(string: strNumber1)
    let doubleFromNSString = NSstringFromString.doubleValue
    print(doubleFromNSString)

কোডটির আপনার প্রয়োজন অনুসারে এটি আপনার পছন্দ মতো ব্যবহার করুন।


প্রথম পদ্ধতিটি আমার পক্ষে কাজ করে না, তবে দ্বিতীয়টি বেশ ভালভাবে কাজ করে।
সৌরভ

@ সৌরভ, আপনার স্ট্রিংটি কী ছিল সে সম্পর্কে আপনি আরও বিস্তারিত বলতে পারেন?
অভিরাজসিংহ ঠাকুর

5

খেলার মাঠে এটি পরীক্ষা করুন!

let sString = "236.86"

var dNumber = NSNumberFormatter().numberFromString(sString)
var nDouble = dNumber!
var eNumber = Double(nDouble) * 3.7

আমার এক্সকোডের মাধ্যমে

.toDouble () - বিদ্যমান নেই

.doubleValue সংখ্যাযুক্ত স্ট্রিং থেকে 0.0 মান তৈরি করুন ...


4

1।

let strswift = "12"
let double = (strswift as NSString).doubleValue

2।

var strswift= "10.6"
var double : Double = NSString(string: strswift).doubleValue 

আপনার জন্য এই সাহায্য হতে পারে।


4

ইতিমধ্যে নির্দেশিত হিসাবে, এটি অর্জনের সর্বোত্তম উপায় হ'ল সরাসরি কাস্টিং:

(myString as NSString).doubleValue

এটি থেকে বিল্ডিংয়ের মাধ্যমে আপনি একটি চালিত দেশীয় সুইফট স্ট্রিং এক্সটেনশন তৈরি করতে পারেন:

extension String {
    var doubleValue: Double {
        return (self as NSString).doubleValue
    }
}

এটি আপনাকে সরাসরি ব্যবহার করতে দেয়:

myString.doubleValue

যা আপনার জন্য ingালাই সম্পাদন করবে। অ্যাপল যদি doubleValueদেশীয় স্ট্রিংয়ের সাথে একটি যোগ করে তবে আপনাকে কেবল এক্সটেনশনটি সরিয়ে ফেলতে হবে এবং আপনার কোডের বাকী অংশটি স্বয়ংক্রিয়ভাবে জরিমানা সংকলন করবে!


অ্যাপলের পদ্ধতিকে .toDouble বলা হবে ... টু আইন্টের মতো। এটি একটি অদ্ভুত বাদ। ভবিষ্যতের সুইফ্ট সংস্করণে সংশোধন করার সম্ভাবনা রয়েছে। আমি এক্সটেনশন পদ্ধতিটি সর্বোত্তম পছন্দ করি, কোডটি পরিষ্কার রাখি।
n13

ফিরতি মানটি একটি ডাবল নয় একটি ফ্লোট হওয়া উচিত
লিও ডাবাস

4

সুইফট 3

পরিষ্কার করার জন্য, আজকাল একটি ডিফল্ট পদ্ধতি রয়েছে:

public init?(_ text: String)এর Doubleবর্গ।

এটি সব শ্রেণীর জন্য ব্যবহার করা যেতে পারে।

let c = Double("-1.0") let f = Double("0x1c.6") let i = Double("inf") ইত্যাদি


2

Alচ্ছিক লোকেল সহ এক্সটেনশন

সুইফট 2.2

extension String {
    func toDouble(locale: NSLocale? = nil) -> Double? {
        let formatter = NSNumberFormatter()
        if let locale = locale {
            formatter.locale = locale
        }
        return formatter.numberFromString(self)?.doubleValue
    }
}

সুইফট ৩.১

extension String {
    func toDouble(_ locale: Locale) -> Double {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.locale = locale
        formatter.usesGroupingSeparator = true
        if let result = formatter.number(from: self)?.doubleValue {
            return result
        } else {
            return 0
        }
    }
}

1
আমি সুইফট ৩.১ উদাহরণ যুক্ত করেছি। "... এবং লোকেলের জন্য উদাহরণ যোগ করুন" বলতে কী বোঝ? 🙂
অনুকরণ করুন

1

অথবা আপনি করতে পারেন:

var myDouble = Double((mySwiftString.text as NSString).doubleValue)

1

আপনি স্ট্রিংএক্স ব্যবহার করতে পারেন । এটি Stringস্ট্রিং-টু-নম্বর রূপান্তর সহ প্রসারিত toDouble()

extension String {
    func toDouble() -> Double?
}

এটি স্ট্রিংটি যাচাই করে এবং এটি ডাবল রূপান্তর করতে না পারলে ব্যর্থ হয়।

উদাহরণ:

import StringEx

let str = "123.45678"
if let num = str.toDouble() {
    println("Number: \(num)")
} else {
    println("Invalid string")
}


0

কি কাজ করে:

// Init default Double variable
var scanned: Double()

let scanner = NSScanner(string: "String to Scan")
scanner.scanDouble(&scanned)

// scanned has now the scanned value if something was found.

দ্রষ্টব্য: 'স্ক্যানডুবল' আইওএস 13.0 এ
অবমূল্যায়ন করা


0

Scannerকিছু ক্ষেত্রে ব্যবহার করা স্ট্রিং থেকে সংখ্যাগুলি বের করার একটি খুব সুবিধাজনক উপায়। এবং এটি প্রায় ততই শক্তিশালী NumberFormatterযখন ডিকোডিং এবং বিভিন্ন সংখ্যক ফর্ম্যাট এবং লোকালগুলি নিয়ে কাজ করার বিষয়টি আসে। এটি বিভিন্ন দশমিক এবং গোষ্ঠী বিভাজক সহ সংখ্যা এবং মুদ্রা বের করতে পারে।

import Foundation
// The code below includes manual fix for whitespaces (for French case)
let strings = ["en_US": "My salary is $9,999.99",
               "fr_FR": "Mon salaire est 9 999,99€",
               "de_DE": "Mein Gehalt ist 9999,99€",
               "en_GB": "My salary is £9,999.99" ]
// Just for referce
let allPossibleDecimalSeparators = Set(Locale.availableIdentifiers.compactMap({ Locale(identifier: $0).decimalSeparator}))
print(allPossibleDecimalSeparators)
for str in strings {
    let locale = Locale(identifier: str.key)
    let valStr = str.value.filter{!($0.isWhitespace || $0 == Character(locale.groupingSeparator ?? ""))}
    print("Value String", valStr)

    let sc = Scanner(string: valStr)
    // we could do this more reliably with `filter` as well
    sc.charactersToBeSkipped = CharacterSet.decimalDigits.inverted
    sc.locale = locale

    print("Locale \(locale.identifier) grouping separator: |\(locale.groupingSeparator ?? "")| . Decimal separator: \(locale.decimalSeparator ?? "")")
    while !(sc.isAtEnd) {
        if let val = sc.scanDouble() {
            print(val)
        }

    }
}

যাইহোক, বিভাজকদের সাথে এমন কিছু সমস্যা রয়েছে যা শব্দ সীমানা হিসাবে ধারণা করা যেতে পারে।

// This doesn't work. `Scanner` just ignores grouping separators because scanner tends to seek for multiple values
// It just refuses to ignore spaces or commas for example.
let strings = ["en_US": "$9,999.99", "fr_FR": "9999,99€", "de_DE": "9999,99€", "en_GB": "£9,999.99" ]
for str in strings {
    let locale = Locale(identifier: str.key)
    let sc = Scanner(string: str.value)
    sc.charactersToBeSkipped = CharacterSet.decimalDigits.inverted.union(CharacterSet(charactersIn: locale.groupingSeparator ?? ""))
    sc.locale = locale
    print("Locale \(locale.identifier) grouping separator: \(locale.groupingSeparator ?? "") . Decimal separator: \(locale.decimalSeparator ?? "")")
    while !(sc.isAtEnd) {
        if let val = sc.scanDouble() {
            print(val)
        }

    }
}
//     sc.scanDouble(representation: Scanner.NumberRepresentation) could help if there were .currency case

লোকেলটি স্বয়ংক্রিয়ভাবে সনাক্ত করতে কোনও সমস্যা নেই। নোট করুন যে ফরাসি স্থানীয় লোকালগুলিতে গ্রুপিংসপেটর স্ট্রিং "সোম বেতন ইস্ট 9999,99 €" স্ট্রিং নয়, যদিও এটি স্থান হিসাবে ঠিক রেন্ডার হতে পারে (এখানে এটি তা দেয় না)। নীচের কোডটি !$0.isWhitespaceচরিত্রগুলি ছাঁটা না করে কেন সূক্ষ্মভাবে কাজ করে তা ঠিক ts

let stringsArr = ["My salary is $9,999.99",
                  "Mon salaire est 9 999,99€",
                  "Mein Gehalt ist 9.999,99€",
                  "My salary is £9,999.99" ]

let tagger = NSLinguisticTagger(tagSchemes: [.language], options: Int(NSLinguisticTagger.Options.init().rawValue))
for str in stringsArr {
    tagger.string = str
    let locale = Locale(identifier: tagger.dominantLanguage ?? "en")
    let valStr = str.filter{!($0 == Character(locale.groupingSeparator ?? ""))}
    print("Value String", valStr)

    let sc = Scanner(string: valStr)
    // we could do this more reliably with `filter` as well
    sc.charactersToBeSkipped = CharacterSet.decimalDigits.inverted
    sc.locale = locale

    print("Locale \(locale.identifier) grouping separator: |\(locale.groupingSeparator ?? "")| . Decimal separator: \(locale.decimalSeparator ?? "")")
    while !(sc.isAtEnd) {
        if let val = sc.scanDouble() {
            print(val)
        }

    }
}
// Also will fail if groupingSeparator == decimalSeparator (but don't think it's possible)

-1

আমি স্ট্রিংয়ে অনুসরণ হিসাবে একটি এক্সটেনশন যুক্ত করতে আরও পাঠযোগ্য বলে মনে করি:

extension String {
    var doubleValue: Double {
        return (self as NSString).doubleValue
    }
}

এবং তারপরে আপনি কেবল আপনার কোডটি লিখতে পারেন:

myDouble = myString.doubleValue

-1

আমার সমস্যাটি কমা ছিল তাই আমি এটিকে এটি সমাধান করি:

extension String {
    var doubleValue: Double {
        return Double((self.replacingOccurrences(of: ",", with: ".") as NSString).doubleValue)
    }
}


-6

আমরা সিডিউবল মান ব্যবহার করতে পারি যা মাই স্ট্রিং.ডুবলভ্যালু দ্বারা প্রাপ্ত হবে


ত্রুটি: 'স্ট্রিং'-এর' ডাবলভ্যালু 'নামে কোনও সদস্য নেই
ম্যাথু ক্নিপেন

@Matthew হ্যা সেখানে, কোন সদস্য "দ্বৈত মান" বলা হয় তাই আমরা CDouble মূল্য ব্যবহার করতে পারেন
ANIL.MUNDURU

1
en.wikedia.org/wiki/… সেখানে জটিল সংখ্যাগুলি পড়ুন এবং সুইফট রেফারেন্স ডকুমেন্টেশন পড়ুন .. কোনও সিডিবল নেই ... আপনি কি সুইফট বা অন্য কোনও ভাষা নিয়ে কথা বলছেন? এবং আমি এক্সটেনশন ছাড়াই দ্রুত বলতে চাইছি?
অ্যাড্রিয়ান স্লুইটার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.