परिशुद्धता स्ट्रिंग प्रारूप विनिर्देशक स्विफ्ट में


395

नीचे बताया गया है कि मैंने पहले कैसे दो दशमलव स्थानों पर एक फ्लोट किया था

NSLog(@" %.02f %.02f %.02f", r, g, b);

मैंने डॉक्स और ई-पुस्तक की जाँच की लेकिन यह पता लगाने में सक्षम नहीं है। धन्यवाद!

जवाबों:


277

डेविड की प्रतिक्रिया के बाद मेरा अब तक का सबसे अच्छा समाधान :

import Foundation

extension Int {
    func format(f: String) -> String {
        return String(format: "%\(f)d", self)
    }
}

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

let someInt = 4, someIntFormat = "03"
println("The integer number \(someInt) formatted with \"\(someIntFormat)\" looks like \(someInt.format(someIntFormat))")
// The integer number 4 formatted with "03" looks like 004

let someDouble = 3.14159265359, someDoubleFormat = ".3"
println("The floating point number \(someDouble) formatted with \"\(someDoubleFormat)\" looks like \(someDouble.format(someDoubleFormat))")
// The floating point number 3.14159265359 formatted with ".3" looks like 3.142

मुझे लगता है कि यह सबसे स्विफ्ट जैसा समाधान है, डेटा टाइप करने के लिए सीधे स्वरूपण संचालन को बांधता है। यह अच्छी तरह से हो सकता है कि कहीं-कहीं संचालन प्रारूप का एक अंतर्निहित पुस्तकालय है, या शायद यह जल्द ही जारी किया जाएगा। ध्यान रखें कि भाषा अभी भी बीटा में है।


76
यह अनावश्यक रूप से जटिल है। हकीकत का जवाब काम करता है और अधिक संक्षिप्त है।
स्टीवन मारलो

9
यकीन है कि अगर आप इसे केवल एक बार उपयोग कर रहे हैं। लेकिन अगर आप स्ट्रिंग इंटरपोलेशन (जो बहुत अधिक पठनीय है) का उपयोग करके अधिक प्रारूपण विकल्प रखना चाहते थे, तो आप सभी प्रारूपण एक्सटेंशन को एक फ़ाइल में कहीं और रख सकते हैं और इसे पूरे प्रोजेक्ट में संदर्भित कर सकते हैं। बेशक, आदर्श रूप से Apple को फॉर्मेटिंग लाइब्रेरी प्रदान करनी चाहिए।
एंटोन टोकोलाकोव

2
स्ट्रिंग के परिणाम के बिना यह समाधान स्विफ्ट 1.2 में काम नहीं करेगा।
आइबसोरा

अच्छा लगा, लेकिन स्विफ्ट 2 फ्रेंड नहीं।
LastMove

798

एक सरल तरीका है:

import Foundation // required for String(format: _, _)

print(String(format: "hex string: %X", 123456))
print(String(format: "a float number: %.5f", 1.0321))

9
println(String(format: "a float number: %.5f", 1.0321))
ज़फ

78
मेरा मानना ​​है कि यह स्वीकृत उत्तर से बेहतर उत्तर है। यह printfअलग-अलग एक्सटेंशन लिखने के बिना मानक सी-स्टाइल के बहुत करीब है ।
कीथ मॉरिस

9
फ़ाइल के शीर्ष पर "आयात फाउंडेशन" मत भूलना।
क्रिस ग्रेग

3
यह स्वीकार किए गए उत्तर से बेहतर है लेकिन अभी भी फाउंडेशन के तरीकों (स्विफ्ट के साथ ब्रिज) का उपयोग कर रहा है।

1
के लिए सुनिश्चित करेंimport Foundation
NaN

125

मुझे String.localizedStringWithFormatकाफी अच्छा काम करना पड़ा:

उदाहरण:

let value: Float = 0.33333
let unit: String = "mph"

yourUILabel.text = String.localizedStringWithFormat("%.2f %@", value, unit)

सवाल का इकाइयों से निपटने से कोई लेना-देना नहीं है। localizedStringWithFormat अच्छा है, लेकिन संबंधित नहीं है।
अमित

मैं सहमत हूं कि अमित, यह स्ट्रिंग से पहले पूछा गया था (प्रारूप: ..., तर्क: ...) उपलब्ध था
वैलेंटाइन

84

यह एक बहुत तेज़ और सरल तरीका है जिसे जटिल समाधान की आवश्यकता नहीं है।

let duration = String(format: "%.01f", 3.32323242)
// result = 3.3

यह संकलित नहीं करता है (आईबीएम के स्विफ्ट सैंडबॉक्स में 3.0.2 का उपयोग करते हुए):Col 16: 'init' has been renamed to 'init(describing:)'
पीटर डिलिंजर

@PeterDillinger आप अलिखित मान के बजाय एक वैकल्पिक पास कर रहे हैं।
माइकल

63

यहां अधिकांश उत्तर मान्य हैं। हालाँकि, यदि आप संख्या को अक्सर प्रारूपित करेंगे, तो एक स्वरूपित स्ट्रिंग लौटाने वाली विधि को जोड़ने के लिए फ्लोट वर्ग का विस्तार करने पर विचार करें। नीचे उदाहरण कोड देखें। यह एक नंबर फॉर्मेटर और एक्सटेंशन का उपयोग करके एक ही लक्ष्य को प्राप्त करता है।

extension Float {
    func string(fractionDigits:Int) -> String {
        let formatter = NSNumberFormatter()
        formatter.minimumFractionDigits = fractionDigits
        formatter.maximumFractionDigits = fractionDigits
        return formatter.stringFromNumber(self) ?? "\(self)"
    }
}

let myVelocity:Float = 12.32982342034

println("The velocity is \(myVelocity.string(2))")
println("The velocity is \(myVelocity.string(1))")

कंसोल दिखाता है:

The velocity is 12.33
The velocity is 12.3

स्विफ्ट 3.1 अपडेट

extension Float {
    func string(fractionDigits:Int) -> String {
        let formatter = NumberFormatter()
        formatter.minimumFractionDigits = fractionDigits
        formatter.maximumFractionDigits = fractionDigits
        return formatter.string(from: NSNumber(value: self)) ?? "\(self)"
    }
}

12
काश और लोग NSNumberFormatterइस उत्तर की तरह उपयोग करते । अन्य अत्यधिक मत वाले उत्तर केवल डिवाइस लोकेल सेटिंग्स को प्रतिबिंबित करने में विफल हो रहे हैं (जैसे कुछ स्थानों में, वे दशमलव स्थान पर अल्पविराम का उपयोग करते हैं; यह दर्शाता है कि; अन्य उत्तर नहीं हैं)।
रोब

3
एकमात्र सुधार जो मैं देखना चाहता हूं, वह किसी भी संख्या के लिए फॉर्मेटर का भंडारण कर रहा है - NSNumberFormatters का निर्माण करना महंगा है।
केंडल हेल्मेस् ट्टर गेलनर

1
ठीक वही जो मेरे द्वारा खोजा जा रहा था! धन्यवाद
सिंह gunjot

मुझे पता है कि यह एक पुराना सवाल है, लेकिन NSNumberFormatterइसे शुरू करने के लिए काफी धीमी है। यदि संभव हो तो, यह एक को परिभाषित करने और पुन: उपयोग करने में मदद करता है। उस ने कहा, मैं यहां इस प्रश्न को पढ़ रहा हूं क्योंकि मेरे मामले में यह संभव नहीं है।
प्रमोसेसर

44

आप इसे (अभी तक) स्ट्रिंग इंटरपोलेशन के साथ नहीं कर सकते। आपका सर्वश्रेष्ठ दांव अभी भी NSString स्वरूपण होने जा रहा है:

println(NSString(format:"%.2f", sqrt(2.0)))

अजगर से निकालना, ऐसा लगता है कि एक उचित वाक्यविन्यास हो सकता है:

@infix func % (value:Double, format:String) -> String {
    return NSString(format:format, value)
}

जो तब आपको उनका उपयोग करने की अनुमति देता है:

M_PI % "%5.3f"                // "3.142"

आप सभी संख्यात्मक प्रकारों के लिए समान ऑपरेटरों को परिभाषित कर सकते हैं, दुर्भाग्य से मुझे इसे जेनरिक के साथ करने का कोई तरीका नहीं मिला है।

स्विफ्ट 5 अपडेट

कम से कम स्विफ्ट 5 के रूप में, Stringसीधे format:इनिशियलाइज़र का समर्थन करता है, इसलिए इसका उपयोग करने की कोई आवश्यकता नहीं है NSStringऔर @infixविशेषता की अब आवश्यकता नहीं है जिसका अर्थ है कि ऊपर दिए गए नमूने निम्नानुसार लिखे जाने चाहिए:

println(String(format:"%.2f", sqrt(2.0)))

func %(value:Double, format:String) -> String {
    return String(format:format, value)
}

Double.pi % "%5.3f"         // "3.142"

आपने यह कहां पाया है कि वाक्य रचना `एनएसएसट्रिंग (प्रारूप:" फॉर्मेटस्ट्रिंग ", वैल) '। मैं इसे Apple से iBooks दस्तावेज़ में नहीं देखता।
डंकन सी।

1
यह स्विफ्ट से किसी भी उद्देश्य-सी वस्तु के निर्माण के समान है। यह [NSString stringWithFormat...
डेविड बेरी

पकड़ लिया। मैं स्विफ्ट iBook में अभी तक नहीं मिला है।
डंकन सी।

IIRC जो स्विफ्ट आईबुक में नहीं था। यह WWDC सत्रों में से एक में था। स्विफ्ट इंटरऑपरेबिलिटी इन डेप्थ
आरहूस

2
यदि आप पाइथन में% को लागू कर रहे थे तो यह दूसरा तरीका होना चाहिए। "% 5.3f"% M_PI
एंडी डेंट

16

इसे इतना जटिल क्यों बनाते हैं? आप इसके बजाय इसका उपयोग कर सकते हैं:

import UIKit

let PI = 3.14159265359

round( PI ) // 3.0 rounded to the nearest decimal
round( PI * 100 ) / 100 //3.14 rounded to the nearest hundredth
round( PI * 1000 ) / 1000 // 3.142 rounded to the nearest thousandth

इसे खेल के मैदान में देखें।

पुनश्च: से समाधान: http://rrike.sh/xcode/rounding-various-decimal-places-swift/


यह अब तक का सबसे अच्छा समाधान है, मुझे नहीं लगता कि यह शीर्ष पर कैसे है।
pjtnt11

7
नाइटपिक बात .. 1.500000000 केवल "1.5" होगी और "1.50" नहीं
styler1972

13
import Foundation

extension CGFloat {
    var string1: String {
        return String(format: "%.1f", self)
    }
    var string2: String {
        return String(format: "%.2f", self)
    }
}

प्रयोग

let offset = CGPoint(1.23, 4.56)
print("offset: \(offset.x.string1) x \(offset.y.string1)")
// offset: 1.2 x 4.6

10

माणिक / अजगर %ऑपरेटर को फिर से लिखना एक और अधिक सुंदर और सामान्य समाधान है :

// Updated for beta 5
func %(format:String, args:[CVarArgType]) -> String {
    return NSString(format:format, arguments:getVaList(args))
}

"Hello %@, This is pi : %.2f" % ["World", M_PI]

अफसोस की बात है कि यह बीटा 6 में मर जाता है: घातक त्रुटि: विभिन्न आकारों के प्रकारों के बीच असुरक्षित नहीं हो सकती।
बाइनरीमोची

@binarymochi बीटा 6 के साथ: "Hello %@, This is pi : %.2f" % ["World", M_PI]काम करता है, लेकिन अजीब तरह से "%@ %@" % ["Hello", "World"]बढ़ा can't unsafeBitCast... लगता है कि अगले संस्करण में तय किया जाएगा।
विंसेंट गेरसी

क्या आप इस्तेमाल किए गए ऑपरेटर में ',' बना सकते हैं? '@infix func, (...', और उसके बाद "Hello% @, this is pi:% .2f", ["you", M_PI] जैसे अपने तार लिखें?
रिक

@ नहीं, आप नहीं कर सकते ,, स्विफ्ट और अधिकांश भाषाओं में एक मान्य वर्ण ऑपरेटर नहीं है। और imo, %ऑपरेटर का उपयोग करना बेहतर है जो पहले से ही अन्य भाषाओं में मौजूद है। डेवलपर
।apple.com/library/ios/documentation/Swift/Conceptual/…

8

स्विफ्ट 4

let string = String(format: "%.2f", locale: Locale.current, arguments: 15.123)

लेट टेम्प: फ्लोट = डिव * 100 लेट स्ट्रिंग = स्ट्रिंग (फॉर्मेट: "% .2f", लोकेल: लोकेल.कांटे, दलीलें: अस्थायी) यह मुझे त्रुटि दे रहा है। At फ्लोट ’प्रकार के मूल्य को अपेक्षित तर्क प्रकार में परिवर्तित नहीं कर सकते हैं [[CVarArg]
चांदनी

आपको इसे काम करने के लिए 15.123 को एक सरणी में रखना होगा
डोरियन रॉय

3
मेरे लिए काम करता है: स्ट्रिंग स्ट्रिंग = स्ट्रिंग (प्रारूप: "%। 2f", माईस्ट्रिंग)
ग्रेज़गोरेज़ आर। कुल्सज़ा

6

आप अभी भी स्विफ्ट में NSLog का उपयोग ऑब्जेक्टिव-सी के रूप में कर सकते हैं, केवल @ साइन के बिना।

NSLog("%.02f %.02f %.02f", r, g, b)

संपादित करें: थोड़ी देर के बाद स्विफ्ट के साथ काम करने के बाद मैं इस भिन्नता को भी जोड़ना चाहूंगा

    var r=1.2
    var g=1.3
    var b=1.4
    NSLog("\(r) \(g) \(b)")

आउटपुट:

2014-12-07 21:00:42.128 MyApp[1626:60b] 1.2 1.3 1.4

6

विवरण

  • Xcode 9.3, स्विफ्ट 4.1
  • Xcode 10.2.1 (10E1001), स्विफ्ट 5

समाधान 1

कवक गोल () -> डबल

(5.2).rounded()
// 5.0
(5.5).rounded()
// 6.0
(-5.2).rounded()
// -5.0
(-5.5).rounded()
// -6.0

func राउंडेड (_ नियम: फ्लोटिंगपॉइंट राउंडिंगRule) -> डबल

let x = 6.5

// Equivalent to the C 'round' function:
print(x.rounded(.toNearestOrAwayFromZero))
// Prints "7.0"

// Equivalent to the C 'trunc' function:
print(x.rounded(.towardZero))
// Prints "6.0"

// Equivalent to the C 'ceil' function:
print(x.rounded(.up))
// Prints "7.0"

// Equivalent to the C 'floor' function:
print(x.rounded(.down))
// Prints "6.0"

म्यूटिंग फंक राउंड ()

var x = 5.2
x.round()
// x == 5.0
var y = 5.5
y.round()
// y == 6.0
var z = -5.5
z.round()
// z == -6.0

म्यूटिंग फेरी राउंड (_ नियम: फ्लोटिंगपॉइंट राउंडिंग नियम)

// Equivalent to the C 'round' function:
var w = 6.5
w.round(.toNearestOrAwayFromZero)
// w == 7.0

// Equivalent to the C 'trunc' function:
var x = 6.5
x.round(.towardZero)
// x == 6.0

// Equivalent to the C 'ceil' function:
var y = 6.5
y.round(.up)
// y == 7.0

// Equivalent to the C 'floor' function:
var z = 6.5
z.round(.down)
// z == 6.0

समाधान २

extension Numeric {

    private func _precision(number: NSNumber, formatter: NumberFormatter) -> Self? {
        if  let formatedNumString = formatter.string(from: number),
            let formatedNum = formatter.number(from: formatedNumString) {
                return formatedNum as? Self
        }
        return nil
    }

    private func toNSNumber() -> NSNumber? {
        if let num = self as? NSNumber { return num }
        guard let string = self as? String, let double = Double(string) else { return nil }
        return NSNumber(value: double)
    }

    func precision(_ minimumFractionDigits: Int,
                   roundingMode: NumberFormatter.RoundingMode = NumberFormatter.RoundingMode.halfUp) -> Self? {
        guard let number = toNSNumber() else { return nil }
        let formatter = NumberFormatter()
        formatter.minimumFractionDigits = minimumFractionDigits
        formatter.roundingMode = roundingMode
        return _precision(number: number, formatter: formatter)
    }

    func precision(with numberFormatter: NumberFormatter) -> String? {
        guard let number = toNSNumber() else { return nil }
        return numberFormatter.string(from: number)
    }
}

प्रयोग

_ = 123.44.precision(2)
_ = 123.44.precision(3, roundingMode: .up)

let numberFormatter = NumberFormatter()
numberFormatter.minimumFractionDigits = 1
numberFormatter.groupingSeparator = " "
let num = 222.3333
_ = num.precision(2)

पूरा नमूना

func option1<T: Numeric>(value: T, numerFormatter: NumberFormatter? = nil) {
    print("Type: \(type(of: value))")
    print("Original Value: \(value)")
    let value1 = value.precision(2)
    print("value1 = \(value1 != nil ? "\(value1!)" : "nil")")
    let value2 = value.precision(5)
    print("value2 = \(value2 != nil ? "\(value2!)" : "nil")")
    if let value1 = value1, let value2 = value2 {
        print("value1 + value2 = \(value1 + value2)")
    }
    print("")
}

func option2<T: Numeric>(value: T, numberFormatter: NumberFormatter) {
    print("Type: \(type(of: value))")
    print("Original Value: \(value)")
    let value1 = value.precision(with: numberFormatter)
    print("formated value = \(value1 != nil ? "\(value1!)" : "nil")\n")
}

func test(with double: Double) {
    print("===========================\nTest with: \(double)\n")
    let float = Float(double)
    let float32 = Float32(double)
    let float64 = Float64(double)
    let float80 = Float80(double)
    let cgfloat = CGFloat(double)

    // Exapmle 1
    print("-- Option1\n")
    option1(value: double)
    option1(value: float)
    option1(value: float32)
    option1(value: float64)
    option1(value: float80)
    option1(value: cgfloat)

    // Exapmle 2

    let numberFormatter = NumberFormatter()
    numberFormatter.formatterBehavior = .behavior10_4
    numberFormatter.minimumIntegerDigits = 1
    numberFormatter.minimumFractionDigits = 4
    numberFormatter.maximumFractionDigits = 9
    numberFormatter.usesGroupingSeparator = true
    numberFormatter.groupingSeparator = " "
    numberFormatter.groupingSize = 3

    print("-- Option 2\n")
    option2(value: double, numberFormatter: numberFormatter)
    option2(value: float, numberFormatter: numberFormatter)
    option2(value: float32, numberFormatter: numberFormatter)
    option2(value: float64, numberFormatter: numberFormatter)
    option2(value: float80, numberFormatter: numberFormatter)
    option2(value: cgfloat, numberFormatter: numberFormatter)
}

test(with: 123.22)
test(with: 1234567890987654321.0987654321)

उत्पादन

===========================
Test with: 123.22

-- Option1

Type: Double
Original Value: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44

Type: Float
Original Value: 123.22
value1 = nil
value2 = nil

Type: Float
Original Value: 123.22
value1 = nil
value2 = nil

Type: Double
Original Value: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44

Type: Float80
Original Value: 123.21999999999999886
value1 = nil
value2 = nil

Type: CGFloat
Original Value: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44

-- Option 2

Type: Double
Original Value: 123.22
formatted value = 123.2200

Type: Float
Original Value: 123.22
formatted value = 123.220001221

Type: Float
Original Value: 123.22
formatted value = 123.220001221

Type: Double
Original Value: 123.22
formatted value = 123.2200

Type: Float80
Original Value: 123.21999999999999886
formatted value = nil

Type: CGFloat
Original Value: 123.22
formatted value = 123.2200

===========================
Test with: 1.2345678909876544e+18

-- Option1

Type: Double
Original Value: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18

Type: Float
Original Value: 1.234568e+18
value1 = nil
value2 = nil

Type: Float
Original Value: 1.234568e+18
value1 = nil
value2 = nil

Type: Double
Original Value: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18

Type: Float80
Original Value: 1234567890987654400.0
value1 = nil
value2 = nil

Type: CGFloat
Original Value: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18

-- Option 2

Type: Double
Original Value: 1.2345678909876544e+18
formatted value = 1 234 567 890 987 650 000.0000

Type: Float
Original Value: 1.234568e+18
formatted value = 1 234 567 939 550 610 000.0000

Type: Float
Original Value: 1.234568e+18
formatted value = 1 234 567 939 550 610 000.0000

Type: Double
Original Value: 1.2345678909876544e+18
formatted value = 1 234 567 890 987 650 000.0000

Type: Float80
Original Value: 1234567890987654400.0
formatted value = nil

Type: CGFloat
Original Value: 1.2345678909876544e+18
formatted value = 1 234 567 890 987 650 000.0000

4
extension Double {
  func formatWithDecimalPlaces(decimalPlaces: Int) -> Double {
     let formattedString = NSString(format: "%.\(decimalPlaces)f", self) as String
     return Double(formattedString)!
     }
 }

 1.3333.formatWithDecimalPlaces(2)

3

अब तक दिए गए उत्तर, जिन्हें सबसे अधिक वोट प्राप्त हुए हैं, एनएसएसट्रिंग के तरीकों पर भरोसा कर रहे हैं और आपको आवश्यकता है कि आपने फाउंडेशन का आयात किया है।

हालांकि, आप अभी भी NSLog तक पहुँच प्राप्त कर चुके हैं।

इसलिए मुझे लगता है कि प्रश्न का उत्तर, यदि आप पूछ रहे हैं कि स्विफ्ट में NSLog का उपयोग कैसे जारी रखा जाए, तो यह है:

import Foundation


3
//It will more help, by specify how much decimal Point you want.
let decimalPoint = 2
let floatAmount = 1.10001
let amountValue = String(format: "%0.*f", decimalPoint, floatAmount)

2

यहाँ एक "शुद्ध" स्विफ्ट समाधान है

 var d = 1.234567
operator infix ~> {}
@infix func ~> (left: Double, right: Int) -> String {
    if right == 0 {
        return "\(Int(left))"
    }
    var k = 1.0
    for i in 1..right+1 {
        k = 10.0 * k
    }
    let n = Double(Int(left*k)) / Double(k)
    return "\(n)"
}
println("\(d~>2)")
println("\(d~>1)")
println("\(d~>0)")

2

विस्तार की शक्ति

extension Double {
    var asNumber:String {
        if self >= 0 {
            var formatter = NSNumberFormatter()
            formatter.numberStyle = .NoStyle
            formatter.percentSymbol = ""
            formatter.maximumFractionDigits = 1
            return "\(formatter.stringFromNumber(self)!)"
        }
        return ""
    }
}

let velocity:Float = 12.32982342034

println("The velocity is \(velocity.toNumber)")

आउटपुट: वेग 12.3 है


2

कम टाइपिंग तरीका:

func fprint(format: String, _ args: CVarArgType...) {
    print(NSString(format: format, arguments: getVaList(args)))
}

1

आप इस तरह से एक ऑपरेटर भी बना सकते हैं

operator infix <- {}

func <- (format: String, args:[CVarArg]) -> String {
    return String(format: format, arguments: args)
}

let str = "%d %.1f" <- [1453, 1.123]

1

गोलाई के साथ भी:

extension Float
{
    func format(f: String) -> String
    {
        return NSString(format: "%\(f)f", self)
    }
    mutating func roundTo(f: String)
    {
        self = NSString(format: "%\(f)f", self).floatValue
    }
}

extension Double
{
    func format(f: String) -> String
    {
        return NSString(format: "%\(f)f", self)
    }
    mutating func roundTo(f: String)
    {
        self = NSString(format: "%\(f)f", self).doubleValue
    }
}

x = 0.90695652173913
x.roundTo(".2")
println(x) //0.91


1

स्विफ्ट 2.1 के लिए अपडेट किए गए विन्सेन्ट गुरसी के रूबी / अजगर% ऑपरेटर का एक संस्करण:

func %(format:String, args:[CVarArgType]) -> String {
  return String(format:format, arguments:args)
}

"Hello %@, This is pi : %.2f" % ["World", M_PI]

1

ऊपर अच्छे जवाबों से भरपूर, लेकिन कभी-कभी एक पैटर्न gobbledygook के "% .3f" प्रकार की तुलना में अधिक उपयुक्त होता है। यहाँ मेरी स्विफ्ट 3 में एक नंबरफ़ॉर्मर का उपयोग करना है।

extension Double {
  func format(_ pattern: String) -> String {
    let formatter = NumberFormatter()
    formatter.format = pattern
    return formatter.string(from: NSNumber(value: self))!
  }    
}

let n1 = 0.350, n2 = 0.355
print(n1.format("0.00#")) // 0.35
print(n2.format("0.00#")) // 0.355

यहां मैं चाहता था कि 2 दशमलव हमेशा दिखाए जाएं, लेकिन तीसरा केवल अगर यह शून्य नहीं था।


1

स्विफ्ट 4 एक्सकोड 10 अपडेट

extension Double {
    var asNumber:String {
        if self >= 0 {
            let formatter = NumberFormatter()
            formatter.numberStyle = .none
            formatter.percentSymbol = ""
            formatter.maximumFractionDigits = 2
            return "\(formatter.string(from: NSNumber(value: self)) ?? "")"
        }
        return ""
    }
}

1

डबल और CGFloat प्रकार के एक्सटेंशन के बारे में क्या:

extension Double {

   func formatted(_ decimalPlaces: Int?) -> String {
      let theDecimalPlaces : Int
      if decimalPlaces != nil {
         theDecimalPlaces = decimalPlaces!
      }
      else {
         theDecimalPlaces = 2
      }
      let theNumberFormatter = NumberFormatter()
      theNumberFormatter.formatterBehavior = .behavior10_4
      theNumberFormatter.minimumIntegerDigits = 1
      theNumberFormatter.minimumFractionDigits = 1
      theNumberFormatter.maximumFractionDigits = theDecimalPlaces
      theNumberFormatter.usesGroupingSeparator = true
      theNumberFormatter.groupingSeparator = " "
      theNumberFormatter.groupingSize = 3

      if let theResult = theNumberFormatter.string(from: NSNumber(value:self)) {
         return theResult
      }
      else {
         return "\(self)"
      }
   }
}

उपयोग:

let aNumber: Double = 112465848348508.458758344
Swift.print("The number: \(aNumber.formatted(2))")

प्रिंट: 112 465 848 348 508.46


0
@infix func ^(left:Double, right: Int) -> NSNumber {
    let nf = NSNumberFormatter()
    nf.maximumSignificantDigits = Int(right)
    return  nf.numberFromString(nf.stringFromNumber(left))
}


let r = 0.52264
let g = 0.22643
let b = 0.94837

println("this is a color: \(r^3) \(g^3) \(b^3)")

// this is a color: 0.523 0.226 0.948

0

मुझे दो दशमलव स्थानों के बारे में पता नहीं है , लेकिन यहां बताया गया है कि आप शून्य दशमलव स्थानों के साथ कैसे फ़्लोट प्रिंट कर सकते हैं, इसलिए मैं कल्पना करूंगा कि 2 स्थान, 3, स्थान हो सकते हैं ... (नोट: आपको CGFloat को डबल में परिवर्तित करना होगा स्ट्रिंग के लिए (प्रारूप :) या यह शून्य का मान देखेगा)

func logRect(r: CGRect, _ title: String = "") {
    println(String(format: "[ (%.0f, %.0f), (%.0f, %.0f) ] %@",
        Double(r.origin.x), Double(r.origin.y), Double(r.size.width), Double(r.size.height), title))
}


-1

@ क्रिसियन डायट्रिच:

के बजाय:

var k = 1.0
    for i in 1...right+1 {
        k = 10.0 * k
    }
let n = Double(Int(left*k)) / Double(k)
return "\(n)"

यह भी हो सकता है:

let k = pow(10.0, Double(right))
let n = Double(Int(left*k)) / k
return "\(n)"

[सुधार:] भ्रम के लिए क्षमा करें * - बेशक यह डबल्स के साथ काम करता है। मुझे लगता है, सबसे अधिक व्यावहारिक (यदि आप चाहते हैं कि अंक गोल हो, कट न हो) तो यह कुछ इस तरह होगा:

infix operator ~> {}
func ~> (left: Double, right: Int) -> Double {
    if right <= 0 {
        return round(left)
    }
    let k = pow(10.0, Double(right))
    return round(left*k) / k
}

केवल फ्लोट के लिए, फ्लोट के साथ डबल को बदलें, पॉव के साथ पॉव और राउंडफ के साथ राउंड।
अपडेट: मैंने पाया कि स्ट्रिंग के बजाय रिटर्न टाइप डबल का उपयोग करना सबसे व्यावहारिक है। यह स्ट्रिंग आउटपुट के लिए समान काम करता है, अर्थात:

println("Pi is roughly \(3.1415926 ~> 3)")

प्रिंट: पाई लगभग 3.142 है,
इसलिए आप इसे स्ट्रिंग्स के लिए उसी तरह उपयोग कर सकते हैं (आप अभी भी लिख सकते हैं: Println (d ~> 2)), लेकिन इसके अलावा आप इसे सीधे राउंड मानों के लिए भी उपयोग कर सकते हैं:

d = Double(slider.value) ~> 2

या आपको जो भी चाहिए…


यह स्पष्ट रूप से एक टिप्पणी करने का इरादा है, मैं समझता हूं कि आपको एक बिंदु बनाने के लिए अधिक स्थान की आवश्यकता है, और यह मूल्यवान है, लेकिन अगर आप इसे पूर्ण-उत्तर के रूप में लिखने जा रहे हैं, तो इसे स्वतंत्र रूप से उपयोगी बनाते हैं; आप उदाहरण के लिए पूर्ण कोड जोड़ सकते हैं, और फिर एक टिप्पणी और ईसाई को स्वीकार कर सकते हैं।
Jaime Gómez

@ जय गोमीज़: मुझे उपरोक्त उत्तर पर टिप्पणी करने की अनुमति नहीं है। लेकिन वैसे भी, मैं कुछ झूठी व्याख्या * में था। पता नहीं, अगर यह रखा जा रहा है या हटा दिया जाना चाहिए लायक है। बेशक यह सिर्फ राउंडिंग (w / o स्ट्रिंग रूपांतरण) के लिए एक समान तरीके से उपयोग किया जा सकता है और आसानी से अन्य प्रोग्रामिंग भाषाओं में अनुवाद किया जा सकता है। * मैंने यह माना कि डबल के साथ यह लगभग 8 अंकों के लिए गोल हो जाता है, जो निश्चित रूप से एक त्रुटि थी, क्योंकि मैंने इसे फ्लोट के साथ गोल किया और उसको गलती से डबल में बदल दिया।
स्टुअफनिक

पुनश्च: मैं सामान्य रूप से राउंडिंग के लिए इसी तरह के तरीकों का अधिक उपयोग करना पसंद करूंगा, न कि स्ट्रींग आउटपुट, इसलिए रिटर्न टाइप डबल (और नियमित विधि?) सिडेनोट : यदि आप एक फ्लोट को इस तरह से गोल करते हैं (अर्थात एक स्लाइडर से) और स्ट्रिंग के परिणाम के रूप में। ठीक होगा, "0.1" की तरह, लेकिन अगर आप उस फ्लोट को डबल और फिर स्ट्रिंग * में परिवर्तित करते हैं, तो यह होगा: "0.100000001490116", क्योंकि फ्लोट 0.1 ठीक से स्टोर करने में सक्षम नहीं है, केवल बहुत करीब है। मुझे लगता है कि यह डबल के साथ समान है, बस डबल परिशुद्धता के साथ ;) इसलिए हमेशा गोलाई से पहले डबल में कनवर्ट करें , इसलिए यह यथासंभव सटीक होगा और स्ट्रिंग ठीक में भी कनवर्ट करेगा।
स्टेपफ्निक

PPS: बेशक, रिटर्न टाइप डबल के साथ, यह कभी-कभी थोड़ा अलग होता है, अर्थात यदि आपको एक लेबल टेक्स्ट सेट करने की आवश्यकता है, तो आपको लिखने की आवश्यकता है: myLabel.text = "(d ~> 2)" के बजाय बस: myLabel। पाठ = d ~> 2 , लेकिन मुझे अभी भी लगता है, फ़ंक्शन अधिक व्यावहारिक है। (निश्चित रूप से हर कोई कर सकता है, वे क्या चाहते हैं, बस मेरे विचार ...)
स्टेपपनिक

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