如何在Python中使用逗号和指定精度数字格式化数字

如何在Python中使用逗号和指定精度数字格式化数字,python,number-formatting,string-formatting,Python,Number Formatting,String Formatting,问题是Python2.6,这就是我们在生产中所拥有的 我需要用逗号格式化数字(如1234567.0987或1234567.0),并在小数点后指定位数。因此,如果精度为3,1234567.0987可能看起来像1234567.099 正如许多问题的答案所建议的那样,我尝试使用Locale,问题是小数点后会出现两位数字,这对于我的要求是不可接受的 我尝试在其他地方搜索,但没有找到任何解决方案,最后我自己创建了一个方法: def format_float(value, precision = 4):

问题是Python2.6,这就是我们在生产中所拥有的

我需要用逗号格式化数字(如1234567.0987或1234567.0),并在小数点后指定位数。因此,如果精度为3,1234567.0987可能看起来像1234567.099

正如许多问题的答案所建议的那样,我尝试使用Locale,问题是小数点后会出现两位数字,这对于我的要求是不可接受的

我尝试在其他地方搜索,但没有找到任何解决方案,最后我自己创建了一个方法:

def format_float(value, precision = 4):
    formatString = "%0." + str(precision) + "f"    
    str_val =  formatString % value
    first, second = str_val.split('.')
    first = int(first)
    group = []
    while True:
        result, mod = first / 1000, first % 1000
        group.append(str(mod))
        if result == 0:
            break
        first = result
    group.reverse() 
    return ','.join(group) + '.' + second
我尝试运行一些测试来测试该方法,但效果良好:

# default 4 digits precision
assert format_float(1234567890.0876543) == '1,234,567,890.0877'
assert format_float(1.2) == '1.2000'
assert format_float(1234) == '1,234.0000'
assert format_float(0) == '0.0000'

# 3 digits precision
assert format_float(1234567890.0876543, precision=3) == '1,234,567,890.088'
assert format_float(0, precision=3) == '0.000'
作为Python新手,我的问题是这是否是一个可接受的解决方案。由于这种格式化必须在一个紧凑的for循环中进行多次,如果有人能指出更好的解决方案,我将不胜感激


感谢并感谢Python 2.7和3.x中的所有

,您可以使用
str.format
实现以下目的:

>>> num = 1234567890.0876543
>>> "{0:,f}".format(num)
'1,234,567,890.087654'
>>> "{0:,.2f}".format(num)
'1,234,567,890.08'
>>> "{0:,f}".format(1234)
'1,234.000000'

我认为您对区域设置模块的研究不够深入。是您想要的,但请确保您首先设置了区域设置,否则您将根本无法获得分组

>>> locale.setlocale(locale.LC_ALL, '')
'en_US.UTF-8'
>>> locale.format("%.4f", 12345.678912, grouping=True)
'12,345.6789'

马克,谢谢你。这是一个很好的bug,我需要修复它。您不必使用
locale
模块。看看我对这个问题的回答。马丁,谢谢。我对你的答案投了赞成票。但是,您的答案适用于v2.7,我使用的是2.6,该选项对我不可用。@Krativitea刚刚在线检查过,确实如此。我只在Python2.6上试过,但它不起作用。不过,谢谢,我编辑了我原来的问题,即这个问题是针对Python2.6的。@cdhowie,谢谢,这对我来说很有效,即使是使用。我忽略了format()选项。