2009-11-22 7 views
59

मेरे पास एक स्ट्रिंग है जो एक संख्या का प्रतिनिधित्व करती है जो हजारों को अलग करने के लिए अल्पविराम का उपयोग करती है। मैं इसे पायथन में किसी संख्या में कैसे परिवर्तित कर सकता हूं?स्ट्रिंग को किसी संख्या में बदलने के लिए मैं पाइथन का उपयोग कैसे करूं यदि इसमें हजारों विभाजक के रूप में अल्पविराम है?

>>> int("1,000,000") 

ValueError उत्पन्न करता है।

मैं इसे बदलने की कोशिश करने से पहले कॉमा को खाली तारों से प्रतिस्थापित कर सकता हूं, लेकिन यह किसी भी तरह गलत लगता है। क्या कोई बेहतर तरीका है?

+1

यह गलत कैसे लगता है? समारोह एक कारण के लिए है। –

उत्तर

79
import locale 
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 
locale.atoi('1,000,000') 
# 1000000 
locale.atof('1,000,000.53') 
# 1000000.53 
+0

क्या ऐसे स्थान नहीं हैं जहां यह काम नहीं करेगा? – abyx

+8

+1, लेकिन कृपया लोकेल-सेटिंग जोड़ें ('' '' के डिफ़ॉल्ट लोकेल के साथ यह अभी भी 'ValueError'' देगा!)। –

+1

मुझे लगता है कि गुरु का अर्थ कुछ ऐसा है: locale.setlocale (locale.LC_ALL, 'en_US.UTF-8') – mbarkhau

30

हजारों विभाजक के साथ संख्याओं को पार्स करने के कई तरीके हैं। और मुझे संदेह है कि ~ उबंटू द्वारा वर्णित तरीका सभी मामलों में सबसे अच्छा है। यही कारण है कि मैं अन्य तरीकों की सूची भी देता हूं।

  1. उचित जगह setlocale() कॉल करने के लिए __main__ मॉड्यूल में है। यह वैश्विक सेटिंग है और पूरे कार्यक्रम और यहां तक ​​कि सी एक्सटेंशन को प्रभावित करेगा (हालांकि ध्यान दें कि LC_NUMERIC सेटिंग सिस्टम स्तर पर सेट नहीं है, लेकिन पायथन द्वारा अनुकरण किया जाता है)। caveats in documentation पढ़ें और इस तरह से जाने से पहले दो बार सोचें। यह शायद एकल एप्लिकेशन में ठीक है, लेकिन व्यापक दर्शकों के लिए पुस्तकालयों में इसका कभी भी उपयोग न करें। शायद आप कुछ विशेष वर्णसेट एन्कोडिंग के साथ लोकेल का अनुरोध करने से बचें, क्योंकि यह कुछ सिस्टम पर उपलब्ध नहीं हो सकता है।

  2. अंतर्राष्ट्रीयकरण के लिए तीसरे पक्ष के पुस्तकालयों में से एक का उपयोग करें। उदाहरण PyICU लिए wihtout पूरी प्रक्रिया को प्रभावित करने वाले (और यहां तक ​​कि स्थानों का उपयोग किए बिना विशेष हजारों विभाजक के साथ संख्या को पार्स) किसी भी उपलब्ध स्थान का उपयोग कर सकते हैं:।

    NumberFormat.createInstance (लोकेल ('en_US')) को पार्स ("1000000")। getLong()

  3. अपना खुद का पार्सिंग फ़ंक्शन लिखें, यदि आप तीसरे पक्ष के पुस्तकालयों को इसे "सही तरीके से" करने के लिए नहीं स्थापित करते हैं। सख्त सत्यापन की आवश्यकता नहीं होने पर यह int(data.replace(',', '')) जितना आसान हो सकता है।

+0

+1 सरल तरीके से अनुशंसा करने के लिए। जब मुझे यही समस्या थी तो मुझे बस इतना ही चाहिए। –

+0

एक टाइपो को ठीक करने के लिए संपादित किया गया ('setlocate' 'setlocale' होना चाहिए)। इसके अलावा, +1। –

+0

निर्बाध आत्म-प्रचार, मैंने तीसरे विकल्प का उपयोग किया। तो अगर कोई दिलचस्पी लेता है, तो [** यह प्रश्न/उत्तर **] देखें (https://stackoverflow.com/questions/48843193/convert-a-number-using-atof/48845430#48845430) – Jan

3

मैं स्वीकार किए जाते हैं जवाब से स्थान त्रुटि मिली, लेकिन निम्न परिवर्तन फिनलैंड (Windows XP) में यहां काम करता है:

import locale 
locale.setlocale(locale.LC_ALL, 'english_USA') 
print locale.atoi('1,000,000') 
# 1000000 
print locale.atof('1,000,000.53') 
# 1000000.53 
3

यह काम करता है:

(ए गंदा लेकिन तेजी से)

>>> a='-1,234,567,89.0123' 
>>> "".join(a.split(",")) 
'-123456789.0123' 
7

कॉम को खाली तारों से बदलें, और परिणामस्वरूप स्ट्रिंग को int या एक में बदलें float

>>> a = '1,000,000' 
>>> int(a.replace(',' , '')) 
1000000 
>>> float(a.replace(',' , '')) 
1000000.0 
+13

कृपया, ओपी सवाल फिर से पढ़ें। विशेष रूप से जहां वह कहता है: "मैं इसे बदलने की कोशिश करने से पहले कॉमा को खाली तारों से प्रतिस्थापित कर सकता हूं, लेकिन यह किसी भी तरह गलत लगता है। क्या कोई बेहतर तरीका है?" – joaquin

0
>>> import locale 
>>> locale.setlocale(locale.LC_ALL, "") 
'en_US.UTF-8' 
>>> print locale.atoi('1,000,000') 
1000000 
>>> print locale.atof('1,000,000.53') 
1000000.53 

इस अमेरिका में लिनक्स पर किया जाता है। -सुरेश

0
#python3 tenzin 
def changenum(data): 
    foo = "" 
    for i in list(data): 
     if i == ",": 
      continue 
     else: 
      foo += i 
    return float(int(foo)) 
1

मैंने कोशिश की। यह प्रश्न से थोड़ा आगे चला जाता है: आपको एक इनपुट मिलता है। इसे पहले स्ट्रिंग में परिवर्तित कर दिया जाएगा (यदि यह एक सूची है, उदाहरण के लिए सुंदर सूप से); फिर int, फिर तैरने के लिए।

जहां तक ​​यह प्राप्त हो सकता है।सबसे बुरे मामले में, यह स्ट्रिंग के रूप में अनवरोधित सब कुछ देता है।

def to_normal(soupCell): 
''' converts a html cell from beautiful soup to text, then to int, then to float: as far as it gets. 
US thousands separators are taken into account. 
needs import locale''' 

locale.setlocale(locale.LC_ALL, 'english_USA') 

output = unicode(soupCell.findAll(text=True)[0].string) 
try: 
    return locale.atoi(output) 
except ValueError: 
    try: return locale.atof(output) 
    except ValueError: 
     return output 
संबंधित मुद्दे