2009-08-12 16 views
10

मैं एक वेबपृष्ठ पार्स कर रहा हूं जिसमें यूनिकोड भिन्नता का प्रतिनिधित्व करता है। मैं उन तारों को सीधे लेने और उन्हें फ्लोट में बदलने में सक्षम होना चाहता हूं। उदाहरण के लिए:मैं पाइथन में यूनिकोड वर्णों को फ़्लोट करने के लिए कैसे परिवर्तित करूं?

"⅕" 0.2

कैसे पायथन में ऐसा करने की कोई सुझाव हो जाते हैं?

उत्तर

24

आप unicodedata मॉड्यूल का उपयोग करना चाहते हैं:

import unicodedata 
unicodedata.numeric(u'⅕') 

यह प्रिंट होगा:

0.20000000000000001 

चरित्र एक अंकीय मान नहीं है, तो unicodedata.numeric(unichr[, default]) डिफ़ॉल्ट वापस आ जाएगी, या यदि डिफ़ॉल्ट है दिया नहीं ValueError बढ़ाएगा।

+0

अरे, यह बहुत अच्छा है! –

+6

पाइथन को ऐप्पल से उधार लेने से एक नया नारा मिलना चाहिए: "इसके लिए एक मॉड्यूल है"। –

+0

यूप बैटरी शामिल हैं। –

1

चूंकि यूनिकोड में परिभाषित अंशों का केवल एक निश्चित संख्या में हैं, एक शब्दकोश उपयुक्त लग रहा है:

Fractions = { 
    u'¼': 0.25, 
    u'½': 0.5, 
    u'¾': 0.75, 
    u'⅕': 0.2, 
    # add any other fractions here 
} 

अद्यतन: unicodedata मॉड्यूल एक बेहतर समाधान है।

+0

विशेष रूप से आप पात्रों को U + 00BC ई (http://www.unicode.org/charts/PDF/U0080.pdf) और देख रहे हैं U + 2153-ई (http://www.unicode.org/charts/PDF/U2150.pdf)। "वल्गर" के लिए बस इंडेक्स (http://www.unicode.org/Public/UNIDATA/Index.txt) खोजें। –

1

शायद आप "unicodedata" module का उपयोग कर अंश को विघटित कर सकते हैं और फिर FRACTION SLASH character देखें और फिर यह केवल सरल विभाजन का मामला है।

उदाहरण के लिए:

>>> import unicodedata 
>>> unicodedata.lookup('VULGAR FRACTION ONE QUARTER') 
u'\xbc' 
>>> unicodedata.decomposition(unicodedata.lookup('VULGAR FRACTION ONE QUARTER')) 
'<fraction> 0031 2044 0034' 

अद्यतन: मैं संदर्भ के लिए लेकिन unicodedata.numeric का उपयोग कर() प्रति कार्ल का जवाब एक बहुत अच्छा विचार है, जैसा कि यहाँ इस उत्तर छोड़ देंगे।

1

पायथन 3.1 में, आपको 'यू' की आवश्यकता नहीं है, और यह 0.20000000000000001 के बजाय 0.2 का उत्पादन करेगा।

>>> unicodedata.numeric('⅕') 
0.2 
+1

जोर दें (0.2 == 0.20000000000000001) ... जो संभवतः आप कहने के लिए चाहते थे वह है कि unicodedata.numeric() द्वारा निर्मित फ्लोट नहीं बदला है, लेकिन repr() को कम डरावना बनाने के लिए बढ़ाया गया है लेकिन अभी भी कम्प्यूटेशनल रूप से समकक्ष उत्तर जहां संभव। –

0

मैं यहाँ स्पष्ट करते हुए कहा रहा हूँ, लेकिन यह मामलों के लिए यह विस्तार करने के लिए जब लोगों को लिखने "1.75" जिसका अर्थ है बहुत आसान है "1¾", तो मैं बस इसे यहाँ त्वरित संदर्भ के लिए साझा करने के लिए जा रहा हूँ:

import unicodedata 

# Assuming that the unicode is always the last character. You always going to see stuff like "3¼", or "19¼" whereas stuff like "3¼5" 
# does not have a clear interpretation 

def convertVulgarFractions(vulgarFraction): 

    if (len(vulgarFraction) == 1): 
     return unicodedata.numeric(vulgarFraction) 

    if (len(vulgarFraction) > 1) & (not (vulgarFraction[:len(vulgarFraction)-1].isdigit())): 
     raise ArithmeticError("The format needs to be numbers ending with a vulgar fraction. The number inserted was " + 
           str(vulgarFraction)) 

    if vulgarFraction[len(vulgarFraction)-1].isdigit(): 
     return float(vulgarFraction) 
    else: 
     return float(vulgarFraction[:len(vulgarFraction)-1]) + unicodedata.numeric(vulgarFraction[len(vulgarFraction)-1]) 
0

हालांकि वास्तव में क्या नहीं पूछा गया था, शायद कोई चाहता है कि यह एक फ्लोट के बजाय एक अंश में परिवर्तित हो। आखिरकार, एक अंश वह वास्तव में दर्शाता है।

unicodedata.normalize("NFKC", "⅕") परिणाम "1⁄5" में परिणाम। यह वर्तमान में fractions.Fraction द्वारा समझा नहीं गया है, जो के बजाय / के साथ वर्णित एक अंश की अपेक्षा करता है। हालांकि, उस को बदलने के लिए आसान है:,

In [313]: def unifrac_to_frac(s): 
    ...:  return fractions.Fraction(unicodedata.normalize("NFKC", s).replace("⁄", "/")) 
    ...: 

In [315]: unifrac_to_frac("⅕") 
Out[315]: Fraction(1, 5) 

In [316]: unifrac_to_frac("½") 
Out[316]: Fraction(1, 2) 

In [317]: unifrac_to_frac("↉") 
Out[317]: Fraction(0, 1) 
संबंधित मुद्दे

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