यदि हजारों विभाजक के रूप में इसमें कॉमा है तो इसे स्ट्रिंग में एक संख्या में कैसे परिवर्तित किया जाए?


85

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

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

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

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

जवाबों:


103
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

9
+1 करें, लेकिन कृपया लोकेल-सेटिंग जोड़ें ( 'C'इस के डिफ़ॉल्ट लोकेल के साथ अभी भी a ValueError!) होगा।
— एलेक्स मार्टेली

1
मुझे लगता है कि गुरु का मतलब कुछ इस तरह होता है: locale.setlocale (locale.LC_ALL, 'en_US.UTF-8')
— mbarkhau

टिप्पणियों के लिए धन्यवाद। मैंने एक विशिष्ट स्थान जोड़ा है।
— 17

बहुत अच्छा। इस तरह मैं यूरोपीय नंबर संभाल सकता हूं जहां अल्पविराम और अंक भी स्विच किए जाते हैं। धन्यवाद।
— dsimard

5
मुझे लोकल एरर मिलता है:Traceback (most recent call last): File "F:\test\locale_num.py", line 2, in <module> locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) File "F:\Python27\lib\locale.py", line 539, in setlocale return _setlocale(category, locale) locale.Error: unsupported locale setting
— टोनी वेजालिनेन ऑक्ट

40

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

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

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

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

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


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

एक टाइपो ( setlocateहोना चाहिए setlocale) को ठीक करने के लिए संपादित । इसके अलावा, +1।
— मार्क डिकिंसन

बेशर्म आत्म-प्रचार, मैंने तीसरे विकल्प का उपयोग किया। इसलिए अगर किसी को दिलचस्पी है, तो इस प्रश्न / उत्तर
— Jan

14

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

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

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

1
मुझे यह उत्तर उपयोगी लगा, क्योंकि ओपी के रूप में मेरी लगभग वैसी ही आवश्यकताएं हैं (जैसे कि टार्ट्स में कनवर्ट करें), लेकिन मुझे स्वीकार किए गए उत्तर की तुलना में सरल तरीका पसंद है।
— कै

4

यह काम:

(एक गंदा लेकिन त्वरित तरीका)

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

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

1

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

यह जितना मिल सकता है, जाता है। सबसे बुरी स्थिति में, यह सब कुछ स्ट्रिंग के रूप में अनकवर्ड लौटाता है।

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

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

यह यूएस में लिनक्स पर किया जाता है।


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

2
उस कोड के साथ जाने के लिए कुछ स्पष्टीकरण? सूप का एक कटोरा आम तौर पर एक सूप चम्मच के साथ परोसा जाता है
— cs95
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.