সুইউটে যথার্থ স্ট্রিং ফর্ম্যাট স্পেসিফায়ার


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
আপনি যদি এটি একবার ব্যবহার করে থাকেন তবে নিশ্চিত। তবে আপনি যদি স্ট্রিং ইন্টারপোলেশন (যা আরও বেশি পাঠযোগ্য) এর সাহায্যে আরও ফর্ম্যাটিং বিকল্প পেতে চান তবে আপনি সমস্ত ফর্ম্যাটিং এক্সটেনশানগুলি অন্য কোনও ফাইলের মধ্যে রেখে দিতে পারেন এবং আপনার প্রকল্প জুড়ে রেফারেন্স করতে পারেন। অবশ্যই, আদর্শভাবে অ্যাপলের ফর্ম্যাট লাইব্রেরি সরবরাহ করা উচিত।
অ্যান্টন স্কোলকভ

2
এই সমাধানটি স্ট্রিং-এ ফলাফল না দিয়ে সুইফট ১.২ এ কাজ করবে না।
ইবেসোরা

খুব ভাল, তবে সুইফট 2 বন্ধু নয়।
সর্বশেষ

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)

হ্যান্ডলিং ইউনিটগুলির সাথে প্রশ্নের কোনও সম্পর্ক নেই। লোকালাইজড স্ট্রিংউইথ ফরমেটটি দুর্দান্ত তবে সম্পর্কিত নয়।
অমিতপ

আমি অমিতপিকে সম্মত, স্ট্রিংয়ের আগে এটি জিজ্ঞাসা করা হয়েছিল (বিন্যাস: ..., যুক্তি: ...) উপলভ্য ছিল
ভ্যালেন্টিন

84

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

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

এটি সংকলন করে না (আইবিএমের সুইফ্ট স্যান্ডবক্সে 3.0.2 ব্যবহার করে):Col 16: 'init' has been renamed to 'init(describing:)'
পিটার ডিলিঙ্গার

@ পিটারডিলিঙ্গার আপনি মোড়কানো মানের পরিবর্তে একটি optionচ্ছিক পাস করছেন।
মাইকেল

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
আমি দেখতে চাই যে একমাত্র উন্নতি, প্রদত্ত সংখ্যার জন্য ফর্ম্যাটরটি সংরক্ষণ করছে - এনএসএনম্বার ফর্ম্যাটগুলি নির্মাণ করা ব্যয়বহুল।
কেন্ডল হেলস্টেটার জেলনার

1
ঠিক আমি খুঁজছেন ছিল কি! ধন্যবাদ
গুনজোট সিংহ

আমি জানি এটি কিছুটা পুরানো প্রশ্ন, তবে NSNumberFormatterএটি শুরু করার পক্ষে যথেষ্ট ধীর। যদি সম্ভব হয় তবে এটি একটিকে সংজ্ঞায়িত করতে এবং এটি পুনরায় ব্যবহার করতে সহায়তা করে। বলেছিল, আমি এই প্রশ্নটি এখানে পড়ছি কারণ এটি আমার ক্ষেত্রে সম্ভব নয়।
প্রম্যাকুসার

44

আপনি স্ট্রিং ইন্টারপোলেশন দিয়ে এটি (এখনও) করতে পারবেন না। আপনার সেরা বাজিটি এখনও এনএসএস স্ট্রিং ফর্ম্যাটিং হতে চলেছে:

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"

আপনি সেই সিনট্যাক্সটি কোথায় পেলেন `এনএসএসস্ট্রিং (ফর্ম্যাট:" ফর্ম্যাটস্ট্রিং ", ভাল) '। আমি এটি অ্যাপল থেকে আইবুকস নথিতে দেখতে পাচ্ছি না।
ডানকান সি

1
এটি সুইফট থেকে যেকোন উদ্দেশ্য-সি অবজেক্ট তৈরির সমান। এটির দ্রুততম সংস্করণ[NSString stringWithFormat...
ডেভিড বেরি

Gotcha। আমি সুইফট আইবুকটিতে এখনও পৌঁছতে পারি নি।
ডানকান সি

আইআইআরসি যা সুইফট আইবুকে ছিল না। এটি ডাব্লুডাব্লুডিসির একটি অধিবেশন ছিল। গভীরতার মধ্যে সুইফ্ট
ইন্টারঅ্যাপেরিবিলিটি

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

এটি খেলার মাঠে কাজ করে দেখুন।

PS: থেকে সমাধান: http://rrike.sh/xcode/rounding-various-decimal-places-swift/


এটি এখন পর্যন্ত সেরা সমাধান, আমি কীভাবে এটি শীর্ষে নেই তা পাই না।
pjtnt11

7
নিতপিকি জিনিস .. 1.500000000 কেবল "1.5" হবে "" 1.50 "নয়
স্টাইলার 1972

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 এ মারা যায়: মারাত্মক ত্রুটি: বিভিন্ন আকারের ধরণের মধ্যে অনিরাপদ বিটকাস্ট করতে পারে না।
বাইনারিমচি

@ বাইনোমোচি বিটা 6 সহ: "Hello %@, This is pi : %.2f" % ["World", M_PI]কাজ করে তবে আশ্চর্যজনকভাবে "%@ %@" % ["Hello", "World"]উত্থাপন করুন can't unsafeBitCast... অনুমান করুন যে এটি পরবর্তী সংস্করণে সংশোধন করা হবে।
ভিনসেন্ট গেরসি

আপনি কি অপারেটরে ব্যবহৃত ',' করতে পারবেন? '@ ইনফিক্স ফানক, (…') এবং তারপরে "হ্যালো% @ এর মতো আপনার স্ট্রিং লিখুন, এটি পাই:% .2f", ["আপনি", এমএপিআই])?
রিক

রিক করুন আপনি যা পারবেন না, সুইড ,এবং বেশিরভাগ ভাষায় বৈধ অক্ষর অপারেটর নয়। এবং ইমো, %অপারেটরটি ব্যবহার করা আরও ভাল যা ইতিমধ্যে অন্যান্য ভাষায় বিদ্যমান। বিকাশকারী.অ্যাপল.
com/library/ios/docamentation/Swift/Concepual/…

8

সুইফট 4

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

টেম্পু: ভাসা = ডিভ * 100 লেট স্ট্রিং = স্ট্রিং (ফর্ম্যাট: "% .2f", স্থানীয়: লোকাল: বর্তমান, আর্গুমেন্ট: টেম্প) এটি আমাকে ত্রুটি দিচ্ছে। 'ফ্লোট' টাইপের মান প্রত্যাশিত যুক্তির ধরণে রূপান্তর করা যায় না [সিভিআরআর্গ]
চাঁদনী

এটিকে কাজ করতে আপনাকে সেই 15.123 টি অ্যারেতে রাখা দরকার
ডোরিয়ান রায়

3
আমার জন্য কাজ করে: স্ট্রিং = স্ট্রিং (ফর্ম্যাট: "% .2f", মাইস্ট্রিং)
আর

6

আপনি এখনও @ সাইন ছাড়াই অবজেক্টিভ-সি হিসাবে সুইফটে এনএসএলোগ ব্যবহার করতে পারেন।

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

বিস্তারিত

  • এক্সকোড 9.3, সুইফট 4.1
  • এক্সকোড 10.2.1 (10E1001), সুইফট 5

সমাধান ঘ

func বৃত্তাকার () -> ডাবল

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

ফানক বৃত্তাকার (_ নিয়ম: ভাসমান পয়েন্ট রাউন্ডিংআরুল) -> ডাবল

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

সমাধান 2

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

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

যে কাজটি করে, আপনি এখনও এনএসএলগ অ্যাক্সেস রয়েছে।

সুতরাং আমি মনে করি প্রশ্নের উত্তর, আপনি যদি সুইফটে এনএসএলগ ব্যবহার চালিয়ে কীভাবে জিজ্ঞাসা করছেন তবে এটি সহজ:

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

ভিনসেন্ট গের্সির রুবি / পাইথন% অপারেটরের একটি সংস্করণ, সুইফট ২.১-এর জন্য আপডেট হয়েছে:

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

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

1

উপরে প্রচুর ভাল উত্তর, তবে কখনও কখনও "% .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

ডাবল এবং সিজিফ্লোট প্রকারের এক্সটেনশানগুলি সম্পর্কে কী:

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, স্থান হতে পারে ... (দ্রষ্টব্য: আপনাকে অবশ্যই সিজিফ্লোটকে পাসে ডাবল রূপান্তর করতে হবে) স্ট্রিংয়ে (ফর্ম্যাট :) বা এটি শূন্যের মান দেখতে পাবে)

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
}

কেবল ফ্লোটের জন্য, কেবল ডাবল প্রতি ফ্লোট দিয়ে প্রতিস্থাপন করুন, পাউফের সাথে পাও এবং রাউন্ডফের সাথে গোল করুন।
আপডেট: আমি দেখতে পেয়েছি যে স্ট্রিংয়ের পরিবর্তে রিটার্ন টাইপ ডাবল ব্যবহার করা সবচেয়ে ব্যবহারিক practical এটি স্ট্রিং আউটপুট, অর্থাৎ:

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

প্রিন্টস: পাই মোটামুটি ৩.১৪২
তাই আপনি স্ট্রিংসের ক্ষেত্রেও একইভাবে ব্যবহার করতে পারেন (আপনি এখনও লিখতে পারেন: প্রিন্টলন (ডি ~> ২)), তবে অতিরিক্তভাবে আপনি এটি সরাসরি মানগুলিতেও ব্যবহার করতে পারেন, যেমন:

d = Double(slider.value) ~> 2

বা যা আপনার প্রয়োজন…


এটি স্পষ্টতই একটি মন্তব্য হওয়ার উদ্দেশ্যে করা হয়েছে, আমি বুঝতে পেরেছি যে একটি বিষয় বলতে আপনার আরও স্থানের প্রয়োজন, এবং এটি মূল্যবান তবে আপনি যদি একটি পূর্ণ উত্তর হিসাবে এটি লিখতে চলেছেন তবে এটি স্বাধীনভাবে নিজেই এটি কার্যকর করে তুলবে; আপনি সম্পূর্ণ কোড যুক্ত করতে পারেন, উদাহরণস্বরূপ, এবং তারপরে একটি মন্তব্য এবং খ্রিস্টানকে স্বীকৃতি জানাতে পারেন।
জেইমি গোমস

@ জাইম গোমেজ: আমাকে উপরের উত্তরের মন্তব্য করার অনুমতি নেই। তবে যাইহোক, এর মধ্যে আমার কিছু ভুল ব্যাখ্যা ছিল interpretation জানেন না, এটি রাখার মতো মূল্য যদি মুছে ফেলা হয় বা করা উচিত। অবশ্যই এটি ঠিক একইভাবে গোল করার জন্য ব্যবহার করা যেতে পারে (ডাব্লু / ও স্ট্রিং রূপান্তর) এবং সহজেই অন্যান্য প্রোগ্রামিং ভাষায় অনুবাদ করা যায়। * আমি ধরে নিয়েছিলাম যে ডাবল দিয়ে এটি প্রায় 8 টি সংখ্যায় পরিণত হবে, যা অবশ্যই একটি ত্রুটি ছিল, কারণ আমি এটি ফ্লোট দিয়ে গোল করেছি এবং এটিকে দ্বিগুণে রূপান্তর করেছি।
স্টুয়েফফনিক

পিএস: আমি স্ট্রিং আউটপুট না হয়ে সাধারণভাবে রাউন্ডিংয়ের জন্য আরও অনুরূপ পদ্ধতি ব্যবহার করতে পছন্দ করব, সুতরাং ডাবল টাইপ করুন (& নিয়মিত পদ্ধতি?) সিডিনোট : আপনি যদি একটি ফ্লোটকে গোল করেন (যেমন একটি স্লাইডার থেকে) এবং ফলাফলটি স্ট্রিংয়ের দিকে যায় "0.1" এর মতো ঠিকঠাক হবে, তবে আপনি যদি এই ফ্লোটটিকে ডাবল এবং তারপরে স্ট্রিং * তে রূপান্তর করেন তবে এটি হবে: "0.100000001490116", যেমন ফ্লোট 0.1 ঠিক ঠিক খুব কাছে সংরক্ষণ করতে সক্ষম নয়। আমার ধারণা এটি ডাবলের সাথে একই, কেবল দ্বিগুণ নির্ভুলতার সাথে ;) সুতরাং সর্বদা গোল করার আগে ডাবলকে রূপান্তর করুন , সুতরাং এটি যথাসম্ভব যথাযথ হবে এবং স্ট্রিংকেও সূক্ষ্ম রূপান্তরিত করবে।
স্টুয়েফফনিক

পিপিএস: অবশ্যই রিটার্ন টাইপের ডাবল সহ এটি কখনও কখনও কিছুটা আলাদা হয়, অর্থাত্ যদি আপনাকে কোনও লেবেল পাঠ্য সেট করতে হয় তবে আপনাকে কেবল লিখতে হবে: myLabel.text = "\ (d ~> 2)" এর পরিবর্তে: myLabel। পাঠ্য = d ~> 2 , তবে আমি এখনও মনে করি, ফাংশনটি সেভাবে আরও ব্যবহারিক। (অবশ্যই প্রত্যেকেই করতে পারে, তারা যা চায়, কেবল আমার চিন্তাভাবনা ...)
স্টুয়েফফনিক

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