इंट में स्विफ्ट के लिए अग्रणी शून्य


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)")आपके सुझाव को चुना । यह NSString फॉर्मेटिंग के माध्यम से जाने के बजाय स्विफ्ट देशी स्ट्रिंग वर्ग का उपयोग करेगा।
जेहुत

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])

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। Apple इसके बारे में बताता है:

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

मुझे लगता है कि आपका उत्तर सही है जब आप कई स्थानों पर उसी तरह संख्याओं को प्रारूपित करना चाहते हैं। जैसा कि मैंने नहीं पूछा कि मैंने सही के रूप में वेवामा के उत्तर को चुना है लेकिन। लेकिन जवाब के लिए धन्यवाद! :)
Jeehut

@ImanouPetit। FYI करें, मैंने इसे न्यूनतम संख्या अंकों के साथ उपयोग किया है 3. अगर मैं स्पष्ट रूप से अनचाहे नहीं करता हूं, तो स्वरूपित करें Number = formatter.stringFromNumber (काउंटर)! तब तार में वैकल्पिक ("001") होते हैं, इसलिए मेरा कोड गतिशील रूप से एक छवि पथ विफल होने का चयन करता है। ''! '' समस्या का हल
निकलता

11

बाएं पैडिंग के लिए इस तरह एक स्ट्रिंग एक्सटेंशन जोड़ें:

स्विफ्ट 2.0 +

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

@imanuo जवाब पहले से ही महान है, लेकिन अगर आप संख्या से भरे आवेदन के साथ काम कर रहे हैं, तो आप इस तरह से एक एक्सटेंशन पर विचार कर सकते हैं:

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

एक्सटेंशन FTW .. !! यह स्विफ्ट 4 में भी ठीक काम किया है। हम में से उन लोगों के लिए जो 3 से 4 तक पुराने कोड को स्थानांतरित करने के लिए संघर्ष कर रहे हैं, और अंततः 5 स्विफ्ट करने के लिए ... :)
Nick N

3

Xcode 8.3.2 में, iOS 10.3 Thats अब के लिए अच्छा है

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

विवरण

Xcode 9.0.1, स्विफ्ट 4.0

समाधान

डेटा

import Foundation

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

समाधान 1

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

समाधान २

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

आपके पुनरावृत्ति दृष्टिकोण की तरह, पैडिंग स्ट्रिंग्स के लिए मेरा उत्तर देखें।
possen

ये दो अंकों के इनट्स के लिए काम नहीं करेंगे (जैसे। 10 010 बन जाता है)। साथ ही मूल प्रश्न विशेष रूप से स्टैंडर्ड लाइब्रेरीज़ के समाधान के लिए पूछे गए। @ImanouPetit द्वारा ऊपर दिए गए उत्तर को प्राथमिकता दी गई है।
14

-12

फॉर्मेटर का उपयोग करने वाले अन्य उत्तरों के विपरीत, आप लूप के अंदर प्रत्येक संख्या के सामने सिर्फ "0" टेक्स्ट भी जोड़ सकते हैं, जैसे:

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

लेकिन फॉर्मेटर अक्सर बेहतर होता है जब आपको प्रत्येक अलग संख्या के लिए 0s की निर्दिष्ट राशि जोड़ना होगा। यदि आपको केवल एक 0 जोड़ना है, तो यह वास्तव में सिर्फ आपकी पसंद है।

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