स्विफ्ट - एक फ्लोट से एक दशमलव को कैसे निकालना है अगर दशमलव 0 के बराबर है?


88

मैं एक दशमलव के साथ एक दूरी प्रदर्शित कर रहा हूं, और मैं इस दशमलव को 0 के बराबर होना चाहता हूं (उदाहरण: 1200.0Km), मैं इसे स्विफ्ट में कैसे कर सकता हूं? मैं इस नंबर को इस तरह प्रदर्शित कर रहा हूं:

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

जवाबों:


137

स्विफ्ट 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और फिर इसने पूरी तरह से काम किया, धन्यवाद :)
काली आन जुले

1
डबल के लिए, एक्सटेंशन डबल {var क्लीन: स्ट्रिंग {रिटर्न सेल्फ% 1 == 0? स्ट्रिंग (प्रारूप: "% .0 डी", स्व): स्ट्रिंग (स्वयं)}}
अबोएतेफ

3
अगर फ्लोट कुछ 3.01 जैसा है तो यह काम नहीं करेगा।
चेंगसम

नकारात्मक संख्याओं के बारे में क्या?
हैपीहापी

यह 123456738.0 नंबर के लिए काम नहीं करता है, परिवर्तित नंबर 123456736 के रूप में आता है
अनिरुद्ध महाले

116

NSNumberFormatter का उपयोग करें:

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

यह दिखाता है:

3

5.1

7.21

9.31

600

0.57

0.7


2
उत्तम ! इसके लिए शीर्ष पर रहने की आवश्यकता है
GoodSp33d

6
स्विफ्ट 3 के लिए: let formatter = NumberFormatter() formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 1 statLabel.text = formatter.string(from: value as NSNumber) ?? "n/a"
alexxjk

1
कैसे के बारे में 0.3000, मैं इस पाने की कोशिश .3; मैंने इसकी शैलीformatter.numberStyle = .decimal
स्टान लीउ

@stanliu सही है, यदि आप .decimalसंख्याओं को नहीं जोड़ते हैं 1 से नीचे संख्या शून्य के बिना प्रदर्शित होगी। जैसे: .5, .78, आदि ... अभी उत्तर का संपादन।
HotFudgeSunday

मेरा मानना ​​है कि इस तरह की समस्या को हल करने के लिए सेब का इरादा क्या है।
ड्रैगनक्रैरी

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)

3

sampleValue = 3
print(sampleValue.cleanValue)

3


नमूना खेल का मैदान फ़ाइल यहाँ है


1
लेकिन 3.230000 -> 3.230000 ... कैसे "-> 3.23" के बारे में?
CHiP-love-NY

1
@ CHiP-love-NY, मैं तुम्हें नहीं मिला।
अशोक

1
मेरा मानना ​​है कि उसे लगता है कि आपका विस्तार शून्य से पीछे नहीं हटता है, लेकिन यह करता है। स्ट्रिंग (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 लौट रहा है। यह सोचो कि फ्लोट को कितनी तेजी से हैंडल करता है। यह देखने के लिए कि क्या मैं उस बग को ठीक कर सकता हूं।
क्रिस्टोफर लार्सन

2
मुझे 14.000005 के लिए सही आउटपुट मिलता है, इसलिए @ sc13 टिप्पणी पुरानी या गलत लगती है।
कूर

10

इसे स्ट्रिंग करने के लिए प्रारूपित करने के लिए, इस पैटर्न का पालन करें

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)

1
के लिए असफल होंगे 0.00000001Pubs.opengroup.org/onlinepubs/009695399/functions/printf.html पर% g का दस्तावेज़ीकरण देखें : " उपयोग की गई शैली रूपांतरित मूल्य पर निर्भर करती है; शैली e (या E) का उपयोग केवल तभी किया जाएगा जब इस तरह के रूपांतरण के परिणामस्वरूप घातांक हो। है से -4 कम या अधिक या परिशुद्धता के बराबर। "
कोयूर

उत्तम। धन्यवाद
PhillipJacobs

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 का उपयोग बिंदु (।) के बाद दो मान प्रदर्शित करने के लिए किया जाता है। यदि आप केवल एक मान प्रदर्शित करना चाहते हैं, तो "वापसी self.truncatingRemainder (विभाजित: 1) == 0 इस्तेमाल किया। स्ट्रिंग (प्रारूप:"% .0f ", स्व): स्ट्रिंग (प्रारूप:"% .1f ", स्व) /। / "
जयदीप

मुझे पता है ... मैं सिर्फ यह वर्णन कर रहा था कि आपका कोड कुछ अन्य उत्तर व्यवहार से कैसे भिन्न है।
कूर

4

NSNumberFormatter आपका मित्र है

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 से नंबरफार्मेट + NSNumber समाधान के रूप में तेजी से लगता है , लेकिन एक लाभ यह हो सकता है कि हम यहां NSObject से बच रहे हैं।

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, लेकिन macOS- केवल प्रकार नहीं 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
Starceaker

@Starceaker नहीं, 1.05निष्पादित String(format: "%.1f", aFloat)पहले होगा 1.0, काम करता है। यदि 1.05अमल String(format: "%.2f", aFloat)होगा 1.05, और ऐसा करना चाहिएstringByReplacingOccurrencesOfString(".00"...)
लियो

सही है, मैंने अंतिम पंक्ति पर ध्यान केंद्रित किया। मुझे लगा कि आपने कई समाधान सुझाए हैं लेकिन वास्तव में आपकी लाइनें जुड़ी हुई हैं। मेरी गलती।
Starceaker

यह कुछ भी नहीं है :)
सिंह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.