"गायब" शून्य: Int अग्रणी शून्य क्यों संग्रहीत नहीं करता और इसके साथ कैसे जीना है?
\n\nक्या आपने कभी स्क्रीन पर 007 नंबर प्रदर्शित करने की कोशिश की और केवल 7 मिला? परिचित दर्द? Swift डेवलपर्स के क्लब में आपका स्वागत है, जो देर-सबेर इस प्रश्न का सामना करते हैं: "Int में अग्रणी शून्य कैसे जोड़ें?"।
यह प्रश्न Stack Overflow पर हजारों बार देखा जा चुका है, और यह आश्चर्य की बात नहीं है। एक साधारण कार्य लगता है - ऑर्डर नंबर को "001234" के रूप में प्रदर्शित करना, न कि "1234", या समय को "09:05" के रूप में दिखाना, न कि "9:5"। लेकिन Swift, एक सख्ती से टाइप की गई भाषा होने के नाते, "संख्या" और "उसके स्ट्रिंग प्रतिनिधित्व" के बीच अंतर करता है। Int एक गणितीय इकाई है। इसके लिए 007 केवल 7 है। आरंभीकरण के दौरान अग्रणी शून्य खो जाते हैं।
इस लेख में, हम इस समस्या को हल करने के लिए सभी मुख्य दृष्टिकोणों पर चर्चा करेंगे। आप सीखेंगे कि पूर्णांकों को सही तरीके से कैसे फ़ॉर्मेट किया जाए, विभिन्न कार्यों के लिए कौन सा तरीका चुनना है, और प्रदर्शन के जाल में कैसे न फँसें। हम सरल स्ट्रिंग मास्क से लेकर Foundation के शक्तिशाली NumberFormatter तक का सफर तय करेंगे। चलिए शुरू करते हैं!
Int "001" को क्यों संग्रहीत नहीं कर सकता? संक्षिप्त जानकारी
\n\nकोड में गोता लगाने से पहले, आइए इस घटना की प्रकृति को समझें। Swift में Int एक 64-बिट (या पुराने उपकरणों पर 32-बिट) साइन किया हुआ पूर्णांक है। इसका आंतरिक प्रतिनिधित्व बाइनरी कोड है। बाईं ओर शून्य का कोई गणितीय अर्थ नहीं है।
let number = 007 // त्रुटि? नहीं!\nprint(number) // आउटपुट: 7\n\nSwift कंपाइलर आपको कोड में 007 लिखने भी नहीं देगा (जब तक कि यह ऑक्टल सिस्टम में लिटरल न हो, लेकिन वहाँ प्रीफ़िक्स 0o है)। निष्कर्ष: अग्रणी शून्य फ़ॉर्मेटिंग की समस्या है, डेटा संग्रहीत करने की नहीं। हम प्रस्तुति स्तर (UI, लॉगिंग, निर्यात) पर समस्या का समाधान करते हैं।
विधि #1: क्लासिक — String(format:)
\n\nStack Overflow पर सबसे लोकप्रिय उत्तर String(format:) फ़ंक्शन का उपयोग करना है, जो Objective-C ( NSString के साथ ब्रिज के माध्यम से) से विरासत में मिला है। यह एक तेज़ और संक्षिप्त तरीका है।
उदाहरण: 3 अग्रणी शून्य जोड़ें
\n\nlet number = 7\nlet formatted = String(format: "%04d", number)\nprint(formatted) // "0007"\n\nस्पेसिफ़ायर %04d का अर्थ है:
- \n
%— स्पेसिफ़ायर की शुरुआत; \n 0— खाली स्थानों को शून्य से भरें, रिक्त स्थान से नहीं; \n 4— न्यूनतम फ़ील्ड चौड़ाई (4 वर्ण); \n d— दशमलव पूर्णांक (Int)। \n
यदि संख्या 4 वर्णों से अधिक लंबी है (उदाहरण के लिए, 12345), तो फ़ॉर्मेटिंग इसे नहीं काटेगी - आपको "12345" मिलेगा।
\n\nलाभ और हानियाँ
\n- \n
- लाभ: सरल, तेज़, एक पंक्ति। Swift के सभी संस्करणों में काम करता है। \n
- हानियाँ: अंदरूनी रूप से
NSStringका उपयोग करता है, जो शुद्ध Swift समाधान की तुलना में थोड़ा धीमा हो सकता है। C-style फ़ॉर्मेटिंग सिंटैक्स याद रखना होगा। स्थानीयकृत नहीं है (यदि आवश्यक हो तो हजारों विभाजकों को ध्यान में नहीं रखता)। \n
कब उपयोग करें: सरल मामलों के लिए: लॉग, डीबगिंग, ID आउटपुट, जब स्थानीयकरण की आवश्यकता न हो।
\n\nविधि #2: शुद्ध Swift — String(repeating:count:) + सफ़िक्स
\n\nयदि आप Objective-C ब्रिज से बचना चाहते हैं और "शुद्ध" Swift में लिखना चाहते हैं, तो आप इसे मैन्युअल रूप से कर सकते हैं। स्ट्रिंग्स को समझने के लिए यह एक उत्कृष्ट अभ्यास है।
\n\nextension Int {\n func leadingZeros(_ totalDigits: Int) -> String {\n let stringValue = String(self)\n let zerosCount = max(0, totalDigits - stringValue.count)\n return String(repeating: "0", count: zerosCount) + stringValue\n }\n}\n\nlet number = 42\nprint(number.leadingZeros(5)) // "00042"\n\nयह कैसे काम करता है?
\n- \n
- Int को स्ट्रिंग में बदलें। \n
- गणना करें कि कितने शून्य जोड़ने हैं:
totalDigits - length। यदि