স্ট্রিং ডাবল থেকে সুইফ্ট


108

আমি এক্সকোড updated আপডেট করার আগে, আমার কাছে স্ট্রিংয়ে ডাবল ingালতে কোনও সমস্যা হয়নি তবে এখন এটি আমাকে একটি ত্রুটি দেয়

var a: Double = 1.5
var b: String = String(a)

এটি আমাকে ত্রুটি বার্তা দেয় "ডাবল স্ট্রিংয়ে রূপান্তরযোগ্য নয়"। এটা করতে অন্য কোন উপায় আছে কি?


5
এটির মতো এটির সংজ্ঞা দেওয়ার জন্যও এটি কার্যকর হতে পারেvar b = "\(a)"
এরদেখায়সার

উত্তর:


211

এটি ingালাই করছে না, এটি একটি ফর্ম্যাট সহ একটি মান থেকে একটি স্ট্রিং তৈরি করছে।

let a: Double = 1.5
let b: String = String(format: "%f", a)

print("b: \(b)") // b: 1.500000

একটি ভিন্ন বিন্যাস সহ:

let c: String = String(format: "%.1f", a)

print("c: \(c)") // c: 1.5

formatকোনও বিন্যাসের প্রয়োজন না হলে আপনি সম্পত্তিটি বাদ দিতে পারেন।


1
একটি বড় ভগ্নাংশ সংখ্যা সংখ্যার সাথে একটি ডাবল সম্পর্কে কি? যেমন একটি = 2.34934340320 যাক স্ট্রিংভ্যালু = স্ট্রিং (ফর্ম্যাট: "% f", ক) দেবে 2.349343
নিকো

1
ডিসপ্লেটি প্রিন্টফ ফর্ম্যাটিং বিকল্পগুলির সাহায্যে নিয়ন্ত্রণ করা যায়, দেখুন: স্ট্রিং ফর্ম্যাট স্পেসিফায়ার এবং প্রিন্টফ (3)
জাফ

2
আপনি ডিজিটের পরিমাণ নিয়ন্ত্রণ করতে আপনার বিন্যাস পরিবর্তন করতে হবে মাত্র: format:"%.1f" = 1 digit // 1.5; format:"%.5f" = 5 digits // 1.50000
মেগেট্রন

3
আপনার উত্তরটি আপডেট করুন, সুইফট ২.১ এ আপনাকে কেবলমাত্র করতে হবে String(yourDouble)
আলেকজান্দ্রে জি।

1
আপনি var পরিবর্তে লেট ব্যবহার করতে পারেন। এটিকে কয়েকবার কল করার দরকার নেই।
ওলেকসান্ডার

81
let double = 1.5 
let string = double.description

এক্সকোড 7.1 আপডেট করুন • সুইফট 2.1:

এখন ডাবল স্ট্রিংয়ে রূপান্তরিত হয় যাতে আপনি এটি আপনার ইচ্ছামত ব্যবহার করতে পারেন:

let double = 1.5
let doubleString = String(double)   // "1.5"

সুইফট 3 বা তারপরে আমরা এটি প্রসারিত LosslessStringConvertibleএবং জেনেরিক করতে পারি

এক্সকোড 11.3 • সুইফ্ট 5.1 বা তারপরে

extension LosslessStringConvertible { 
    var string: String { .init(self) } 
}

let double = 1.5 
let string = double.string  //  "1.5"

ভগ্নাংশের একটি নির্দিষ্ট সংখ্যার জন্য আমরা FloatingPointপ্রোটোকল প্রসারিত করতে পারি :

extension FloatingPoint {
    func fixedFraction(digits: Int) -> String {
        return String(format: "%.*f", digits, self as! CVarArg)
    }
}

আপনার যদি আপনার নম্বর বিন্যাসের উপর আরও নিয়ন্ত্রণের প্রয়োজন হয় (সর্বনিম্ন এবং সর্বাধিক ভগ্নাংশের সংখ্যা এবং রাউন্ডিং মোড) আপনি নাম্বার ফর্ম্যাটার ব্যবহার করতে পারেন:

extension Formatter {
    static let number = NumberFormatter()
}

extension FloatingPoint {
    func fractionDigits(min: Int = 2, max: Int = 2, roundingMode: NumberFormatter.RoundingMode = .halfEven) -> String {
        Formatter.number.minimumFractionDigits = min
        Formatter.number.maximumFractionDigits = max
        Formatter.number.roundingMode = roundingMode
        Formatter.number.numberStyle = .decimal
        return Formatter.number.string(for: self) ?? ""
    }
}

2.12345.fractionDigits()                                    // "2.12"
2.12345.fractionDigits(min: 3, max: 3, roundingMode: .up)   // "2.124"

1
এটি কি একটি হ্যাক বা এটি করার একটি বৈধ উপায়? এটি বিভিন্ন আইওএস সংস্করণে কোনও সমস্যা সৃষ্টি করবে?
এসকরার্থ

2
না, বিভিন্ন আইওএস সংস্করণ নিয়ে আপনার কোনও সমস্যা হবে না। এটি ওএসএক্সের জন্যও কাজ করে। বিটিডাব্লু আপনি ডাবল বা ইন্টের সাহায্যে স্ট্রিং ইন্টারপোলেশন করার সময় এটি পাবেন।
লিও ডাবাস

খুব দরকারী. আপনি% f এর মতো ফর্ম্যাট করতে পারবেন না। এবং এটি ইন্টার এর জন্যও কাজ করে তাই আপনার কাছে এটি দুটি ধরণের করার একটি উপায় রয়েছে।
প্যাট্রিক ভ্যাবেরার

এটি 0.00001 এর জন্য কাজ করবে না, এটি স্ট্রিং হিসাবে "1e-05" হয়ে যায়।
অ্যালেক্স

প্রতিস্থাপন String(format: "%.\(digits)f", self as! CVarArg)সঙ্গেString(format: "%.*f", digits, self as! CVarArg)
rmaddy

21

@ জাফ উত্তর ছাড়াও, আপনি তৈরি করতে পারেন extension:

extension Double {
    func toString() -> String {
        return String(format: "%.1f",self)
    }
}

ব্যবহার:

var a:Double = 1.5
println("output: \(a.toString())")  // output: 1.5

1
@ ম্যাক্সিমশৌস্টিন ওপিতে ভোট এবং উত্তর দেওয়ার জন্য পর্যাপ্ত প্রতিনিধি নেই, 15 টি প্রয়োজনীয়। আমি কোনও এক্সটেনশন তৈরির সাথেও একমত নই, যখন বিবৃতিটি: a.toString()অন্য বিকাশকারী দ্বারা দেখেন অবশ্যই একটি ডাব্লুটিএফ মুহুর্ত থাকবে।
জাফ

1
@ জাফ কেন নেই। নিশ্চিতরূপে আপনি কিছু উপসর্গ যুক্ত করতে এবং myToString()এটির কাস্টম সংজ্ঞা নিশ্চিত করতে এটি পরিবর্তন করতে পারেন । তবে অন্যান্য ভাষার মতো প্রোটোটাইপিং কোড ডুপ্লিকেট এবং ভাল রক্ষণাবেক্ষণ এড়ানোর দিকে পরিচালিত করে।
ম্যাক্সিম শৌস্টিন

নবাগত প্রশ্ন @MaximShoustin: মধ্যে পার্থক্য কি println("output: \(a.toString())")এবং println("output: \(a)")। দ্বিতীয় বিকল্প সংকলন ত্রুটি ঘটায় না। এই বিকল্পটি কি খারাপ অভ্যাস?
অ্যালেক্স গেরেরো

ডাবল বা ফ্লোটিংপয়েন্টে এমন এক্সটেনশনটি লেখার কোনও চতুর উপায় আছে যা একটি খালি স্ট্রিং ফিরিয়ে দেওয়ার জন্য ptionচ্ছিক ডাবলে কাজ করবে?
কিনারজি

@ কিনারজিyourDouble?.toString() ?? ""
লিও ডাবাস

11

সুইফ্ট 3+: কোডের এই লাইনটি ব্যবহার করে দেখুন

let num: Double = 1.5

let str = String(format: "%.2f", num)

9

কিছুটা দ্রুত গতিতে স্ট্রিং তৈরি করতে এনাম মানগুলি প্রিন্টলান () পদ্ধতিতে যা করেন তা কেবল করুন

উদাহরণ স্বরূপ:

var stringOfDBL = "\(myDouble)"


3

এই ফাংশনটি আপনাকে দেখানোর জন্য দশমিক জায়গাগুলির সংখ্যা নির্দিষ্ট করতে দেবে:

func doubleToString(number:Double, numberOfDecimalPlaces:Int) -> String {
    return String(format:"%."+numberOfDecimalPlaces.description+"f", number)
}

ব্যবহার:

let numberString = doubleToStringDecimalPlacesWithDouble(number: x, numberOfDecimalPlaces: 2)

প্রতিস্থাপন String(format:"%."+numberOfDecimalPlaces.description+"f", number)সঙ্গেString(format:"%.*f", numberOfDecimalPlaces, number)
rmaddy

3

এখানে অনেক উত্তর রয়েছে যা বিভিন্ন কৌশল প্রস্তাব করে। তবে ইউআইতে সংখ্যা উপস্থাপন করার সময়, আপনি অবিচ্ছিন্নভাবে এমন একটি ব্যবহার করতে চান NumberFormatterযাতে ফলাফলগুলি যথাযথভাবে ফর্ম্যাট, গোল এবং স্থানীয়করণ হয়:

let value = 10000.5

let formatter = NumberFormatter()
formatter.numberStyle = .decimal

guard let string = formatter.string(for: value) else { return }
print(string) // 10,000.5

আপনি যদি দশমিক স্থানের স্থির সংখ্যা চান তবে মুদ্রা মানগুলির জন্য

let value = 10000.5

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2

guard let string = formatter.string(for: value) else { return }
print(string) // 10,000.50

তবে এই পদ্ধতির সৌন্দর্যটি হ'ল এটি সঠিকভাবে স্থানীয়করণ করা হবে, যার ফলস্বরূপ 10,000.50মার্কিন যুক্তরাষ্ট্রে তবে 10.000,50জার্মানি। বিভিন্ন লোকেলে সংখ্যার জন্য আলাদা আলাদা পছন্দসই ফর্ম্যাট NumberFormatterরয়েছে এবং ইউআই এর মধ্যে সংখ্যাসূচক মানগুলি উপস্থাপন করার সময় আমাদের শেষ ব্যবহারকারীর পছন্দসই ফর্ম্যাটটি ব্যবহার করা উচিত ।

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


2
এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত
আসাদ খান



0
var b = String(stringInterpolationSegment: a)

এটি আমার পক্ষে কাজ করে। আপনি চেষ্টা করতে পারেন


0

সুইফট 4-এ আপনি যদি টেক্সট লেবেল "স্ট্রিং" হিসাবে UI তে ডাবলটি সংশোধন করতে এবং ব্যবহার করতে চান তবে আপনি আপনার ফাইলটির শেষে এটি যুক্ত করতে পারেন:

    extension Double {
func roundToInt() -> Int{
    return Int(Darwin.round(self))
}

}

আপনি যদি এটি কোনও পাঠ্য লেবেলে রাখতে চান তবে এটি ব্যবহার করুন:

currentTemp.text = "\(weatherData.tempCelsius.roundToInt())"

অথবা এটি কোনও ইন্টার হিসাবে মুদ্রণ করুন:

print(weatherData.tempCelsius.roundToInt())

0

আমি এনএসএনम्बर এবং নাম্বার ফর্ম্যাটার পদ্ধতির পছন্দ করতে চাই (যেখানে প্রয়োজন), আপনি ফোলা কোড এড়াতে এক্সটেনশনও ব্যবহার করতে পারেন

extension Double {

   var toString: String {
      return NSNumber(value: self).stringValue
   }

}

ইউ এছাড়াও বিপরীত পদ্ধতির প্রয়োজন হতে পারে

extension String {

    var toDouble: Double {
        return Double(self) ?? .nan
    }

}

আপনি কেন alচ্ছিক ফিরে আসছেন তবে নন ন্যাসন বরাদ্দ দিচ্ছেন যদি? আপনার এক বা অন্যটি করা উচিত। দুটোই নয়। বিটিডব্লিউ স্ট্রিং ইনিশিয়ালাইজার ব্যবহার করে কী ভুল? আপনি LossLessStringConvertibleডাবলextension LosslessStringConvertible { var string: String { return .init(self) } }
লিও ডাবাস

আপনি ডাবল ফিরে আসছেন? আমি অস্বীকার করছি যেহেতু আমি ইতিমধ্যে এটি শূন্য এবং
চ্যানেলটি না-ই

0

সুইফট 5 : নিম্নলিখিত কোড ব্যবহার করুন

extension Double {

    func getStringValue(withFloatingPoints points: Int = 0) -> String {
        let valDouble = modf(self)
        let fractionalVal = (valDouble.1)
        if fractionalVal > 0 {
            return String(format: "%.*f", points, self)
        }
        return String(format: "%.0f", self)
    }
}

প্রতিস্থাপন String(format: "%.\(points)f", self)সঙ্গেString(format: "%.*f", points, self)
rmaddy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.