Python将值清除为int
JSON端点返回我想要转换为整数以保存在DB(mysql)中的值 这些值可以以下列格式返回: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 !
- 十万
- 十万
- 10万
- 十万
- 100000.00
- 100000.00
- 100.000,00
- 100000.00
- 不适用
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])