2012-07-12 17 views
6

में परिवर्तित नहीं होता है यह this question about floats जैसा ही समस्या है।"{0: d}" के साथ स्ट्रिंग स्वरूपण पूर्णांक

जब आपके पास एक मान प्राप्त होता है जो एक पूर्णांक में परिवर्तित हो सकता है, तो पुराने %d इसे परिवर्तित कर देगा, लेकिन प्रारूप नहीं है।

class MyIntegerTenClass: 
    def __int__(self): 
     return 10 
    def __str__(self): 
     return 'ten' 
ten = MyIntegerTenClass() 
print '%d, %02X, %s' % (ten, ten, ten) # ok 
print '{0}'.format(ten) # ok 
print '{0:d}, {0:02X}'.format(ten) # ValueError: Unknown format code 'd' for object of type 'str' 

वहाँ (उस वर्ग के लिए एक __format__ विधि जोड़ने के बिना) मूल्य प्रारूप तैयार किया जाता के वर्ग को छुए बिना, प्रारूप के व्यवहार को संशोधित करने के लिए एक तरीका है?

संपादित करें: मेरा लक्ष्य स्वरूपण स्ट्रिंग पर स्वरूपण प्राप्त करना है, लेकिन मूल्य पर नहीं। तो यदि प्रारूप स्ट्रिंग "डी" या "एक्स" कहती है, तो मान को int में परिवर्तित करें और फिर दशमलव या हेक्साडेसिमल प्रतिनिधित्व में कनवर्ट करें। यदि प्रारूप स्ट्रिंग "एस" कहती है, तो इसे स्ट्रिंग में सीधे रूपांतरित करें। पुराने % ने किया था।

दरअसल, मैं मूल्य के वर्ग में __format__ विधि भी जोड़ सकता हूं। लेकिन मैं उस विधि में कैसे जांचूं, अगर दिया गया प्रारूप विनिर्देश एक पूर्णांक प्रारूप विनिर्देश है? बिल्टिन प्रारूप के प्रारूप विनिर्देश पार्सर को पुन: कार्यान्वित किए बिना।

संपादित करें: यहां __format__ और अपवादों के साथ एक समाधान है। कोई बेहतर विचार?

class MyIntegerTenClass: 
    def __int__(self): 
     return 10 
    def __str__(self): 
     return 'ten' 
    def __format__(self, spec): 
     fmt = '{0:%s}'%spec 
     try: 
      return fmt.format(str(self)) 
     except: 
      return fmt.format(int(self)) 
ten = MyIntegerTenClass() 
print '%d, %02X, %s' % (ten, ten, ten) # ok, prints "10, 0A, ten" 
print '{0:d}, {0:02X}, {0}'.format(ten) # ok, prints "10, 0A, ten" 
+1

यह कहता है कि दस एक स्ट्रिंग है, आप इसे एक संख्या के रूप में प्रारूपित करने की कोशिश कर रहे हैं। –

उत्तर

0

इस समस्या का एक पहले दृष्टिकोण बस try हो सकता है यह:

class MyIntegerTenClass: 
    def __int__(self): 
     return 10 
    def __str__(self): 
     return 'ten' 
    def __format__(self, format_spec): 
     try: 
      s = format(str(self), format_spec) 
     except ValueError: 
      s = format(int(self), format_spec) 
     return s 

MyIntegerTenClass प्रारूप स्ट्रिंग के रूप में में डाला जा सकता है, तो एक स्ट्रिंग, यह होगा। यदि नहीं, तो इसे एक int में परिवर्तित कर दिया जाएगा और format पर पुनः सबमिट किया जाएगा।

>>> print '{0}, {0:s}, {0:d}, {0:02X}, {0:f}'.format(ten) 
ten, ten, 10, 0A, 10.000000 

आप डिफ़ॉल्ट प्रतिनिधित्व ten के बजाय 10 होना चाहते हैं, तो आप केवल जरूरत रूपांतरण लाइनों स्वैप:

def __format__(self, format_spec): 
     try: 
      s = format(int(self), format_spec) 
     except ValueError: 
      s = format(str(self), format_spec) 
     return s 

टेस्ट उत्पादन:

>>> print '{0}, {0:s}, {0:d}, {0:02X}, {0:f}'.format(ten) 
10, ten, 10, 0A, 10.000000 

एक परिशिष्ट के रूप में, मैं विश्वास न करें कि आप __format__ को परिभाषित किए बिना इच्छित व्यवहार प्राप्त करने में सक्षम होंगे; हालांकि, आप Formatter ऑब्जेक्ट का उपयोग करके एक अधिक परिष्कृत दृष्टिकोण विकसित कर सकते हैं। फिर भी, मुझे लगता है कि अपवाद-आधारित दृष्टिकोण आपको मुफ्त में अंतर्निहित कार्यक्षमता प्रदान करता है।

+0

धन्यवाद। ऐसा लगता है कि हमें एक ही समय में एक ही समाधान मिला (मेरा दूसरा संपादन देखें)। यद्यपि आपका समाधान थोड़ा अच्छा लगता है क्योंकि इसे '{0:% s}'% spec की आवश्यकता नहीं है। मुझे एहसास नहीं हुआ कि एक प्रारूप समारोह है जिसे आप इस तरह कॉल कर सकते हैं। – Sebastian

1

एक स्ट्रिंग के बजाय एक पूर्णांक पास करें और यह ठीक काम करेगा।

>>> print '{0:d}'.format(1) 
1 
>>> print '{0:d}'.format('1') 

Traceback (most recent call last): 
    File "<pyshell#57>", line 1, in <module> 
    print '{0:d}'.format('1') 
ValueError: Unknown format code 'd' for object of type 'str' 
+2

मुझे पता था कि। लेकिन मैं एक पूर्णांक पास नहीं करना चाहता। मैं अपनी कक्षा का एक ऑब्जेक्ट पास करना चाहता हूं जिसे पूर्णांक में परिवर्तित किया जा सकता है। – Sebastian

0

यह कहता है कि दस एक स्ट्रिंग है, आप इसे एक संख्या के रूप में प्रारूपित करने की कोशिश कर रहे हैं।

एक डाली में यह लपेटकर का प्रयास करें:

>>> print '{0:d}, {0:02X}'.format(int(ten)) 
10, 0A 
+0

मेरे उपयोग-मामले के लिए काम नहीं करता है।मैं प्रारूप में दिए गए मान को बदलना नहीं चाहता हूं। – Sebastian

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