2012-10-10 78 views
6

Câu hỏi đặt ra cho Python 2.6, đó là những gì chúng tôi có trong quá trình sản xuất.Cách định dạng số bằng dấu phẩy và các chữ số chính xác được chỉ định trong Python

Tôi có yêu cầu này để định dạng một số (như 1234567.0987 hoặc 1234567.0) bằng dấu phẩy và số chữ số được chỉ định sau dấu thập phân. Vì vậy, nếu độ chính xác là ba, 1234567.0987 có thể trông giống như 1,234,567.099.

Tôi đã thử sử dụng Locale, như được đề xuất bằng câu trả lời cho nhiều câu hỏi, vấn đề là kết quả bằng hai chữ số sau dấu thập phân, không được chấp nhận theo yêu cầu của tôi.

tôi đã cố gắng tìm kiếm ở những nơi khác, nhưng không tìm thấy bất kỳ giải pháp, và cuối cùng tôi đã tạo ra một phương pháp bằng cách riêng của tôi:

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 

Tôi cố gắng để chạy một số xét nghiệm để kiểm tra phương pháp này và nó hoạt động tốt :

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

Mới sử dụng Python, câu hỏi của tôi là đây có phải là giải pháp có thể chấp nhận hay không. Vì định dạng này phải được thực hiện nhiều lần trong một vòng lặp chặt chẽ, tôi sẽ đánh giá cao nếu ai đó có thể trỏ đến một giải pháp tốt hơn.

Cảm ơn và chúc cho tất cả

+2

Hãy thử với '1000000'. –

+0

Đánh dấu, Cảm ơn bạn. Đó là một lỗi tốt ngay tại đó, tôi cần phải sửa lỗi này. – cspider

+1

Bạn không phải sử dụng mô-đun 'locale'. Xem câu trả lời của tôi cho câu hỏi [Cách nào dễ nhất để thêm dấu phẩy vào một số nguyên trong Python? _] (Http://stackoverflow.com/q/3909457/355230). – martineau

Trả lời

18

Tôi không nghĩ rằng bạn nhìn đủ sâu vào các mô-đun locale. locale.format() là những gì bạn muốn, nhưng hãy đảm bảo bạn đặt ngôn ngữ trước tiên hoặc bạn sẽ không nhận được nhóm nào cả.

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

nhận biết miền địa phương FTW ... –

+1

+1 không bao giờ biết về mô-đun 'locale'. –

+0

@cdhowie, Cảm ơn bạn, điều này làm việc cho tôi, ngay cả với. Tôi đã lướt qua tùy chọn format(). – cspider

12

cho python 2.7 và 3.x bạn có thể làm một cái gì đó như:

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

Ah, đánh tôi với nó. Ngẫu nhiên, điều này cũng hoạt động trong 2.7.3 – kreativitea

+0

@kreativitea Chỉ cần kiểm tra nó trực tuyến nó. Tôi đã thử nó chỉ trên python 2,6, nơi nó không hoạt động. –

+0

Cảm ơn, tuy nhiên, tôi đã chỉnh sửa câu hỏi ban đầu của tôi, rằng câu hỏi này cho Python 2.6. – cspider

Các vấn đề liên quan