সুইফট - দশমিক 0 সমান হলে একটি ফ্লোট থেকে দশমিক কীভাবে সরিয়ে ফেলবেন?


90

আমি একটি দশমিকের সাথে দূরত্ব প্রদর্শন করছি এবং এটি দশমিক 0 (উদাহরণ: 1200.0 কিলোমিটার) এর সমান হলে আমি এই দশমিকটি সরিয়ে ফেলতে চাই, আমি কীভাবে তাড়াতাড়ি এটি করতে পারি? আমি এই নম্বরটি এইভাবে প্রদর্শিত করছি:

let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: "%.1f", distanceFloat) + "Km"

উত্তর:


140

সুইফট 3/4:

var distanceFloat1: Float = 5.0
var distanceFloat2: Float = 5.540
var distanceFloat3: Float = 5.03

extension Float {
    var clean: String {
       return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
    }
}

print("Value \(distanceFloat1.clean)") // 5
print("Value \(distanceFloat2.clean)") // 5.54
print("Value \(distanceFloat3.clean)") // 5.03

সুইফট 2 (আসল উত্তর)

let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: distanceFloat == floor(distanceFloat) ? “%.0f" : "%.1f", distanceFloat) + "Km"

বা এক্সটেনশন হিসাবে:

extension Float {
    var clean: String {
        return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
    }
}

আমি এই লাইনটি আগে যুক্ত করেছি distanceFloat = floor(distanceFloat * 10) / 10এবং তারপরে এটি পুরোপুরি কাজ করেছে, ধন্যবাদ :)
কালী আনি

4
ডাবলের জন্য, এক্সটেনশন ডাবল {ভরা ক্লিন: স্ট্রিং {ফিরবেন% 1 == 0? স্ট্রিং (ফর্ম্যাট: "% .0 ডি", স্ব): স্ট্রিং (স্ব)}}
Abo3atef

4
ভাসাটি 3.01 এর মতো কিছু হলে এটি কাজ করবে না।
চেঙ্গসাম

নেতিবাচক সংখ্যা সম্পর্কে কি?
হ্যাপিহেইপ্পি

এটি এই 123456738.0 সংখ্যার জন্য কাজ করে না, রূপান্তরিত নম্বরটি 123456736 হিসাবে আসে
অনিরুদ্ধ

120

এনএস নাম্বার ফরমেটার ব্যবহার করুন:

let formatter = NumberFormatter()
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 2

// Avoid not getting a zero on numbers lower than 1
// Eg: .5, .67, etc...
formatter.numberStyle = .decimal

let nums = [3.0, 5.1, 7.21, 9.311, 600.0, 0.5677, 0.6988]

for num in nums {
    print(formatter.string(from: num as NSNumber) ?? "n/a")
}

রিটার্নস:

5.1

7.21

9.31

600

0.57

0.7


4
নিখুঁত! এটি শীর্ষে থাকা দরকার
গুডএসপিআইপি

6
সুইফট 3 এর জন্য: let formatter = NumberFormatter() formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 1 statLabel.text = formatter.string(from: value as NSNumber) ?? "n/a"
অ্যালেক্সজেক

4
প্রায় 0.3000, আমি এটি পেতে চেষ্টা করুন .3; আমি এর স্টাইলটি সেট করেছিformatter.numberStyle = .decimal
stan liu

@ ইস্তলিউ সঠিক, আপনি যদি .decimal1 এর নীচে নম্বর স্টাইল সংখ্যা যোগ না করেন তবে একটি শূন্য ছাড়াই প্রদর্শিত হবে। যেমন: .5, .78, ইত্যাদি ... এখন উত্তর সম্পাদনা করা হচ্ছে।
হটফজজসুন্দে

আমি বিশ্বাস করি এটিই এ জাতীয় সমস্যা সমাধানের উদ্দেশ্য।
ড্রাগনচেরি

55

extension এটি করার শক্তিশালী উপায়।

সম্প্রসারণ :

সুইফট 2 এর জন্য কোড (সুইফট 3 বা আরও নতুন নয়):

extension Float {
    var cleanValue: String {
        return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
    }
}

ব্যবহার :

var sampleValue: Float = 3.234
print(sampleValue.cleanValue)

3.234

sampleValue = 3.0
print(sampleValue.cleanValue)

sampleValue = 3
print(sampleValue.cleanValue)


নমুনা প্লেগ্রাউন্ড ফাইলটি এখানে


4
তবে 3.230000 -> 3.230000 ... কীভাবে "-> 3.23"?
চিপ-লাভ-এনওয়াই

4
@ চিপ-লাভ-এনওয়াই, আমি আপনাকে পাইনি।
অশোক

4
আমি বিশ্বাস করি তিনি বিশ্বাস করেন যে আপনার এক্সটেনশানটি অনুসরণীয় শূন্যগুলি সরিয়ে ফেলবে না তবে তা করে। স্ট্রিং (3.230000) = "3.23"
jeffjv

34

দ্রুত 3 এর জন্য গৃহীত উত্তরের আপডেট :

extension Float
{
    var cleanValue: String
    {
        return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
    }
}

ব্যবহার কেবল হবে:

let someValue: Float = 3.0

print(someValue.cleanValue) //prints 3

কাজ যখন আপনি করা হয় না। 14.000005, এটি 14.0 এ রূপান্তর করে
ভেটুকা

@ sc13 হুহ, এটি অদ্ভুত, আপনি যদি 14.00000005 এ ধাক্কা দেন তবে এটি এমন কি হবে যেখানে 'ক্লিনভ্যালু' ছাড়াই ভাসাটি 14 ফিরে আসবে। কীভাবে ভাসা পরিচালনা করে তাড়াতাড়ি পরিচালনা করে এর সাথে এর কিছু করার চিন্তা করুন। আমি যে বাগটি ঠিক করতে পারি কিনা তা দেখতে যাচ্ছি।
ক্রিস্টোফার লারসেন

4
আমি 14.000005 এর জন্য সঠিক আউটপুট পেয়েছি, সুতরাং @ sc13 মন্তব্যটি অপ্রচলিত বা ভুল বলে মনে হচ্ছে।
সিউর

12

এটি স্ট্রিংয়ে ফর্ম্যাট করতে, এই প্যাটার্নটি অনুসরণ করুন

let aFloat: Float = 1.123

let aString: String = String(format: "%.0f", aFloat) // "1"
let aString: String = String(format: "%.1f", aFloat) // "1.1"
let aString: String = String(format: "%.2f", aFloat) // "1.12"
let aString: String = String(format: "%.3f", aFloat) // "1.123"

এটি ইন্টারে কাস্ট করতে, এই ধরণটি অনুসরণ করুন

let aInt: Int = Int(aFloat) // "1"

আপনি যখন String(format:ইনিশিয়ালাইজার ব্যবহার করবেন , সুইফট স্বয়ংক্রিয়ভাবে নিম্নলিখিত সংখ্যার ভিত্তিতে চূড়ান্ত অঙ্কটি গোল করবে।


9

আপনি ইতিমধ্যে উল্লিখিত হিসাবে একটি এক্সটেনশন ব্যবহার করতে পারেন, এই সমাধানটি যদিও সামান্য খাটো হয়:

extension Float {
    var shortValue: String {
        return String(format: "%g", self)
    }
}

ব্যবহারের উদাহরণ:

var sample: Float = 3.234
print(sample.shortValue)

4
জন্য ব্যর্থ হবে 0.00000001। % G এর ডকুমেন্টেশন দেখুন pubs.opengroup.org/onlinepubs/009695399/function/printf.html এ : " ব্যবহৃত স্টাইলটি রূপান্তরিত মানের উপর নির্ভর করে; স্টাইল ই (বা ই) কেবল তখনই ব্যবহার করা হবে যদি এই ধরণের রূপান্তর থেকে উদ্ভূত উদ্দীপকটি ব্যবহৃত হয় -4 এর চেয়ে কম বা যথাযথের চেয়ে বড় বা সমান ""
সিউর

নিখুঁত। ধন্যবাদ
ফিলিপজ্যাকবস

7

ইন সুইফট 4 এই চেষ্টা।

    extension CGFloat{
        var cleanValue: String{
            //return String(format: 1 == floor(self) ? "%.0f" : "%.2f", self)
            return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(format: "%.2f", self)//
        }
    }

// কীভাবে ব্যবহার করবেন - আপনি যদি আরও বেশি প্রবেশ করেন তবে (।) পয়েন্টের পরে দ্বি-চরিত্রটি স্বয়ংক্রিয়ভাবে শেষ অক্ষরটি ক্রপ করছে এবং পয়েন্টের পরে কেবল দুটি অক্ষর প্রদর্শন করবে।

let strValue = "32.12"
print(\(CGFloat(strValue).cleanValue)

মান থেকে শূন্য ছাঁটাবে না 1.1: আউটপুট হবে "1.10"
Cœur

@ সিউর এটি বিন্দুর (।) পরে দুটি মান প্রদর্শনের জন্য ব্যবহৃত হয়। যদি আপনি কেবল একটি মান প্রদর্শন করতে চান তবে "রিটার্ন সেল্ট ট্রান্সকেটিংরেমেন্ডার (বিভাজক বাই: 1) == 0? স্ট্রিং (বিন্যাস:"% .0f ", স্ব): স্ট্রিং (বিন্যাস:"% .1f ", স্ব) / / "
জয়দীপ

আমি জানি ... আমি কেবল বর্ণনা করছি যে আপনার কোডটি অন্য কয়েকটি উত্তরের আচরণ থেকে কীভাবে আলাদা হয়।
Cœur

4

এনএসএনম্বারফর্মেটর আপনার বন্ধু

let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
let numberFormatter = NSNumberFormatter()
numberFormatter.positiveFormat = "###0.##"
let distance = numberFormatter.stringFromNumber(NSNumber(float: distanceFloat))!
distanceLabel.text = distance + " Km"

4

জিরোগুলি অনুসরণ না করে সর্বাধিক ভগ্নাংশের সংখ্যার সাথে ফর্ম্যাট করা

একটি কাস্টম আউটপুট নির্ভুলতা পছন্দ করা হলে এই দৃশ্যটি ভাল। এই সমাধানটি MirekE থেকে সংখ্যাফর্ম্যাটর + এনএসবার সমাধান হিসাবে প্রায় দ্রুত মনে হয় , তবে এর একটি সুবিধা হ'ল আমরা এখানে এনএসবজেক্ট এড়িয়ে চলেছি iding

extension Double {
    func string(maximumFractionDigits: Int = 2) -> String {
        let s = String(format: "%.\(maximumFractionDigits)f", self)
        var offset = -maximumFractionDigits - 1
        for i in stride(from: 0, to: -maximumFractionDigits, by: -1) {
            if s[s.index(s.endIndex, offsetBy: i - 1)] != "0" {
                offset = i
                break
            }
        }
        return String(s[..<s.index(s.endIndex, offsetBy: offset)])
    }
}

(এতে কাজ করে extension Floatতবে কেবল ম্যাকোস-টাইপ নয় Float80)

ব্যবহার: myNumericValue.string(maximumFractionDigits: 2)বাmyNumericValue.string()

এর জন্য আউটপুট maximumFractionDigits: 2:

1.0 → "1"
0.12 → "0.12"
0.012 → "0.01"
0.0012 → "0"
0.00012 → "0"



4

ডাবলের জন্য সুইফট 5 এটি ফ্লোটের জন্য @ ফ্রাঙ্কির উত্তরের সমান

var dec: Double = 1.0
dec.clean // 1

এক্সটেনশনের জন্য

extension Double {
    var clean: String {
       return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
    }

}

3

এখানে সম্পূর্ণ কোড।

let numberA: Float = 123.456
let numberB: Float = 789.000

func displayNumber(number: Float) {
    if number - Float(Int(number)) == 0 {
        println("\(Int(number))")
    } else {
        println("\(number)")
    }
}

displayNumber(numberA) // console output: 123.456
displayNumber(numberB) // console output: 789

গভীরতার মধ্যে এখানে সবচেয়ে গুরুত্বপূর্ণ লাইন।

func displayNumber(number: Float) {
  1. এর সাথে ভাসমানের দশমিক অঙ্কগুলি স্ট্রিপ করে Int(number)
  2. স্ট্রিপড নম্বরটি দিয়ে একটি অপারেশন করতে ফ্লোতে ফিরে আসে Float(Int(number))
  3. এর সাথে দশমিক-অঙ্কের মান পায় number - Float(Int(number))
  4. দশমিক-অঙ্কের মানটি খালি রয়েছে কিনা তা পরীক্ষা করে if number - Float(Int(number)) == 0

যদি এবং অন্য বিবৃতিগুলির মধ্যে থাকা সামগ্রীর ব্যাখ্যা দেওয়ার প্রয়োজন হয় না।


আপনার ক্ষেত্রে, আপনি ফাংশনটি ফিরে Stringএবং তার পরিবর্তে করতে println(result)চান return result। আশা করি এটা কাজে লাগবে!
ফাইন ম্যান

2

এটিও সহায়ক হতে পারে।

extension Float {
    func cleanValue() -> String {
        let intValue = Int(self)
        if self == 0 {return "0"}
        if self / Float (intValue) == 1 { return "\(intValue)" }
        return "\(self)"
    }
}

ব্যবহার:

let number:Float = 45.23230000
number.cleanValue()

-1

হয়তো stringByReplacingOccurrencesOfStringআপনাকে সাহায্য করতে পারে :)

let aFloat: Float = 1.000

let aString: String = String(format: "%.1f", aFloat) // "1.0"

let wantedString: String = aString.stringByReplacingOccurrencesOfString(".0", withString: "") // "1"

এটি 1.05 -> 15
স্টারসেকার

@ স্টারসেকার না, প্রথমে 1.05কার্যকর String(format: "%.1f", aFloat)হবে 1.0, কাজ করবে। যদি 1.05মৃত্যুদন্ড কার্যকর String(format: "%.2f", aFloat)করা হয় 1.05এবং এর চেয়ে বেশি করা উচিতstringByReplacingOccurrencesOfString(".00"...)
লিও

ঠিক আছে, আমি শেষ লাইনে ফোকাস করেছি। আমি ভেবেছিলাম আপনি বেশ কয়েকটি সমাধানের পরামর্শ দিয়েছেন তবে আসলে আপনার লাইনগুলি সংযুক্ত রয়েছে। আমার খারাপ।
স্টারসেকার

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