AttributeError: 'str' object has no attribute 'isnumeric'

后端 未结 1 755
野趣味
野趣味 2020-12-22 00:16

Slightly confused as I\'m positive I\'ve had this working before.

I\'ve created the following method...

def p2f(x):
    if x.strip(\'%\').isnumeric():
         


        
相关标签:
1条回答
  • 2020-12-22 00:46

    str.isnumeric() is only available on Python 3. The error indicates you are using Python 2 instead, where only unicode.isnumeric() exists.

    You should really use str.isdecimal(), or better yet, use exception handling:

    def p2f(x):
        try:
            return float(x.strip('%'))/100
        except ValueError:
            return 0.0 if x in ('SUPP', 'NEW', 'LOWCOV', 'NA', '') else x
    

    .isnumeric() matches 430 Unicode codepoints in the BMP that float() won't accept, and there are codepoints that .isdigit() returns true for that are also not convertible.

    You can generate your own table to check with:

    for i in range(2 ** 16):
        c = chr(i)
        if c.isnumeric() or c.isdigit() or c.isdecimal():
            try:
                f = float(c)
            except ValueError:
                f = '<not convertible>'
            di, de, nu = ('\u2705' if test() else '\u274c' for test in (c.isdigit, c.isdecimal, c.isnumeric))
            print(f'{c!a:<6} {c}\tdigit: {di}   decimal: {de}   numeric: {nu}  float: {f}')
    

    which produces output like:

    '0'    0    digit: ✅   decimal: ✅   numeric: ✅  float: 0.0
    '1'    1    digit: ✅   decimal: ✅   numeric: ✅  float: 1.0
    '2'    2    digit: ✅   decimal: ✅   numeric: ✅  float: 2.0
    '3'    3    digit: ✅   decimal: ✅   numeric: ✅  float: 3.0
    '4'    4    digit: ✅   decimal: ✅   numeric: ✅  float: 4.0
    '5'    5    digit: ✅   decimal: ✅   numeric: ✅  float: 5.0
    '6'    6    digit: ✅   decimal: ✅   numeric: ✅  float: 6.0
    '7'    7    digit: ✅   decimal: ✅   numeric: ✅  float: 7.0
    '8'    8    digit: ✅   decimal: ✅   numeric: ✅  float: 8.0
    '9'    9    digit: ✅   decimal: ✅   numeric: ✅  float: 9.0
    '\xb2' ²    digit: ✅   decimal: ❌   numeric: ✅  float: <not convertible>
    '\xb3' ³    digit: ✅   decimal: ❌   numeric: ✅  float: <not convertible>
    '\xb9' ¹    digit: ✅   decimal: ❌   numeric: ✅  float: <not convertible>
    '\xbc' ¼    digit: ❌   decimal: ❌   numeric: ✅  float: <not convertible>
    '\xbd' ½    digit: ❌   decimal: ❌   numeric: ✅  float: <not convertible>
    '\xbe' ¾    digit: ❌   decimal: ❌   numeric: ✅  float: <not convertible>
    

    and you'll find that only the decimal column has crosses for all non-convertible codepoints.

    If you want to use isdecimal() in Python 2, you'd have to decode your bytestring to Unicode first.

    0 讨论(0)
提交回复
热议问题