2009-02-23 46 views
17

Cách dễ dàng trong Python để định dạng số nguyên thành chuỗi biểu thị hàng nghìn với K và hàng triệu bằng M và chỉ để lại vài chữ số sau dấu phẩy là gì?định dạng số dài dưới dạng chuỗi trong python

Tôi muốn hiển thị 7436313 là 7.44M và 2345 là 2,34K.

Có một số toán tử định dạng chuỗi% có sẵn cho điều đó không? Hoặc điều đó có thể được thực hiện chỉ bằng cách thực sự chia cho 1000 trong một vòng lặp và xây dựng chuỗi kết quả từng bước?

Trả lời

34

Tôi không nghĩ rằng có một built- trong hàm thực hiện điều đó. Bạn sẽ phải cuộn của riêng bạn, ví dụ:

def human_format(num): 
    magnitude = 0 
    while abs(num) >= 1000: 
     magnitude += 1 
     num /= 1000.0 
    # add more suffixes if you need them 
    return '%.2f%s' % (num, ['', 'K', 'M', 'G', 'T', 'P'][magnitude]) 

print('the answer is %s' % human_format(7436313)) # prints 'the answer is 7.44M' 
+0

999999 màn 1000.00K khi nó nên nói 1M. – rtaft

0

Không có toán tử định dạng chuỗi, according to the docs. Tôi đã không bao giờ nghe nói về một điều như vậy, vì vậy bạn có thể phải cuộn của riêng bạn, như bạn đề nghị.

0

Tôi không nghĩ có toán tử định dạng cho điều đó, nhưng bạn có thể chỉ cần chia cho 1000 cho đến khi kết quả nằm trong khoảng từ 1 đến 999 và sau đó sử dụng chuỗi định dạng cho 2 chữ số sau dấu phẩy. Đơn vị là một ký tự đơn (hoặc có thể là một chuỗi nhỏ) trong hầu hết các trường hợp, mà bạn có thể lưu trữ trong một chuỗi hoặc mảng và lặp qua nó sau mỗi lần chia.

0

tôi cần chức năng này ngày hôm nay, làm mới câu trả lời chấp nhận một chút cho những người có Python> = 3.6:

def human_format(num, precision=2, suffixes=['', 'K', 'M', 'G', 'T', 'P']): 
    m = sum([abs(num/1000.0**x) >= 1 for x in range(1, len(suffixes))]) 
    return f'{num/1000.0**m:.{precision}f}{suffixes[m]}' 

print('the answer is %s' % human_format(7454538)) # prints 'the answer is 7.45M' 

Edit: cho ý kiến , bạn có thể muốn thay đổi để round(num/1000.0)

+0

999999 hiển thị 1000.00K khi cần nói 1M. – rtaft

1

Một giải pháp nữa "toán học-y" là sử dụng math.log:

from math import log, floor 


def human_format(number): 
    units = ['', 'K', 'M', 'G', 'T', 'P'] 
    k = 1000.0 
    magnitude = int(floor(log(number, k))) 
    return '%.2f%s' % (number/k**magnitude, units[magnitude]) 

Kiểm tra:

>>> human_format(123456) 
'123.46K' 
>>> human_format(123456789) 
'123.46M' 
>>> human_format(1234567890) 
'1.23G' 
+0

999999 hiển thị 1000.00K khi cần nói 1M. – rtaft

5

Phiên bản này không bị lỗi trong câu trả lời trước, nơi 999,999 cung cấp cho bạn 1000.0K. Nó cũng chỉ cho phép 3 con số đáng kể và loại bỏ dấu 0.

def human_format(num): 
    num = float('{:.3g}'.format(num)) 
    magnitude = 0 
    while abs(num) >= 1000: 
     magnitude += 1 
     num /= 1000.0 
    return '{}{}'.format('{:f}'.format(num).rstrip('0').rstrip('.'), ['', 'K', 'M', 'B', 'T'][magnitude]) 

Kết quả trông giống như:

>>> human_format(999999) 
'1M' 
>>> human_format(999499) 
'999K' 
>>> human_format(9994) 
'9.99K' 
>>> human_format(9900) 
'9.9K' 
>>> human_format(6543165413) 
'6.54B' 
+0

đây là phiên bản duy nhất hoạt động hoàn hảo cho tôi (không có dấu 0 gây phiền nhiễu) –

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