2010-06-30 8 views
12

सवाल has been answered for integers printed in decimal format में शून्य से है, लेकिन मैं एक सुरुचिपूर्ण रास्ता गैर दशमलव प्रारूप में पूर्णांकों के साथ भी ऐसा ही करने के लिए देख रहा हूँ (द्विआधारी, अष्टाधारी की तरह, हेक्स)।वाम गद्दी पूर्णांकों (गैर दशमलव प्रारूप) जावा

इस तरह के तार का निर्माण आसान है:

String intAsString = Integer.toString(12345, 8); 

पूर्णांक मान 12345 के अष्टाधारी represenation के साथ एक स्ट्रिंग पैदा करेगा लेकिन यह कैसे तो यह फ़ॉर्मेट करने के लिए कि स्ट्रिंग 10 अंक की तरह है, के अलावा की गणना से जरूरी शून्य की संख्या और हाथ से एक नई स्ट्रिंग को इकट्ठा करना।

एक सामान्य उपयोग केस बिट्स की निश्चित संख्या (जैसे 16, 32, ...) के साथ बाइनरी संख्याएं बनायेगा जहां कोई अग्रणी शून्य सहित सभी अंक प्राप्त करना चाहता है।

+2

"सुरुचिपूर्ण" समाधान के लिए आपका क्या मतलब है लाइब्रेरी फ़ंक्शन है। मुझे लगता है कि आवश्यक शून्य की गणना करने और उन्हें पूर्व-संयोजित करने की तुलना में कोई और अधिक सुरुचिपूर्ण समाधान नहीं है। वैसे भी, यदि आप जो करना चाहते हैं, उसे करने के लिए मैथ ट्रिक/एल्गोरिदम था, तो यह बाइनरी और ऑक्टल और हेक्स के लिए अलग होगा ... – pakore

+0

@pakore - हाँ, आप सही हैं, कुछ 'लाइब्रेरी' फ़ंक्शन पहले से मौजूद है जावा एपीआई में मेरे लिए 'सबसे सुरुचिपूर्ण' होगा;) - मुझे बस इस पैडिंग कोड को फिर से कार्यान्वित करने से नफरत है। –

+0

खैर, नंबरफॉर्मैट क्लास पर एक नज़र डालें, पैड ज़ीरो के तरीकों के साथ एक ऑक्टलफॉर्मैट, हेक्सफॉर्मेट और बाइनरीफॉर्मैट क्लास बनाएं, एक फीचर प्रस्ताव बनाएं, अपना कोड सबमिट करें, कुछ महीने प्रतीक्षा करें, अपने पुस्तकालयों को अपग्रेड करें और फिर आपके पास लाइब्रेरी फ़ंक्शन के रूप में :)। या आप अपनी परियोजना के लिए अपना पुस्तकालय सहायक बना सकते हैं: पी – pakore

उत्तर

5

यह कैसे (मानक जावा) के बारे में:

private final static String ZEROES = "0000000000"; 

// ... 

String s = Integer.toString(12345, 8); 
String intAsString = s.length() <= 10 ? ZEROES.substring(s.length()) + s : s; 
+0

बहुत बहुत धन्यवाद! यह एक पैटर्न है जो याद रखने में काफी आसान है! –

+5

ईडब्ल्यू। यह स्पष्ट रूप से यह नहीं बताता कि यह क्या कर रहा है, और यह बिल्कुल लचीला नहीं है। यदि आप लाइब्रेरी से बचना चाहते हैं तो बस अपनी स्ट्रिंग पैडिंग विधि लिखें और इसके साथ किया जाए। मैं निश्चित रूप से इस तरह के "पैटर्न" को याद नहीं करना चाहूंगा और मैं बिल्कुल यह कोड में एकाधिक स्थानों का उपयोग नहीं करना चाहता हूं। – ColinD

+0

@ कोलिन्द - मैं आंशिक रूप से सहमत हूं। अगर मुझे किसी एप्लिकेशन संदर्भ में पैडिंग की आवश्यकता है तो मुझे शायद अमरूद शामिल होगा। लेकिन उन सभी छोटे स्निपेट्स और परीक्षणों के लिए, जेस्पर समाधान वह है जो मैं चाहता था। –

13
Guava साथ

तुम सिर्फ लिख सकते हैं:

String intAsString = Strings.padStart(Integer.toString(12345, 8), 10, '0'); 
20

अक्टूबर और हेक्स के लिए, यह है के रूप में आसान String.format के रूप में:

assert String.format("%03x", 16) == "010"; 
assert String.format("%03o", 8) == "010"; 
+0

हाँ..लेकिन ..मैं किसी भी दिए गए रेडिक्स (व्यावहारिक ऊपरी सीमा के साथ काम करने के लिए एक सामान्य दृष्टिकोण की तलाश में था क्योंकि हमें हेक्स मानों की तरह अंकों का प्रतिनिधित्व करने के लिए अक्षरों की आवश्यकता होती है) –

2

StringBuilder की सहायता से यहां एक और पुन: प्रयोज्य विकल्प है।

public static String padZero(int number, int radix, int length) { 
    String string = Integer.toString(number, radix); 
    StringBuilder builder = new StringBuilder().append(String.format("%0" + length + "d", 0)); 
    return builder.replace(length - string.length(), length, string).toString(); 
} 

कॉलिन डी द्वारा पोस्ट किए गए गुवा उदाहरण के रूप में सुंदर चिकना है।

3

एक हेक्स संख्या बाहर मुद्रण, उदाहरण के लिए, शून्य गद्दी के साथ:

System.out.println(String.format("%08x", 1234)); 

निम्नलिखित उत्पादन देंगे, गद्दी के साथ शामिल:

000004d2 

अष्टाधारी के संबद्ध प्रारूपण चरित्र के साथ एक्स की जगह होगा वही करो, शायद।

संबंधित मुद्दे