Python将值清除为int

Python将值清除为int,python,int,Python,Int,JSON端点返回我想要转换为整数以保存在DB(mysql)中的值 这些值可以以下列格式返回: 十万 十万 10万 十万 100000.00 100000.00 100.000,00 100000.00 不适用 我是python新手,不知道如何处理每种情况。我试过: int(value) if value != 'N/A' else None 它处理N/A,但抛出ValueError:invalid literal for int() local.atoi(value) if value !

JSON端点返回我想要转换为整数以保存在DB(mysql)中的值

这些值可以以下列格式返回:

  • 十万
  • 十万
  • 10万
  • 十万
  • 100000.00
  • 100000.00
  • 100.000,00
  • 100000.00
  • 不适用
我是python新手,不知道如何处理每种情况。我试过:

int(value) if value != 'N/A' else None
它处理N/A,但抛出
ValueError:invalid literal for int()

local.atoi(value) if value != 'N/A' else None
使用逗号处理所有值,但对于任何带浮点或带句点(而不是逗号作为千位分隔符)的对象,都会抛出一个
ValueError:invalid literal for int(),以10为基数:


如何捕获并清除所有整数格式?

棘手的部分似乎是区分小数点和千位分隔符,因为有些数字似乎对这两种格式都使用了
。但是看起来数字要么有零位,要么有两位小数,所以我们可以用这个方法去掉小数部分(不管怎样,
int
都不需要小数部分)

之后,只需删除任何非数字字符并转换为
int

>>> [int(re.sub(r"[ ,.]", "", n)) for n in _]
[100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000]
只需将那些执行
re.sub
操作的操作包装到一个函数中,并使用
if
检查
N/a


如果您知道这些数字的区域设置,还可以尝试
locale
babel
模块:

>>> import babel.numbers
>>> babel.numbers.parse_decimal("100,000.000", "en")
Decimal('100000.000')
>>> babel.numbers.parse_decimal("100,000.000", "de")
Decimal('100.000000')

这些返回的是
十进制
数字,可以轻松转换为
int
。如果您不知道区域设置,也不能保证小数位数的固定/最大值,我看不出您如何确定例如
100.000
应该是
100
还是
100000

您可以先删除所有字符,如空格和逗号,然后作为
float
进行解析(对于非
N/A
)的值:

在这之后,如何处理产生的
float
取决于您。如果您相信该数字始终是整数,请直接将其转换为:

i = int(f)
如果您不信任输入,请先检查它是否为整数(但过程基本上是相同的):


您必须手动对此进行分析以消除歧义。例如,在
100000
中,逗号是否可以表示小数点?一些国家使用逗号而不是小数点

这到底意味着什么:
100.000.00

如果可以假定没有逗号是小数点,并且可以忽略多个点,则可以尝试以下操作: def fitler_na(值): 返回值.lower().replace('n/a')

然后,您可以将过滤器列表应用于您的值:

values = ['100,000', '100,000.00', '100 000.00', '100.500.000', 'N/A']
for idx, value in enumerate(values):
    for f in filters:
        values[idx] = f(values[idx])
    values[idx] = round(values[idx])

传递给python的JSON是什么类型的?数字是用逗号分隔的,小数部分总是用句点分隔的,还是您需要了解区域设置?那么,
100.000
应该是
100
还是
100000
?那么
100.000.00
呢?坦率地说,这种格式很糟糕。好吧,实际上……我会吗你介意把你所有的例子都放到一个代码块中,格式是
input==>output
?你…实际上不知道给定的值应该映射到什么?这很简单,但是你忘了考虑可能的值'N/a'@JakobLovern,这正是我没有提到它的原因。唯一的方法是用一个显式的If/else,这是OP已经做过的。小数点可以有任意数量,对不起,我只是用了两个作为一个数字example@WindDude那么,你怎么知道
100.000
应该是什么呢?这是事实,我无法100%确定地知道100.000的值应该是什么。这可能是我如此困惑的部分原因,因为ale.atoi或locale.atof需要在浮点的int中传递,因此我一直在研究如何首先一致地将其解析为int或float。我认为我在100.000.00中犯了一个错误,它应该是100.000,00,我已经更新了我的原始问题以反映相同的差异。对于每种可能的情况,您仍然必须明确地决定使用哪个c字符表示小数点,而不是小数点。如果逗号是小数点,在转换或舍入为int之前,必须将其替换为“.”。
i = int(f)
i = int(f)
if i != f:
    # Handle the error
def filter_spaces(value):
    return value.replace(' ')

def filter_commas(value):
    return value.replace(',', '')

def filter_multiple_points(value):
    if value.count('.') > 1:
        return value.replace('.', '')
    else:
        return value

filters = [filter_na, filter_spaces, filter_commas, filter_multiple_points]
values = ['100,000', '100,000.00', '100 000.00', '100.500.000', 'N/A']
for idx, value in enumerate(values):
    for f in filters:
        values[idx] = f(values[idx])
    values[idx] = round(values[idx])