Bir dizgiyi float veya int'ye nas─▒l ayr─▒┼čt─▒r─▒r─▒m?


Al─▒nan cevaba git


Python'da, bir say─▒sal dizgeyi "545.2222" kar┼č─▒l─▒k gelen de─či┼čkenlik de─čeri gibi nas─▒l ayr─▒┼čt─▒r─▒r─▒m 545.2222 ? Ya dizeyi ayr─▒┼čt─▒rmak "31" , bir tam say─▒ya 31 ?

Sadece ayr─▒┼čt─▒rmak nas─▒l bilmek istiyorum ┼čamand─▒ra str bir etmek float ve (ayr─▒) bir int str bir etmek int .


2088









Cevap say─▒s─▒n─▒ say: 23






 >>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545
 

2445







 def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)
 

487







Bir dizenin kayan nokta olup olmad─▒─č─▒n─▒ kontrol etmek i├žin Python y├Ântemi

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

Bu i┼člev i├žin daha uzun ve daha do─čru bir ad olabilir: is_convertible_to_float(value)

Python'da bir ┼čamand─▒ra olmayan ┼čey nedir ve sizi ┼ča┼č─▒rtabilir:

 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
 

Say─▒lar─▒n ne oldu─čunu bildi─čini mi d├╝┼č├╝n├╝yorsun? D├╝┼č├╝nd├╝─č├╝n kadar iyi de─čilsin! S├╝rpriz de─čil.

Bu kodu hayati ├Âneme sahip yaz─▒l─▒mlarda kullanmay─▒n!

Bu ┼čekilde geni┼č istisnalar yakalamak, kanaryalar─▒ ├Âld├╝rmek ve istisnalar─▒ yok etmek, string olarak ge├žerli bir float'─▒n false d├Ânmesi i├žin k├╝├ž├╝k bir ┼čans yarat─▒r. float(...) Kod sat─▒r─▒n─▒n dizesinin i├žeri─čiyle ilgisi olmayan bin nedenlerden herhangi birine ba┼čar─▒s─▒z olabilir. Ancak, hayati ├Âneme sahip yaz─▒l─▒m─▒ Python gibi bir ├Ârdek yazma prototip dilinde yaz─▒yorsan─▒z, ├žok daha b├╝y├╝k sorunlar─▒n─▒z olur.


477







Bu, burada belirtilmeyi hak eden ba┼čka bir y├Ântemdir, ast.literal_eval :

Bu, g├╝venilir olmayan kaynaklardan Python ifadeleri i├žeren dizeleri, de─čerleri kendisinin ayr─▒┼čt─▒rmas─▒na gerek kalmadan g├╝venli bir ┼čekilde de─čerlendirmek i├žin kullan─▒labilir.

Yani, g├╝venli bir 'eval'

 >>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31
 

122


2012-03-01





 float(x) if '.' in x else int(x)
 

76







Yerelle┼čtirme ve virg├╝l

float("545,545.2222") Bir istisna atan durumlar i├žin, bir say─▒n─▒n dize g├Âsteriminde virg├╝l olas─▒l─▒─č─▒n─▒ g├Âz ├Ân├╝nde bulundurmal─▒s─▒n─▒z . Bunun yerine, locale dizeleri say─▒lara d├Ân├╝┼čt├╝rmek ve virg├╝lleri do─čru yorumlamak i├žin y├Ântemlerini kullan─▒n . locale.atof Yerele kez tek bir ad─▒mda bir ┼čamand─▒ra y├Ântem d├Ân├╝┼čt├╝r├╝r istenen say─▒da kural─▒ i├žin ayarland─▒.

├ľrnek 1 - Amerika Birle┼čik Devletleri numara s├Âzle┼čmeleri

Amerika Birle┼čik Devletleri ve ─░ngiltere'de, virg├╝l, binlik ay─▒r─▒c─▒ olarak kullan─▒labilir. Amerikan yerel ayar─▒nda bu ├Ârnekte, virg├╝l ay─▒r─▒c─▒ olarak do─čru bir ┼čekilde kullan─▒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
>>>
 

├ľrnek 2 - Avrupa numara s├Âzle┼čmeleri

D├╝nya ├╝lkelerinin ├žo─čunda virg├╝l, d├Ânemler yerine ondal─▒k i┼čaretleri i├žin kullan─▒l─▒r. Frans─▒z yerel ayar─▒nda bu ├Ârnekte, virg├╝l, ondal─▒k i┼čareti olarak do─čru ┼čekilde i┼členir:

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

Bu y├Ântem locale.atoi de mevcuttur, ancak arg├╝man bir tamsay─▒ olmal─▒d─▒r.


61







├ť├ž├╝nc├╝ taraf mod├╝llere kar┼č─▒ de─čilseniz, fastnumbers mod├╝l├╝n├╝ kontrol edebilirsiniz . Fast_real ad─▒nda ve bu soruyu tam olarak ne istiyorsa yapan ve saf Python uygulamas─▒ndan daha h─▒zl─▒ yapan bir i┼člev sunar :

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

25







Kullan─▒c─▒lar codelogic ve Harley do─čru, ama sen dize bir tam say─▒d─▒r biliyorsan─▒z ak─▒lda tutmak (├Ârne─čin, 545) E─čer ┼čamand─▒ra ilk d├Âk├╝m olmadan int ( "545") ├ža─č─▒rabilir.

Dizeleriniz listede ise, harita i┼člevini de kullanabilirsiniz.

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

Sadece hepsi ayn─▒ tipse iyi olur.


24


2008-12-19





Soru biraz eski g├Âr├╝n├╝yor. Ancak, bir i┼člevi ├Ânereyim, benzer bir ┼čey yapan parseStr, yani tamsay─▒y─▒ ya da y├╝zmeyi d├Ând├╝r├╝r ve verilen bir ASCII dizgisi hi├žbirine ├ževrilemezse dokunulmam─▒┼č olarak d├Ând├╝r├╝r. Elbette kodu yaln─▒zca istedi─činizi yapacak ┼čekilde ayarlanm─▒┼č olabilir:

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

19







Python'da "545.2222" gibi bir say─▒sal dizgiyi 542.2222 kar┼č─▒l─▒k gelen de─či┼čken de─čerine nas─▒l b├Âlebilirim? Veya "31" dizesini bir tamsay─▒ya, 31? Sadece bir kayan dizgiyi bir kayan noktaya ve (ayr─▒ca) bir int dizgisine bir int'ye nas─▒l ├ž├Âz├╝mleyece─čimi bilmek istiyorum.

Bunlar─▒ ayr─▒ ayr─▒ yapmak istemeniz iyi bir ┼čey. Onlar─▒ kar─▒┼čt─▒r─▒yorsan─▒z, daha sonra sorunlar i├žin kendinizi ayarlam─▒┼č olabilirsiniz. Basit cevap:

"545.2222" Batmak:

 >>> float("545.2222")
545.2222
 

"31" bir tam say─▒ya:

 >>> int("31")
31
 

Dizgiler ve de─či┼čmezlerden gelen ve gelen di─čer d├Ân├╝┼čt├╝rmeler:

├çe┼čitli tabanlardan d├Ân├╝┼č├╝mler ve ├╝ss├╝ ├Ânceden bilmeniz gerekir (10 varsay─▒land─▒r). Bunlar─▒ Python'un haz─▒r bilgileri i├žin bekledi─či ┼čeylerle ├Ânekleyebilirsiniz (a┼ča─č─▒ya bak─▒n─▒z) veya ├Âneki kald─▒rabilirsiniz:

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

Taban─▒ ├Ânceden bilmiyorsan─▒z, ancak do─čru ├Ânekleri olaca─č─▒n─▒ biliyorsan─▒z, ├╝s olarak ge├žerseniz Python sizin i├žin ├ž─▒kartabilir 0 :

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

Ondal─▒k Olmayan (yani Tamsay─▒l─▒) Di─čer Temellerden Haz─▒rlananlar

Motivasyonunuz kendi kodunuzun a├ž─▒k├ža kodlanm─▒┼č belirli de─čerleri temsil etmesiyse, ├╝slerden d├Ân├╝┼čt├╝rmeniz gerekmeyebilir - Python'un sizin i├žin do─čru s├Âzdizimi ile otomatik olarak yapmas─▒na izin verebilirsiniz.

A┼ča─č─▒daki haz─▒rlay─▒c─▒larla tamsay─▒lara otomatik d├Ân├╝┼č├╝m elde etmek i├žin apropos ├Âneklerini kullanabilirsiniz . Bunlar Python 2 ve 3 i├žin ge├žerlidir:

─░kili, ├Ân ek 0b

 >>> 0b11111
31
 

Sekizli, ├Ân ek 0o

 >>> 0o37
31
 

Onalt─▒l─▒k, ├Ânek 0x

 >>> 0x1f
31
 

Bu, ikili bayraklar, koddaki dosya izinleri veya renkler i├žin onalt─▒l─▒k de─čerler tan─▒mlan─▒rken faydal─▒ olabilir - ├Ârne─čin, al─▒nt─▒ yap─▒lmayaca─č─▒na dikkat edin:

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

Belirsiz Python 2 sekizliklerinin Python 3 ile uyumlu hale getirilmesi

0 ile ba┼člayan bir tamsay─▒ g├Âr├╝rseniz, Python 2'de bu (kullan─▒mdan kald─▒r─▒lm─▒┼č) sekizlik s├Âzdizimidir.

 >>> 037
31
 

K├Ât├╝ ├ž├╝nk├╝ de─čer olmas─▒ gerekti─či gibi g├Âr├╝n├╝yor 37 . Yani Python 3'te, ┼čimdi bir y├╝kseltir SyntaxError :

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

Python 2 octallar─▒n─▒z─▒ hem 2 hem de 3'te ├žal─▒┼čan ve ┼ču 0o ├Ânekle ├žal─▒┼čan octallara d├Ân├╝┼čt├╝r├╝n :

 >>> 0o37
31
 

19







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


16







YAML ayr─▒┼čt─▒r─▒c─▒ E─čer veri t├╝r├╝ dize oldu─čunu anlamaya yard─▒mc─▒ olabilir. Kullan─▒n yaml.load() ve sonra type(result) t├╝r├╝n├╝ s─▒namak i├žin kullanabilirsiniz :

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


2013-04-16





Bunun i├žin bu i┼člevi kullan─▒yorum

 import ast

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

Dizeyi t├╝r├╝ne d├Ân├╝┼čt├╝r├╝r

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

13







 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







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

9







Bunu d├╝zg├╝n bir ┼čekilde yapmak i├žin yuvarlamay─▒ dikkate alman─▒z gerekir.

Yani int (5.1) => 5 int (5.6) => 5 - yanl─▒┼č, 6 olmal─▒, int (5.6 + 0.5) => 6

 def convert(n):
    try:
        return int(n)
    except ValueError:
        return float(n + 0.5)
 

6


2010-10-21





Regex'ten hi├ž kimsenin bahsetmedi─čine ┼ča┼č─▒rd─▒m ├ž├╝nk├╝ bazen sicim numaraya bas─▒lmadan ├Ânce haz─▒rlanmal─▒ ve normalle┼čtirilmelidir.

 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
 

kullan─▒m─▒:

 parseNumber('13,345')
> 13345.0

parseNumber('- 123 000')
> -123000.0

parseNumber('99999\n')
> 99999.0
 

ve bu arada, numaran─▒z─▒n oldu─čunu do─črulayacak bir ┼čey var:

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

5







Python'da typecast yapmak i├žin, t├╝r├╝n yap─▒c─▒ i┼člevlerini kullan─▒n, dizgiyi (veya ne t├╝r bir de─čer vermeye ├žal─▒┼č─▒rsan─▒z) bir parametre olarak ge├žirin.

├ľrne─čin:

 >>>float("23.333")
   23.333
 

Sahnelerin arkas─▒nda, python __float__ parametrenin float g├Âsterimini d├Ând├╝rmesi gereken nesneleri y├Ântemini ├ža─č─▒r─▒r . Bu ├Âzellikle g├╝├žl├╝d├╝r, ├ž├╝nk├╝ kendi t├╝rlerinizi (s─▒n─▒flar─▒ kullanarak) bir __float__ y├Ântemle float (myobject) kullanarak bir y├╝zgecin i├žine d├Âk├╝lecek ┼čekilde tan─▒mlayabilirsiniz.


5







Bu d├╝zeltilmi┼č bir versiyonu aras─▒nda https://stackoverflow.com/a/33017514/5973334

Bu bir dizgeyi ayr─▒┼čt─▒rmaya ya int da float dizgenin neyi temsil etti─čine ba─čl─▒ olarak ya geri d├Ând├╝rmeye ├žal─▒┼č─▒r . Ayr─▒┼čt─▒rma istisnalar─▒ ortaya ├ž─▒kabilir veya beklenmeyen davran─▒┼člarda bulunabilir .

   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







kullan─▒n:

 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, bulabildi─čim en Pythonic yol.


1







kullan─▒n:

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







Bu, verilen as─▒l dizginin ya da benzemesine ba─čl─▒ olarak object (sadece de─čil str ) int ya da ya d├Ân├╝┼čt├╝recek bir i┼člevdir . Ayr─▒ca, her ikisi de ve y├Ântemleri olan bir nesne ise , kullanmaya varsay─▒lan float int float __float __int__ __float__

 def conv_to_num(x, num_type='asis'):
    '''Converts an object to a number if possible.
    num_type: int, float, 'asis'
    Defaults to floating point in case of ambiguity.
    '''
    import numbers

    is_num, is_str, is_other = [False]*3

    if isinstance(x, numbers.Number):
        is_num = True
    elif isinstance(x, str):
        is_str = True

    is_other = not any([is_num, is_str])

    if is_num:
        res = x
    elif is_str:
        is_float, is_int, is_char = [False]*3
        try:
            res = float(x)
            if '.' in x:
                is_float = True
            else:
                is_int = True
        except ValueError:
            res = x
            is_char = True

    else:
        if num_type == 'asis':
            funcs = [int, float]
        else:
            funcs = [num_type]

        for func in funcs:
            try:
                res = func(x)
                break
            except TypeError:
                continue
        else:
            res = x
 

0







─░┼čte sorunuzun ba┼čka bir yorumu: (ipucu: belirsiz). Bunun gibi bir ┼čey ar─▒yor olabilirsiniz:

 def parseIntOrFloat( aString ):
    return eval( aString )
 

Bu gibi ├žal─▒┼č─▒r ...

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

Teorik olarak, bir enjeksiyon k─▒r─▒lganl─▒─č─▒ var. Dize, ├Ârne─čin olabilir "import os; os.abort()" . ─░pin nereden geldi─čine dair herhangi bir arka plan olmadan, olas─▒l─▒k teorik spek├╝lasyondur. Soru belirsiz oldu─čundan, bu g├╝venlik a├ž─▒─č─▒n─▒n ger├žekten var olup olmad─▒─č─▒ hi├ž belli de─čil.


-10



─░lgili yay─▒nlar


JavaScript'te bir kayan say─▒y─▒ tam say─▒ya nas─▒l d├Ân├╝┼čt├╝rebilirim?

java: float'─▒ String'e ├ževirir, float'─▒ String'e ├ževirir

┼×amand─▒ray─▒ floattaki iki ondal─▒k basama─ča nas─▒l yuvarlars─▒n─▒z?

Kayan PHP Dize

Bir DataFrame'deki dizeleri kayan noktalara d├Ân├╝┼čt├╝rme

Dize d├Ân├╝┼čt├╝rme Apple'─▒n Swift i├žinde y├╝zer

bir float'─▒ maks / min de─čerine nas─▒l ba┼člatabilirim?

Dize C# i├žinde Float d├Ân├╝┼čt├╝rme

std :: string y├╝zer veya ├žift

Elixir dizgesini tamsay─▒ya veya kayd─▒rmaya d├Ân├╝┼čt├╝r

Etiketle ilgili di─čer sorular [python]


JavaScript'i kullanarak sayfan─▒n en ├╝st├╝ne mi ilerleyin?

─░nit ile olu┼čturulan bir git havuzunu nas─▒l tamamen silebilirim?

Builder Design pattern ile Factory Design pattern aras─▒ndaki fark nedir?

JSON String'deki ─░kili Veriler. Base64'ten daha iyi bir ┼čey

RGB'den Hex'e ve Hex'den RGB'ye

Bir iphone uygulamas─▒n─▒ nas─▒l beta test edersiniz?

Neden fragmanlar ve etkinlikler yerine fragmanlar ne zaman kullan─▒lmal─▒?

Jssery kullanarak css g├Âr├╝nt├╝leme hi├žbirini veya engelleme ├Âzelli─čini nas─▒l de─či┼čtirebilirim?

Python beti─činin s├Âzdizimini ├žal─▒┼čt─▒rmadan nas─▒l kontrol edebilirim?

├ľny├╝kleme kipinde g├Âm├╝l├╝ oldu─čunda Select2 ├žal─▒┼čm─▒yor