2011-12-30 19 views
8

मेरे पास एक डेटाबेस है जो बनाया गया था और एक आर्किटेक्चर फर्म द्वारा उपयोग किया जाता है। सभी माप इस तरह के प्रारूप में संग्रहीत हैं: 15-3/4 " और 12 '6-3/4"एक आर्किटेक्चरल प्रारूप में एक फ्लोटिंग पॉइंट में प्रदर्शित माप को कैसे परिवर्तित करें?

क्या इन प्रकार के माप को पायथन में फ़्लोटिंग पॉइंट में बदलने का कोई तरीका है? या क्या वहां कोई पुस्तकालय है जो इस कार्यक्षमता को प्रदान करता है?

इसी प्रकार, आप एक फ़्लोटिंग पॉइंट से ऊपर के प्रारूप में कैसे परिवर्तित होंगे?

+1

बेशक एक तरह से होती है। लेकिन वे इकाइयों के साथ मूल्य हैं, इसलिए सीधे फ़्लोटिंग पॉइंट में कनवर्ट करने के लिए अंतर्निहित इकाई को परिभाषित करने की भी आवश्यकता होगी। आप परिशुद्धता भी खो सकते हैं। – Keith

+1

इसके अलावा, Django सिर्फ एक वेब ढांचा है, इसलिए वास्तव में इसका कोई संबंध नहीं है। अब आप एक ऑब्जेक्ट बना सकते हैं, जब स्ट्रिंगिफाइड उस प्रारूप को उत्पन्न करता है। फिर आप किसी भी टेम्पलेट का उपयोग कर सकते हैं। – Keith

+0

धन्यवाद कीथ ... मैंने Django भाग हटा दिया। – Clayton

उत्तर

3

कैसे पर निर्भर करता है नियमित पैटर्न हैं, तो आप str.partition उपयोग कर सकते हैं पार्स करने के लिए:

def architectural_to_float(text): 
    ''' Convert architectural measurements to inches. 

     >>> for text in """15-3/4",12' 6-3/4",3/4",3/4',15',15",15.5'""".split(','): 
     ...  print text.ljust(10), '-->', architectural_to_float(text) 
     ... 
     15-3/4" --> 15.75 
     12' 6-3/4" --> 150.75 
     3/4"  --> 0.75 
     3/4'  --> 9.0 
     15'  --> 180.0 
     15"  --> 15.0 
     15.5'  --> 186.0 

    ''' 
    # See http://stackoverflow.com/questions/8675714 
    text = text.replace('"', '').replace(' ', '') 
    feet, sep, inches = text.rpartition("'") 
    floatfeet, sep, fracfeet = feet.rpartition('-') 
    feetnum, sep, feetdenom = fracfeet.partition('/') 
    feet = float(floatfeet or 0) + float(feetnum or 0)/float(feetdenom or 1) 
    floatinches, sep, fracinches = inches.rpartition('-') 
    inchesnum, sep, inchesdenom = fracinches.partition('/') 
    inches = float(floatinches or 0) + float(inchesnum or 0)/float(inchesdenom or 1) 
    return feet * 12.0 + inches 
+0

अगर संख्या की तरह '3/4" 'आंशिक इंच में है यह काम नहीं करेगा। हो सकता है तुम सिर्फ पूर्णांक/frac जुदाई। धन्यवाद। – Abhijit

+0

@Abhijit संपादित साथ रहना चाहेगा यह अच्छा काम करता है ... धन्यवाद रेमंड! –

+0

के लिए rpartition उपयोग करने के लिए rpartition – Clayton

0

चल बिन्दु के लिए वास्तु:

import re 

regex = re.compile('(\d+\')*(\d+)-(\d+)\/(\d+)"') 
regex.sub(lambda m: str((int((m.group(1) or '0').split("'")[0]) * 12) 
    + int(m.group(2))) 
    + ('%.2f' % (int(m.group(3))/float(m.group(4))))[1:], measurement) 

यह वास्तव में नृशंस है, लेकिन मैं एक समय में एक अजगर के साथ काम नहीं किया; मुझे संदेह नहीं है कि ऐसा करने के लिए एक बहुत साफ तरीका है, लेकिन यह अच्छी तरह से पैरों की कमी को संभालता है। यह हमेशा इंच की अपेक्षा करता है, हालांकि, 12' जैसे माप 12' 0" होना चाहिए ताकि सही तरीके से पार्स किया जा सके।

1

निम्नलिखित स्वयं टिप्पणी कोड पर विचार करें। मैं सरल

>>> from fractions import Fraction 
>>> def Arch2Float(num): 
    #First Partition from Right so that the Feet and Unit always 
    #Remains aligned even if one of them is absent 
    ft,x,inch=num.rpartition("\'") 
    #Convert the inch to a real and frac part after stripping the 
    #inch (") identifier. Note it is assumed that the real and frac 
    #parts are delimited by '-' 
    real,x,frac=inch.strip("\"").rpartition("-") 
    #Now Convert every thing in terms of feet which can then be converted 
    #to float. Note to trap Error's like missing or invalid items, its better 
    #to convert each items seperately 
    result=0 
    try: 
     result = int(ft.strip("\'")) 
    except ValueError: 
     None 
    #Convert the real inch part as a fraction of feet 
    try: 
     result += Fraction(int(real),12) 
    except ValueError: 
     None 
    #Now finally convert the Fractional part using the fractions module and convert to feet 
    try: 
     result+=Fraction(frac)/12 
    except ValueError: 
     None 
    return float(result)  

एसिड टेस्ट

>>> print Arch2Float('15-3/4"')  # 15-3/4" (without ft) 
1.3125 
>>> print Arch2Float('12\' 6-3/4"') #12' 6-3/4" 
12.5625 
>>> print Arch2Float('12\'6-3/4"') #12'6-3/4" (without space) 
12.5625 
>>> print Arch2Float('3/4"')  #3/4" (just the inch) 
0.0625 
>>> print Arch2Float('15\'')  #15' (just ft) 
15.0 
>>> print Arch2Float('15')   #15 (without any ascent considered as inch) 
1.25 

वास्तुकला के लिए फ्लोट से परिवर्तित में रखने के लिए आसान होगा के रूप में आप को पार्स

>>> def Float2Arch(num): 
    num=Fraction(num) 
    ft,inch=Fraction(num.numerator/num.denominator),Fraction(num.numerator%num.denominator)/num.denominator*12 
    real,frac=inch.numerator/inch.denominator,Fraction(inch.numerator%inch.denominator,inch.denominator) 
    return '{0}\' {1}-{2}"'.format(ft,real,frac) 

एसिड के लिए दर्द लेने के लिए की जरूरत नहीं है की कोशिश की टेस्ट

>>> print Float2Arch(Arch2Float('12\' 6-3/4"')) 
12' 6-3/4" 
>>> print Float2Arch(Arch2Float('15-3/4"')) 
1' 3-3/4" 
>>> print Float2Arch(Arch2Float('12\'6-3/4"')) 
12' 6-3/4" 
>>> print Float2Arch(Arch2Float('3/4"')) 
0' 0-3/4" 
>>> print Float2Arch(Arch2Float('15\'')) 
15' 0-0" 
>>> print Float2Arch(Arch2Float('15')) 
1' 3-0" 
>>> 

नोट *** सबसे कम denominator (इंच) या उच्चतम प्रतिनिधित्व denominator (पैर) में फ्लोट प्रतिनिधित्व रखने के लिए यह महत्वपूर्ण है। मैंने इस मामले के चरणों में उच्चतम का चयन किया। आप इसे कम करने के लिए wan't यदि आप (यदि इस खूबसूरत है, लेकिन करता है नौकरी सुनिश्चित नहीं हैं) गोलाई अनुरोध पूरा करने से 12.


अपडेट यह गुणा कर सकते हैं

def Float2Arch(num): 
    num=Fraction(num) 
    ft,inch=Fraction(num.numerator/num.denominator),Fraction(num.numerator%num.denominator)/num.denominator*12 
    real,frac=inch.numerator/inch.denominator,Fraction(inch.numerator%inch.denominator,inch.denominator) 
    for i in xrange(1,17): 
     if Fraction(frac) < Fraction(1.0/16*i): break 
    frac=Fraction(1.0/16*i) 
    if frac>= 1: 
     real+=1 
     frac=0 
    return '{0}\' {1}-{2}"'.format(ft,real,frac) 
+0

प्रति @ कीथ की टिप्पणी, मैं इसमें इकाई जोड़ूंगा और फ्लोट को एक फ्लोट और एक इकाई के साथ एक संरचना या कक्षा में बदल दूंगा। –

+0

@ जेसेस्मिथ, आपको बस इसे एक स्ट्रिंग में बदलने और इकाई जोड़ने की आवश्यकता है। पूर्व 'str (Arch2Float ('12 \ '6-3/4"') के लिए) + 'ft'' – Abhijit

+0

@ अहिजीत, यह समाधान भी काम करता है। मैंने आपके 'Float2Achch' फ़ंक्शन के साथ @RaymondHettinger को जोड़ा है। आप कैसे होंगे लौटाए गए मूल्य को गोल करने का सुझाव दें ताकि इस तरह का इनपुट ** 18.33 ** ** ** '4' ** ** लौटाता है? – Clayton