दिलचस्प पोस्ट
क्यूटी: एकल उदाहरण ऐप सुरक्षा के लिए सर्वश्रेष्ठ अभ्यास यूट्यूब वीडियो से बिट दर की जानकारी कैसे प्राप्त करें? strdup () – यह सी में क्या करता है? सी में एक स्ट्रिंग पर स्विच करने का सबसे अच्छा तरीका मैं एक HTML टूलटिप में कैरिज रिटर्न कैसे उपयोग कर सकता हूं? वस्तुओं के सरणियों पर अंडरस्कोर की "अंतर" विधि का उपयोग करना Request.GET में यूआरएल पैरामीटर कैप्चर करना मैं NSTimer का उपयोग कैसे करूं? सी को एक निष्पादन योग्य बाइनरी फ़ाइल में कैसे संकलित करें और एंड्रॉइड शेल से Android में चलाएं? बैबल और वेबपैक का उपयोग करते समय मैं स्रोत मेप कैसे उत्पन्न करूं? यूआरएल PHP का अंतिम भाग प्राप्त करें आशय और बंडल के लिए सरल उदाहरण एंड्रॉइड में मार्की टेक्स्ट प्रवेश IE पर jQuery के स्क्रिप्ट पर खारिज कर दिया ग्रुप बी के साथ अधिकतम (DATE)

पार्स स्टिंग टू फ्लोट या इंट

अजगर में, मैं कैसे "545.2222" एक संख्यात्मक स्ट्रिंग को उसके संबंधित फ्लोट मान, 542.2222 पार्स कर सकता हूं? या पूर्णांक में स्ट्रिंग "31" को पार्स करें, 31 ?

मैं बस एक फ्लोट में फ्लोट string को पार्स करने के बारे में जानना चाहता हूं, और (पृथक) एक int के लिए एक int string

वेब के समाधान से एकत्रित समाधान "पार्स स्टिंग टू फ्लोट या इंट"

 >>> a = "545.2222" >>> float(a) 545.22220000000004 >>> int(float(a)) 545 
 def num(s): try: return int(s) except ValueError: return float(s) 

स्ट्रिंग एक फ्लोट है या नहीं यह जांचने के लिए पायथन विधि:

 def isfloat(value): try: float(value) return True except: return False 

इस फ़ंक्शन का एक लंबा और अधिक सटीक नाम हो सकता है: isConvertibleToFloat(value)

क्या है, और पायथन में एक फ्लोट आपको आश्चर्यचकित नहीं कर सकता है:

 val isfloat(val) Note -------------------- ---------- -------------------------------- "" False Blank string "127" True Passed string True True Pure sweet Truth "True" False Vile contemptible lie False True So false it becomes true "123.456" True Decimal " -127 " True Spaces trimmed "\t\n12\r\n" True whitespace ignored "NaN" True Not a number "NaNanananaBATMAN" False I am Batman "-iNF" True Negative infinity "123.E4" True Exponential notation ".1" True mantissa only "1,234" False Commas gtfo u'\x30' True Unicode is fine. "NULL" False Null is not special 0x3fade True Hexidecimal "6e7777777777777" True Shrunk to infinity "1.797693e+308" True This is max value "infinity" True Same as inf "infinityandBEYOND" False Extra characters wreck it "12.34.56" False Only one dot allowed u'四' False Japanese '4' is not a float. "#56" False Pound sign "56%" False Percent of what? "0E0" True Exponential, move dot 0 places 0**0 True 0___0 Exponentiation "-5e-5" True Raise to a negative number "+1e1" True Plus is OK with exponent "+1e1^5" False Fancy exponent not interpreted "+1e1.3" False No decimals in exponent "-+1" False Make up your mind "(1)" False Parenthesis is bad 

आपको लगता है कि आपको पता है कि कौन से संख्याएं हैं? आप जितना सोचते हैं उतना अच्छा नहीं है! बड़ा आश्चर्य नहीं

यह एक और तरीका है जिसका उल्लेख यहां किया जाना चाहिए, ast.literal_eval :

इसका इस्तेमाल बिना विश्वसनीय स्रोतों से अजगर अभिव्यक्ति वाले तारों का सुरक्षित रूप से मूल्यांकन करने के लिए किया जा सकता है, बिना मूल्यों को पार्स करने की आवश्यकता के बिना।

यही है, एक सुरक्षित 'eval'

 >>> import ast >>> ast.literal_eval("545.2222") 545.2222 >>> ast.literal_eval("31") 31 
 float(x) if '.' in x else int(x) 

स्थानीयकरण और अल्पविराम

आपको float("545,545.2222") जैसी मामलों के लिए एक संख्या के स्ट्रिंग प्रतिनिधित्व में अल्पविराम की संभावना पर विचार करना चाहिए, जो एक अपवाद फेंकता है। इसके बजाय, स्ट्रिंग को संख्याओं में कनवर्ट करने और कमानों को सही ढंग से व्याख्या करने के लिए locale में तरीकों का उपयोग करें। स्थानीय स्तर वांछित संख्या सम्मेलन के लिए सेट किए जाने के बाद locale.atof विधि एक चरण में फ्लोट में परिवर्तित हो जाती है।

उदाहरण 1 – संयुक्त राज्य संख्या सम्मेलन

संयुक्त राज्य अमेरिका और ब्रिटेन में, अल्पविराम का इस्तेमाल हजारों विभाजक के रूप में किया जा सकता है। अमेरिकी लोकेल के साथ इस उदाहरण में, अल्पविराम एक विभाजक के रूप में ठीक से नियंत्रित किया जाता है:

 >>> import locale >>> a = u'545,545.2222' >>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 'en_US.UTF-8' >>> locale.atof(a) 545545.2222 >>> int(locale.atof(a)) 545545 >>> 

उदाहरण 2 – यूरोपीय संख्या सम्मेलनों

दुनिया के अधिकांश देशों में , अल्पविराम का इस्तेमाल अवधि के बजाय दशमलव अंकों के लिए किया जाता है। फ्रांसीसी लोकेल के साथ इस उदाहरण में, अल्पविराम सही तरीके से दशमलव चिह्न के रूप में संभाला जाता है:

 >>> import locale >>> b = u'545,2222' >>> locale.setlocale(locale.LC_ALL, 'fr_FR') 'fr_FR' >>> locale.atof(b) 545.2222 

विधि locale.atoi भी उपलब्ध है, लेकिन तर्क एक पूर्णांक होना चाहिए।

उपयोगकर्ता कोडलोगिक और हार्ले सही हैं, लेकिन अगर आप जानते हैं कि स्ट्रिंग एक पूर्णांक है (उदाहरण के लिए, 545), तो आपको ध्यान रखना चाहिए कि आप फ्लोट के पहले कास्टिंग के बिना इंटेल ("545") को कॉल कर सकते हैं।

यदि आपकी तार सूची में है, तो आप मानचित्र फ़ंक्शन को भी इस्तेमाल कर सकते हैं।

 >>> x = ["545.0", "545.6", "999.2"] >>> map(float, x) [545.0, 545.60000000000002, 999.20000000000005] >>> 

यह केवल अच्छा है अगर वे सभी एक ही प्रकार के होते हैं

यदि आप तीसरे पक्ष के मॉड्यूल के खिलाफ नहीं हैं, तो आप fastnumbers मॉड्यूल की जांच कर सकते हैं। यह fast_real नामक फ़ंक्शन प्रदान करता है जो वास्तव में यह प्रश्न करता है कि यह प्रश्न शुद्ध-पायथन कार्यान्वयन से अधिक तेज़ी से पूछता है और करता है:

 >>> from fastnumbers import fast_real >>> fast_real("545.2222") 545.2222 >>> type(fast_real("545.2222")) float >>> fast_real("31") 31 >>> type(fast_real("31")) int 

सवाल थोड़ा सा पुराने लगता है लेकिन मुझे एक फ़ंक्शन का सुझाव दें, parseStr, जो कुछ समान बनाता है, वह है, पूर्णांक या फ्लोट देता है और यदि कोई दिया एएससीआईआई स्ट्रिंग उनमें से कोई भी नहीं बदला जा सकता है तो यह अछूता नहीं देता है। बेशक कोड को केवल वही करने के लिए समायोजित किया जा सकता है जो आप चाहते हैं:

  >>> import string >>> parseStr = lambda x: x.isalpha() and x or x.isdigit() and \ ... int(x) or x.isalnum() and x or \ ... len(set(string.punctuation).intersection(x)) == 1 and \ ... x.count('.') == 1 and float(x) or x >>> parseStr('123') 123 >>> parseStr('123.3') 123.3 >>> parseStr('3HC1') '3HC1' >>> parseStr('12.e5') 1200000.0 >>> parseStr('12$5') '12$5' >>> parseStr('12.2.2') '12.2.2' 

अजगर में, मैं कैसे "545.2222" की एक संख्यात्मक स्ट्रिंग को उसके संबंधित फ्लोट मान, 542.2222 पर पार्स कर सकता हूं? या पूर्णांक में स्ट्रिंग "31" को पार्स करें, 31? मैं बस एक फ्लोट में फ्लोट स्ट्रिंग को पार्स करने के बारे में जानना चाहता हूं, और (पृथक) एक int के लिए एक इंट स्ट्रिंग

यह अच्छा है कि आप इनसे अलग से करने के लिए कहें। यदि आप उनका मिश्रण कर रहे हैं, तो आप अपने आप को समस्याओं के लिए बाद में स्थापित कर सकते हैं सरल उत्तर है:

"545.2222" फ्लोट करने के लिए:

 >>> float("545.2222") 545.2222 

"31" को एक पूर्णांक:

 >>> int("31") 31 

अन्य रूपांतरण, स्ट्रिंग्स और लीटरल्स में और से संबंधित हैं:

विभिन्न ठिकानों से रूपांतरण, और आपको पहले से आधार पता होना चाहिए (10 डिफ़ॉल्ट है)। नोट करें कि आप उनको किस पायथन को अपनी शाब्दिक (नीचे देखें) या उपसर्ग को निकालने की उम्मीद कर सकते हैं:

 >>> int("0b11111", 2) 31 >>> int("11111", 2) 31 >>> int('0o37', 8) 31 >>> int('37', 8) 31 >>> int('0x1f', 16) 31 >>> int('1f', 16) 31 

यदि आपको आधार पहले से नहीं पता है, लेकिन आप जानते हैं कि उनके पास सही उपसर्ग है, तो पायथन आपके लिए यह अनुमान लगा सकता है यदि आप 0 को आधार के रूप में पास करते हैं:

 >>> int("0b11111", 0) 31 >>> int('0o37', 0) 31 >>> int('0x1f', 0) 31 

गैर-दशमलव (यानी पूर्णांक) अन्य आसनों से लिटरल

यदि आपकी प्रेरणा आपकी खुद की कोड स्पष्ट रूप से कठिन-कोडित विशिष्ट मानों का प्रतिनिधित्व करने के लिए है, हालांकि, आपको कुर्सियां ​​बदलने की आवश्यकता नहीं हो सकती है – आप पायथन को आपके लिए सही वाक्यविन्यास के साथ स्वचालित रूप से कर सकते हैं।

आप निम्नलिखित शब्दों के साथ पूर्णांक में स्वत: रूपांतरण प्राप्त करने के लिए एप्रोपास उपसर्ग का उपयोग कर सकते हैं। ये पायथन 2 और 3 के लिए मान्य हैं:

बाइनरी, उपसर्ग 0 0b

 >>> 0b11111 31 

अष्टक, उपसर्ग 0o

 >>> 0o37 31 

हेक्साडेसिमल, उपसर्ग 0x

 >>> 0x1f 31 

यह उपयोगी हो सकता है जब बाइनरी फ्लैग का वर्णन, कोड में फ़ाइल अनुमतियां, या रंगों के लिए हेक्स मान – उदाहरण के लिए, नोट नहीं उद्धरण:

 >>> 0b10101 # binary flags 21 >>> 0o755 # read, write, execute perms for owner, read & ex for group & others 493 >>> 0xffffff # the color, white, max values for red, green, and blue 16777215 

अजगर 3 के साथ संगत अजगर 2 ऑक्टल बनाना

यदि आपको कोई पूर्णांक दिखाई देता है जो कि 0 से शुरू होता है, पायथन 2 में, यह (पदावनत) अष्टक वाक्यविन्यास है

 >>> 037 31 

यह बुरा है क्योंकि ऐसा लगता है कि मान 37 होनी चाहिए। इसलिए पायथन 3 में, अब यह एक SyntaxError उठाती है:

 >>> 037 File "<stdin>", line 1 037 ^ SyntaxError: invalid token 

अपने पायथन 2 ऑक्टल को ओक्टाल से कन्वर्ट करें जो कि 0 और उपसर्ग के साथ 2 और 3 दोनों में काम करते हैं:

 >>> 0o37 31 

float("545.2222") और int(float("545.2222"))

YAML पार्सर आपको यह पता लगाने में सहायता कर सकता है कि आपकी स्ट्रिंग डेटाटाइप क्या है। yaml.load() उपयोग करें, और उसके बाद आप type(result) लिए परीक्षण type(result) का उपयोग कर सकते हैं:

 >>> import yaml >>> a = "545.2222" >>> result = yaml.load(a) >>> result 545.22220000000004 >>> type(result) <type 'float'> >>> b = "31" >>> result = yaml.load(b) >>> result 31 >>> type(result) <type 'int'> >>> c = "HI" >>> result = yaml.load(c) >>> result 'HI' >>> type(result) <type 'str'> 
 def get_int_or_float(v): number_as_float = float(v) number_as_int = int(number_as_float) return number_as_int if number_as_float == number_as_int else number_as_float 

आपको ठीक से ऐसा करने के लिए खाते को गोलाई में लेना होगा।

Ie int (5.1) => 5 int (5.6) => 5 – गलत, 6 होना चाहिए ताकि हम इंट (5.6 + 0.5) => 6

 def convert(n): try: return int(n) except ValueError: return float(n + 0.5) 
 def num(s): """num(s) num(3),num(3.7)-->3 num('3')-->3, num('3.7')-->3.7 num('3,700')-->ValueError num('3a'),num('a3'),-->ValueError num('3e4') --> 30000.0 """ try: return int(s) except ValueError: try: return float(s) except ValueError: raise ValueError('argument is not a string of number') 

यह https://stackoverflow.com/a/33017514/5973334 का सही संस्करण है

यह एक स्ट्रिंग को पार्स करने की कोशिश करेगा और स्ट्रिंग का प्रतिनिधित्व करने पर निर्भर करता है या तो int या float लौटाता है। यह अपवादों को पार्स करने या कुछ अप्रत्याशित व्यवहार बढ़ा सकता है ।

  def get_int_or_float(v): number_as_float = float(v) number_as_int = int(number_as_float) return number_as_int if number_as_float == number_as_int else number_as_float 

उपयोग:

 def num(s): try: for each in s: yield int(each) except ValueError: yield float(each) a = num(["123.55","345","44"]) print a.next() print a.next() 

यह सबसे पायथनिक तरीका है जिसके साथ मैं आ सकता हूं।

मैं इसके लिए इस फ़ंक्शन का उपयोग करता हूं

 def parse_str(s): try: return eval(str(s)) except: return 

यह स्ट्रिंग को इसके प्रकार में बदल देगा

 value = parse_str('1') # Returns Integer value = parse_str('1.5') # Returns Float 

मुझे आश्चर्य है कि कोई भी रेगेक्स का उल्लेख नहीं करता है क्योंकि कभी-कभी स्ट्रिंग संख्या तैयार करने से पहले तैयार और सामान्य होनी चाहिए

 import re def parseNumber(value, as_int=False): try: number = float(re.sub('[^.\-\d]', '', value)) if as_int: return int(number + 0.5) else: return number except ValueError: return float('nan') # or None if you wish 

उपयोग:

 parseNumber('13,345') > 13345.0 parseNumber('- 123 000') > -123000.0 parseNumber('99999\n') > 99999.0 

और वैसे, यह सत्यापित करने के लिए कि आपका कोई नंबर है:

 import numbers def is_number(value): return isinstance(value, numbers.Number) # will work with int, float, long, Decimal 

उपयोग:

 >>> str_float = "545.2222" >>> float(str_float) 545.2222 >>> type(_) # Check its type <type 'float'> >>> str_int = "31" >>> int(str_int) 31 >>> type(_) # Check its type <type 'int'> 

यहाँ आपके प्रश्न का एक और व्याख्या है (संकेत: यह अस्पष्ट है) यह संभव है कि आप इस तरह से कुछ खोज रहे हैं:

 def parseIntOrFloat( aString ): return eval( aString ) 

यह इस तरह काम करता है…

 >>> parseIntOrFloat("545.2222") 545.22220000000004 >>> parseIntOrFloat("545") 545 

सैद्धांतिक रूप से, एक इंजेक्शन भेद्यता है स्ट्रिंग, उदाहरण के लिए "import os; os.abort()" । स्ट्रिंग के बारे में किसी भी पृष्ठभूमि के बिना, हालांकि, संभावना सैद्धांतिक अटकलें हैं। चूंकि सवाल अस्पष्ट है, यह बिल्कुल स्पष्ट नहीं है कि यह भेद्यता वास्तव में मौजूद है या नहीं।