সুইট ইন ইনফ্টের জন্য শীর্ষস্থানীয় জিরো


305

আমি অগ্রণী জিরো সহ একটি সুইট-এ Intএকটি রূপান্তর করতে চাই String। উদাহরণস্বরূপ এই কোডটি বিবেচনা করুন:

for myInt in 1 ... 3 {
    print("\(myInt)")
}

বর্তমানে এটির ফলাফল:

1
2
3

তবে আমি এটি হতে চাই:

01
02
03

সুইফট স্ট্যান্ডার্ড লাইব্রেরিগুলির মধ্যে এটি করার কোনও পরিষ্কার উপায় নেই?

উত্তর:


670

ধরে নিই যে আপনি নেতৃস্থানীয় শূন্যগুলি দিয়ে 2 এর ক্ষেত্রের দৈর্ঘ্য চান:

import Foundation

for myInt in 1 ... 3 {
    print(String(format: "%02d", myInt))
}

আউটপুট:

01
02
03

এটির import Foundationপ্রযুক্তিগতভাবে এটি প্রয়োজন কারণ এটি সুইফট ভাষার অংশ নয় তবে Foundationকাঠামোর দ্বারা সরবরাহ করা একটি ক্ষমতা । মনে রাখবেন যে উভয়ই অন্তর্ভুক্ত import UIKitএবং এর import Cocoaমধ্যে Foundationএটি ইতিমধ্যে আমদানি করা প্রয়োজন হয় না যদি আপনি ইতিমধ্যে আমদানি করে থাকেন Cocoaবা UIKit


ফর্ম্যাট স্ট্রিং একাধিক আইটেমের বিন্যাস নির্দিষ্ট করতে পারে। উদাহরণস্বরূপ, আপনি যদি 3ঘন্টা, 15মিনিট এবং 7সেকেন্ডের মধ্যে ফর্ম্যাট করার চেষ্টা করছেন তবে 03:15:07এটি এটি করতে পারেন:

let hours = 3
let minutes = 15
let seconds = 7
print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))

আউটপুট:

03:15:07

2
যদিও এটি সুইফটের অংশ নয় এটি আসলে খুব পরিষ্কার দেখাচ্ছে। আমি মনে করি এটির কোনও সুইফট নেটিভ উপায় নেই তাই এটি আপাতত নিকটতম হতে পারে। ধন্যবাদ, ভ্যাকোয়ামা :)
জিহুত

1
উপায় দ্বারা: আমি যদি আমার নম্বরটির সামনে কেবল একটি একক শূন্য চাইতাম তবে আমি println("0\(myInt)")আপনার পরামর্শটি বেছে নেব । এটি এনএসএসস্ট্রিং ফর্ম্যাটিংয়ের পরিবর্তে সুইফট নেটিভ স্ট্রিং ক্লাসটি ব্যবহার করবে।
জীহুত

6
আপনি "10" না পাওয়া অবধি কার্যকর, তিনি
জোসে এম পান

7
String(format: "%03d", myInt)দিতে হবে "000", "001", ... , "099", "100"
ভ্যাকোয়াম

1
মানগুলির মতো মান -3, -9দেখা দিলে এগুলির সমস্যা , এটি এখনও শূন্য ছাড়াই অগ্রিম শূন্য করে।
কোডেটার্ড

139

সুইফ্ট 5 এর সাহায্যে আপনি আপনার সমস্যা সমাধানের জন্য নীচে প্রদর্শিত তিনটি উদাহরণের মধ্যে একটি চয়ন করতে পারেন ।


# 1। Stringএর init(format:_:)ইনিশিয়ালাইজার ব্যবহার করা হচ্ছে

Foundationসুইফট Stringএকটি init(format:_:)ইনিশিয়ালাইজার সরবরাহ করে। init(format:_:)নিম্নলিখিত ঘোষণা আছে:

init(format: String, _ arguments: CVarArg...)

Stringপ্রদত্ত বিন্যাসের স্ট্রিংটিকে টেম্পলেট হিসাবে ব্যবহার করে আরম্ভ করা কোনও বস্তু ফেরত দেয় যাতে বাকী আর্গুমেন্টের মান প্রতিস্থাপন করা হয়।

নিম্নলিখিত খেলার মাঠের কোডটি দেখায় যে কীভাবে কমপক্ষে দুটি পূর্ণসংখ্যার সংখ্যার সাহায্যে Stringবিন্যাস তৈরি করতে Intহয় init(format:_:):

import Foundation

let string0 = String(format: "%02d", 0) // returns "00"
let string1 = String(format: "%02d", 1) // returns "01"
let string2 = String(format: "%02d", 10) // returns "10"
let string3 = String(format: "%02d", 100) // returns "100"

# 2। ব্যবহার Stringএরinit(format:arguments:) ইনিশিয়ালাইজার করা হচ্ছে

Foundationসুইফট Stringএকটি init(format:arguments:)ইনিশিয়ালাইজার সরবরাহ করে। init(format:arguments:)নিম্নলিখিত ঘোষণা আছে:

init(format: String, arguments: [CVarArg])

ফিরে আসে a Stringপ্রদত্ত বিন্যাসের স্ট্রিংটিকে টেমপ্লেট হিসাবে ব্যবহার করে আরম্ভ করা বস্তু দেয় যাতে ব্যবহারকারীর ডিফল্ট লোকেল অনুসারে অবশিষ্ট আর্গুমেন্টের মান প্রতিস্থাপন করা হয়।

নিম্নলিখিত খেলার মাঠের কোডটি দেখায় যে কীভাবে কমপক্ষে দুটি পূর্ণসংখ্যার সংখ্যার সাহায্যে Stringবিন্যাস তৈরি করতে Intহয় init(format:arguments:):

import Foundation

let string0 = String(format: "%02d", arguments: [0]) // returns "00"
let string1 = String(format: "%02d", arguments: [1]) // returns "01"
let string2 = String(format: "%02d", arguments: [10]) // returns "10"
let string3 = String(format: "%02d", arguments: [100]) // returns "100"

# 3। ব্যবহারNumberFormatter

ফাউন্ডেশন সরবরাহ করে NumberFormatter । অ্যাপল এটি সম্পর্কে বলেছেন:

NSNumberFormatterএমন কক্ষগুলির পাঠ্য উপস্থাপনা ফর্ম্যাট করার উদাহরণগুলিতে যা NSNumberবস্তুগুলি ধারণ করে এবং সংখ্যাসূচক মানগুলির পাঠ্য উপস্থাপনাকে রূপান্তর করেNSNumber করে। উপস্থাপনাটি পূর্ণসংখ্যার, ভাসমান এবং দ্বিগুণকে ধারণ করে; ফ্লোটস এবং ডাবলগুলি একটি নির্দিষ্ট দশমিক অবস্থানে ফর্ম্যাট করা যায়।

নিম্নলিখিত খেলার মাঠের কোডটি দেখায় যে কীভাবে একটি তৈরি করা যায় NumberFormatterযা কমপক্ষে দুটি পূর্ণসংখ্যার অঙ্ক সহ String?একটি থেকে ফিরে আসে Int:

import Foundation

let formatter = NumberFormatter()
formatter.minimumIntegerDigits = 2

let optionalString0 = formatter.string(from: 0) // returns Optional("00")
let optionalString1 = formatter.string(from: 1) // returns Optional("01")
let optionalString2 = formatter.string(from: 10) // returns Optional("10")
let optionalString3 = formatter.string(from: 100) // returns Optional("100")

আমি মনে করি যখন আপনি একাধিক জায়গায় একইভাবে সংখ্যার ফর্ম্যাট করতে চান তখন আপনার উত্তরটি সঠিক। যেহেতু আমি এটির জন্য জিজ্ঞাসা করিনি আমি ভ্যাকোয়ামার উত্তরটি সঠিক হিসাবে বেছে নিয়েছি। তবে উত্তরের জন্য আপনাকে ধন্যবাদ! :)
জিহুত

@ImanouPetit। এফওয়াইআই, আমি এটি ন্যূনতম সংখ্যা সহ 3 ব্যবহার করেছি I আমি যদি স্পষ্টভাবে আনপ্রেপ না করি অর্থাৎ ফর্ম্যাটেড নাম্বার = formatter.stringFromNumber (কাউন্টার) না! তারপরে স্ট্রিংগুলিতে ptionচ্ছিক ("001") রয়েছে তাই আমার কোডটি গতিশীলভাবে কোনও চিত্রের পথ চয়ন করতে ব্যর্থ হয়। '! "দিয়ে
মোড়কানো

11

বাম প্যাডিংয়ের জন্য এই জাতীয় স্ট্রিং এক্সটেনশন যুক্ত করুন:

সুইফট ২.০ +

extension String {
    func padLeft (totalWidth: Int, with: String) -> String {
        let toPad = totalWidth - self.characters.count
        if toPad < 1 { return self }
        return "".stringByPaddingToLength(toPad, withString: with, startingAtIndex: 0) + self
    }
}

সুইফট 3.0 +

extension String {
    func padLeft (totalWidth: Int, with: String) -> String {
        let toPad = totalWidth - self.characters.count
        if toPad < 1 { return self }
        return "".padding(toLength: toPad, withPad: with, startingAt: 0) + self
    }
}

এই পদ্ধতিটি ব্যবহার করে:

for myInt in 1...3 {
    print("\(myInt)".padLeft(totalWidth: 2, with: "0"))
}

1
কেন ?! এর সুবিধা কী?
মাইক গ্লুখভ

7

সুইফট 3.0+

বাম প্যাডিং Stringএক্সটেনশন অনুরূপ padding(toLength:withPad:startingAt:)মধ্যেFoundation

extension String {
    func leftPadding(toLength: Int, withPad: String = " ") -> String {

        guard toLength > self.characters.count else { return self }

        let padding = String(repeating: withPad, count: toLength - self.characters.count)
        return padding + self
    }
}

ব্যবহার:

let s = String(123)
s.leftPadding(toLength: 8, withPad: "0") // "00000123"

1
withPadযুক্তিটি যদি একটি চরিত্রের চেয়ে বেশি হয়ে যায় তবে ব্যবহারকারী এটি প্রত্যাশা হিসাবে কাজ করতে পারে বা নাও করতে পারে ।
nhgrif

4

সুইফট 5

@ আইমানুও উত্তরগুলি ইতিমধ্যে দুর্দান্ত, তবে আপনি যদি সংখ্যায় পূর্ণ একটি অ্যাপ্লিকেশন নিয়ে কাজ করছেন তবে আপনি এটির মতো একটি এক্সটেনশন বিবেচনা করতে পারেন:

extension String {

    init(withInt int: Int, leadingZeros: Int = 2) {
        self.init(format: "%0\(leadingZeros)d", int)
    }

    func leadingZeros(_ zeros: Int) -> String {
        if let int = Int(self) {
            return String(withInt: int, leadingZeros: zeros)
        }
        print("Warning: \(self) is not an Int")
        return ""
    }

}

এইভাবে আপনি যেখানেই কল করতে পারেন:

String(withInt: 3) 
// prints 03

String(withInt: 23, leadingZeros: 4) 
// prints 0023

"42".leadingZeros(2)
// prints 42

"54".leadingZeros(3)
// prints 054

এক্সটেনশনগুলি এফটিডাব্লু .. !! এটি সুইফট ৪-এও দুর্দান্ত কাজ করেছে আমরা যারা তাদের পুরানো কোডটি 3, 4 থেকে 4 এবং অবশেষে সুইফ্ট 5 এ স্থানান্তরিত করতে লড়াই করছি ... :)
নিক এন

3

এক্সকোড 8.3.2 এ, আইওএস 10.3 এখন ভাল

sample1:

let dayMoveRaw = 5 
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 05

sample2:

let dayMoveRaw = 55 
let dayMove = String(format: "%02d", arguments: [dayMoveRaw])
print(dayMove) // 55

1

অন্যান্য উত্তরগুলি ভাল যদি আপনি কেবল ফরম্যাট স্ট্রিং ব্যবহার করে সংখ্যার সাথে কাজ করে থাকেন তবে এটি ভাল যখন আপনার প্যাডগুলি প্যাড করার প্রয়োজন হতে পারে (যদিও স্বীকার করা প্রশ্নটির চেয়ে কিছুটা পৃথক পৃথক বলে মনে হয়)। এছাড়াও, প্যাডের চেয়ে স্ট্রিং দীর্ঘ হলে সতর্কতা অবলম্বন করুন।

   let str = "a str"
   let padAmount = max(10, str.count)
   String(repeatElement("-", count: padAmount - str.count)) + str

আউটপুট "-----a str"


0

বিস্তারিত

এক্সকোড 9.0.1, সুইফট 4.0

সলিউশন

উপাত্ত

import Foundation

let array = [0,1,2,3,4,5,6,7,8]

সমাধান ঘ

extension Int {

    func getString(prefix: Int) -> String {
        return "\(prefix)\(self)"
    }

    func getString(prefix: String) -> String {
        return "\(prefix)\(self)"
    }
}

for item in array {
    print(item.getString(prefix: 0))
}

for item in array {
    print(item.getString(prefix: "0x"))
}

সমাধান 2

for item in array {
    print(String(repeatElement("0", count: 2)) + "\(item)")
}

সমাধান 3

extension String {

    func repeate(count: Int, string: String? = nil) -> String {

        if count > 1 {
            let repeatedString = string ?? self
            return repeatedString + repeate(count: count-1, string: repeatedString)
        }
        return self
    }
}

for item in array {
    print("0".repeate(count: 3) + "\(item)")
}

আপনার পুনরাবৃত্তি উপাদান মত, প্যাডিং স্ট্রিং জন্য আমার উত্তর দেখুন।
পোস্ট

এগুলি দুটি অঙ্কের কীটের জন্য কাজ করবে না (উদাঃ 10 টি 010 হয়ে যায়)। এছাড়াও মূল প্রশ্নটি বিশেষভাবে স্ট্যান্ডার্ড লাইব্রেরিগুলির সাথে সম্পর্কিত সমাধানগুলির জন্য জিজ্ঞাসা করেছিল। @ManuPetit দ্বারা উপরের উত্তর পছন্দ করা হয়।
চতুর

-12

ফর্ম্যাটর ব্যবহার করা অন্যান্য উত্তরগুলির বিপরীতে, আপনি লুপের ভিতরে প্রতিটি সংখ্যার সামনে একটি "0" পাঠ্য যুক্ত করতে পারেন:

for myInt in 1...3 {
    println("0" + "\(myInt)")
}

ধরুন আপনাকে যখন প্রতিটি পৃথক সংখ্যার জন্য একটি নির্ধারিত পরিমাণ 0 টি যোগ করতে হয় তখন ফর্ম্যাটরটি প্রায়শই ভাল। আপনার যদি কেবল একটি 0 যুক্ত করতে হয় তবে তা সত্যিই আপনার চয়ন।

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