Python-da floating point və ya int ilə bir simli necə təhlil edə bilərəm?

Python'da, "545.2222" kimi bir 545.2222 , 545.2222 uyğun kayan nöqtəyə necə 545.2222 olar? Və ya "31" simli tam ədəd halına salır?

Yalnız flor kəmərini float etmək üçün necə ayırmaq istərdim, int ( int ) isə int üçün (ayrı-ayrı).

1902
19 дек. 19 dekabrda Tristan Havelick tərəfindən təyin olundu 2008-12-19 04:52 '08 at 4:52 2008-12-19 04:52
@ 26 cavab
 >>> a = "545.2222" >>> float(a) 545.22220000000004 >>> int(float(a)) 545 
2257
19 дек. Cavab Harley Holcombe tərəfindən 19 dekabrda verilir 2008-12-19 04:54 '08 at 4:54 2008-12-19 04:54
 def num(s): try: return int(s) except ValueError: return float(s) 
border=0
462
19 дек. Javier 19 dekabrda cavabı verdi . 2008-12-19 05:31 '08 saat 05:31 'de 2008-12-19 05:31

Python metodu bir simli üzən nöqtə olub olmadığını yoxlamaq üçün:

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

Bu funksiya üçün daha uzun və daha dəqiq bir ad ola bilər: is_convertible_to_float(value)

Python-da bir float nədir və şaşırmaz :

 val is_float(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 Hexadecimal "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 

Hansı nömrələri bilirsinizmi? Siz düşündüyünüz qədər yaxşı deyilik! Böyük bir sürpriz deyil.

450
05 янв. Cavab Eric Leschinski Jan 05 tərəfindən verilir 2014-01-05 07:15 '14 da 7:15 2014-01-05 07:15

Burada qeyd etmək lazım olan başqa üsuldur, ast.literal_eval :

Bu dəyərlər müstəqil analiz etmədən Python ifadələrini ehtiva etməyən mənbələrdən təhvil verə bilmək üçün istifadə edilə bilər.

Bu təhlükəsiz bir 'qiymətləndirmə'

 >>> import ast >>> ast.literal_eval("545.2222") 545.2222 >>> ast.literal_eval("31") 31 
112
01 марта '12 в 7:23 2012-03-01 07:23 cavab 01 mart 2012-ci il saat 07: 23-də verilir. 2012-03-01 07:23
 float(x) if '.' in x else int(x) 
77
19 дек. Cavab 19 dekabrda Dino Viehland tərəfindən verilir . 2008-12-19 05:32 '08 at 5:32 2008-12-19 05:32

Lokallaşdırma və virgül

Bir ədəd simvolu təqdimatında, bir istisna float("545,545.2222") tipi float("545,545.2222") halları üçün vergüllərin ehtimalını nəzərdən keçirməliyik. Bunun əvəzində, simləri ədədlərə çevirmək və virgülləri doğru şəkildə şərh etmək üçün locale üsullardan istifadə edin. locale.atof yerli miqdarda razılaşdırılmış miqdarda müəyyən olunduqdan sonra bir addımda float çevrilir.

Misal 1 - Amerika Birləşmiş Ştatlarının Simvolları

Birləşmiş Ştatlarda və Böyük Britaniyada vergüllər minlərlə separator kimi istifadə edilə bilər. Bu Amerika dilində nümunədə, virgül düzgün bir şəkildə məhdudlaşdırılır:

 >>> 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 >>> 

Məsələn 2 - Avropa Konvensiyası

Dünyanın əksər ölkələrində ondalık yerlər əvəzinə vergüllər istifadə olunur. Bu Fransız nümunəsində virgül ondalık bir etiket kimi düzgün qaydada qəbul olunur:

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

locale.atoi üsulu da mövcuddur, lakin arqument tamsayı olmalıdır.

55
23 июля '13 в 19:00 2013-07-23 19:00 Cavab 23 Çərşənbə axşamı günü saat 19:00 'da Mark Chackerian tərəfindən verilir

Üçüncü tərəf modullarından uzaqlaşmırsanız, fastnumbers modulunu kontrol edə bilərsiniz. Bu fast_real adlı funksiyanı təmin edir, hansı ki bu sual soruşur və bunu təmiz-Python tətbiqindən daha sürətli edir:

 >>> 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 
23
14 авг. Cavab SethMMorton 14 aug verilir . 2014-08-14 06:21 '14 saat 06:21 'da 2014-08-14 06:21

Codelogic və harley istifadəçiləri düzgündür, amma simli bir tamsayı olduğunu bilsəniz (məsələn, 545), ilk dəfə float olmadan int ("545") deyə bilərsiniz.

Xəttiniz siyahıda olsaydı, xəritə funksiyasından istifadə edə bilərsiniz.

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

Bütün bunlar eyni olsa yaxşıdır.

23
19 дек. Chris Cameron tərəfindən verilmiş cavab 19 dekabr 2008-12-19 05:09 '08 at 5:09 2008-12-19 05:09

Python'da, "545.2222" kimi bir ədədi simli, müvafiq qayçı nöqtəsinə, 542.2222-ə necə ayırmaq olar? Və ya "31" simli tam ədəd halına salır? Yalnız bir simli bir floating point ilə floating-point sayıya ayırmaq və (inteqrasiya int) int int üçün necə öyrənmək istəyirəm.

Yaxşı bir şey bunu ayrı-ayrılıqda soruş. Əgər onları qarışdırsanız, daha sonra problemləriniz üçün özünüzü qura bilərsiniz. Sadə cavab:

Üzmə üçün "545.2222"

 >>> float("545.2222") 545.2222 

Tam ədəd "31" :

 >>> int("31") 31 

Digər dəyişikliklər, strings və tamsaylı və tamsayılar:

Fərqli verilənlər bazalarından keçişlər və məlumat bazasını əvvəlcədən bilməli (default 10). Qeyd edək ki, Python'un yazılarından (aşağıya bax) hansıları gözlədiyini və ya prefiksini çıxarmaq üçün prefiks əlavə edə bilərsiniz:

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

Baza əvvəlcədən bilmirsinizsə, ancaq doğru prefiks olduğunu bilirsinizsə, baza olaraq 0-dan keçsəniz Python sizin üçün bunu edə bilər:

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

Digər əsaslardan qeyri-decimal (yəni tam ədədi)

Sizin motivasiyanız öz kodunuzun açıq-aşkar kodlu xüsusi dəyərləri təmsil etməsi üçün istifadə olunsa da, verilənlər bazalarından çevirmək lazım olmaya bilər - Python bunu avtomatik olaraq düzgün sözdizimlə həyata keçirə bilər.

Aşağıdakı məzmunlarla avtomatik olaraq tamsayılara çevrilmək üçün apropos prefikslərini istifadə edə bilərsiniz. Onlar Python 2 və 3 üçün etibarlıdır:

İkili prefiks 0b

 >>> 0b11111 31 

Səkkiz prefiks 0o

 >>> 0o37 31 

Onaltılıq prefiks 0x

 >>> 0x1f 31 

İkili bayraqları, kodda fayl icazələrini və rənglər üçün onaltılıq dəyərləri təsvir edərkən bu, faydalı ola bilər - məsələn, tırnak işarələrini əlavə etməyin:

 >>> 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 

Biz Python 3 ilə uyğunsuz seksiyeli Python 2'yi edirik

0 ilə başlayan bir tamsayı görürsünüzsə, Python 2-də bir sekizli sintaksis (tövsiyə edilmir).

 >>> 037 31 

Bu dəyər pis olmalıdır, çünki bu dəyər 37 olmalıdır. Buna görə Python 3-də bir SyntaxError baş verir:

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

Python 2 səkkiz ədədi 2-də və 3-də işləyən səkkiz ədədə 0o prefiksinə 0o :

 >>> 0o37 31 
18
23 июля '15 в 16:26 2015-07-23 16:26 Cavab 23 İyul tarixində saat 16: 19-da Aaron Hall tərəfindən verilir

Sual bir az köhnə görünür. Ancaq mənə oxşar bir şey edən bir parseStr funksiyasını təklif edək, yəni bir tamsayı və ya float verin və əgər verilən ASCII simli heç birinə çevrilə bilməzsə, bu qüsursuz olur. Əlbəttə, kodu yalnız istədiyiniz şeyi etmək üçün düzəlişlər edilə bilər:

  >>> 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' 
18
28 сент. Cavab krzym 28 sep verilir . 2011-09-28 22:45 '11 saat 22:45 'də 2011-09-28 22:45

float("545.2222")int(float("545.2222"))

15
19 дек. Cavab codelogic 19 dekabr verilir. 2008-12-19 04:54 '08 at 4:54 2008-12-19 04:54

YAML analizatoru hansı məlumat növünün simli olduğunu başa düşməyinizə kömək edəcəkdir. yaml.load() istifadə edin və sonra type(result) yoxlamaq üçün istifadə edə bilərsiniz:

 >>> 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'> 
13
16 апр. Rafe tərəfindən 16 apreldə cavab verildi 2013-04-16 06:03 '13, 6:03 'da 2013-04-16 06:03
 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 
11
08 окт. Cavab Totoro 08 oktyabr 2015-10-08 16:39 '15 at 4:39 pm 2015-10-08 16:39

Bunun üçün bu funksiyanı istifadə edirəm

 import ast def parse_str(s): try: return ast.literal_eval(str(s)) except: return 

Dəyişdirmək üçün simli çevirir.

 value = parse_str('1') # Returns Integer value = parse_str('1.5') # Returns Float 
11
09 июля '17 в 11:02 2017-07-09 11:02 Cavab Şameem 09 iyul '09 11:02 2017-07-09 11:02 tarixində verilir

Bunu etmək üçün, yuvarlaqlaşdırma nəzərdən keçirin.

yəni, int (5.1) => 5 int (5.6) => 5 - yanlış, 6 olmalıdır, belə ki int (5.6 + 0.5) => 6

 def convert(n): try: return int(n) except ValueError: return float(n + 0.5) 
7
21 окт. Cavab Nick 21 oktyabr verilir . 2010-10-21 17:10 '10 at 17:10 2010-10-21 17:10
 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') 
7
09 окт. Cavab Jerry T 09 oktyabr verilir. 2015-10-09 21:04 '15 at 21:04 2015-10-09 21:04

Heç kəs müntəzəm ifadə etmədiyi üçün təəccüblənirəm, çünki bir sıra dəmirdən əvvəl bəzən bir string hazırlanmalı və normallaşdırılmalıdır

 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 

istifadə edin:

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

və bir araya gəldikdə, bir ədəd olduğunuzu yoxlamaq üçün bir şey:

 import numbers def is_number(value): return isinstance(value, numbers.Number) # will work with int, float, long, Decimal 
5
12 июля '17 в 20:01 2017-07-12 20:01 Cavab Sławomir Lenart tərəfindən 12 İyul '17 'də 20:01 2017-07-12 20:01' də verilir

Python, bir linerin ayrılmasında belə böyük rahatlığı var.

 str = "545.2222" print ("int: ", + int(float(a))) print ("float: ", +(float(a))) 
4
01 марта '18 в 19:32 2018-03-01 19:32 Cavab Harry_pb tərəfindən 01 Mart 18:32 tarixində 19:32 2018-03-01 19:32 tarixində verilir

Python-da yazarkən, bir parametr kimi bir simli (və ya dublikatmağa çalışdığınız hər hansı bir dəyər) keçirən tip qurucusu funksiyasından istifadə edin.

Məsələn:

 >>>float("23.333") 23.333 

Səhnələrin arxasında python __float__ obyektlərin metodunu çağırır, bu da parametrlərin üzən təmsilini qaytarmalıdır. Xüsusilə __float__ çünki __float__ metodunu istifadə edərək, öz növlərini (sinfi istifadə edərək) müəyyən edə bilərsiniz, __float__ ki float (myobject) istifadə edərək float çevrilə bilər.

4
01 июля '18 в 23:42 2018-07-01 23:42 Cavab qwerty12345 01 iyul 18: 00-da saat 01: 18-də verilir. 2018-07-01 23:42

Bu on123.ru.site /questions / 785 / ... və yenidən baxılmış versiyasıdır.

Bu simli ayrıştırmaya və ya simli təmsil float asılı olaraq bir int ya da float dönməyə çalışacaq. Bu istisnaların ayrılmasına gətirib çıxara bilər və ya bəzi gözlənilməz davranışlara səbəb ola bilər.

  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 
3
18 мая '17 в 10:28 2017-05-18 10:28 Kuzeko'nun 18 May '17 'də saat 10:28 ' da cavab verdiyi 2017-05-05 10:28

str() hər hansı bir dəyişəni bir strata çevirmək, int() tam ədədi tamsayıları tamsaylara çevirmək və float() simli nömrələrini üzən bir dəyərə çevirmək üçün istifadə edə bilərsiniz.

 str_to_float = float("545.2222") str_to_int = int("31") 
2
13 окт. Cavab Xandelwal-manik tərəfindən 13 oktyabrda verilir 2018-10-13 09:31 '18; 9:31 ; 2018-10-13 09:31

İstifadə edin:

 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() 

Bu mənimlə qarşılaşa biləcəyim ən pythonic üsuldur.

1
09 окт. Cavab mövsümü 09 oktyabrda verildi . 2016-10-09 08:40 '16 saat 08:40 'da 2016-10-09 08:40

İstifadə edin:

 >>> 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'> 
0
11 сент. cavab ateymuri 11 sep verildi . 2016-09-11 17:32 '16 saat 17:32 'da 2016-09-11 17:32

Əgər str bilirsinizsə, bu yalnız bir int və ya float ola bilər:

 return int(s) if s.isdigit() else float(s) 
0
20 дек. Cavab Yakir Tsuberi tərəfindən verilir 20 Dekabr. 2018-12-20 12:11 '18 at 12:11 pm 2018-12-20 12:11

qiymətləndirmə bu problemi həll etmək üçün yaxşı bir seçimdir.

 a = "545.2222" try: print int(eval(a)) except: pass 
0
03 дек. cavab 03 dekabrda verilir . 2017-12-03 02:26 '17 də 2:26 2017-12-03 02:26

Sualınızın başqa bir təfsiridir (ipucu: bu müəyyən deyil). Bəlkə də belə bir şey axtarırsınız?

 def parseIntOrFloat( aString ): return eval( aString ) 

Bu kimi işləyir ...

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

Teorik olaraq, enjeksiyon üçün zəiflik var. Simli, misal üçün, "import os; os.abort()" ola bilər. Ancaq bu xəttin harada olduğu barədə heç bir məlumat olmadan, bir nəzəri spekülasyon var. Sual qeyri-səlis olduğundan, bu zəiflik həqiqətən mövcud olub-olmadığı aydın deyil.

-10
19 дек. Cavab S.Lott tərəfindən 19 dekabrda verilir . 2008-12-19 05:29 '08 at 5:29 2008-12-19 05:29

tags ilə bağlı digər suallar və ya bir sual