2017-04-18 24 views
9

Có cách nào ngắn gọn để định dạng một số, đôi khi cũng có thể là một chuỗi không?giá trị định dạng có thể là số và/hoặc chuỗi trong python 3

Số thường sẽ là phao, nhưng đôi khi nó cũng được biểu thị dưới dạng chuỗi "n/a".

Tôi muốn định dạng phao bằng số thập phân cố định, nhưng in toàn bộ chuỗi trong trường hợp nó không phải là số.

Ví dụ:

var=3.145623 
print("This is {0:.2f}".format(var)) 

>>>This is 3.14 

, nhưng

var = "n/a" 
print("This is {0:.2f}".format(var)) 

>>> File "<stdin>", line 1, in <module> 
>>> ValueError: Unknown format code 'f' for object of type 'str' 

Tôi không ngạc nhiên bởi ValueError, nhưng tự hỏi, nếu có một cách súc tích xung quanh nó, tốt nhất là không có rõ ràng nếu-tuyên bố.

+0

Nó có vẻ như sử dụng một rõ ràng 'nếu-else' là cách đơn giản nhất ... Đây là vấn đề bạn nhận được khi bạn đối phó với các loại hỗn hợp và lý do bạn nên tránh khi có thể. –

+0

@ juanpa.arrivillaga: Tôi chỉ mặc dù tôi đã bỏ lỡ một chuyển đổi trong .format() hoặc một cái gì đó - với tôi có vẻ như đây sẽ là một vấn đề mà mọi người có thể chạy vào khá thường xuyên và do đó có thể có một cái gì đó tích hợp sẵn .. – Gerhard

+0

Tôi có thể hỏi, tại sao bạn có thể nhận được 'float' hoặc chuỗi' "n/a" '? Có vẻ như đó là vấn đề thực sự. –

Trả lời

4

Python hỗ trợ không phải là số như float('nan') và nó có thể hữu ích hơn chuỗi "n/a" trong mã của bạn. Nó hoạt động với định dạng và tạo ra nhiều kết quả lành mạnh hơn một chuỗi nếu bạn sử dụng nó trong tính toán.

NaN:

>>> n = float('nan') 
>>> n 
nan 
>>> "{0:.2f}".format(n) 
'nan' 
>>> n == 3 
False 
>>> n * 2 
nan 
>>> n < 5 
False 

String:

>>> n = 'n/a' 
>>> "{0:.2f}".format(n) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: Unknown format code 'f' for object of type 'str' 
>>> n == 3 
False 
>>> n * 2 
'n/an/a' 
>>> n < 5 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: str() < int() 
+0

Đây là những gì tôi đã kết thúc bằng cách sử dụng cuối cùng - chuyển đổi "n/a" -giá trị thành "nan". – Gerhard

6

Thật vậy, chỉ định định dạng f chỉ hoạt động trên giá trị thực tế float. Bạn không thể tránh phải đặt biệt giá trị n/a của mình.

Bạn có thể định dạng phao riêng, và có điều kiện, sau đó suy kết quả vào mẫu lớn:

var_formatted = format(var, '.2f') if var != 'n/a' else var 
print("This is {0:4}".format(var_formatted)) 

Nếu bạn thực sự không thích if, bạn có thể sử dụng ngoại lệ xử lý quá:

try: 
    var_formatted = format(var, '.2f') 
except ValueError: 
    var_formatted = 'n/a' 
print("This is {0:4}".format(var_formatted)) 

Một tùy chọn khác là để bạn quấn giá trị trong một lớp học với phương thức __format__:

class OptionalFloat(object): 
    def __init__(self, value): 
     self.value = value 
    def __format__(self, fmt): 
     try: 
      return self.value.__format__(fmt) 
     except ValueError: 
      return self.value 

print("This is {0:.2f}".format(OptionalFloat(var))) 

này di chuyển yêu cầu để phát hiện các loại vào một phương pháp lớp học, giữ mã đầu ra của bạn một chút bụi và miễn phí của tất cả những điều kiện pesky hoặc xử lý ngoại lệ:

>>> var = 3.145623 
>>> print("This is {0:.2f}".format(OptionalFloat(var))) 
This is 3.15 
>>> var = 'n/a' 
>>> print("This is {0:.2f}".format(OptionalFloat(var))) 
This is n/a 
1

có lẽ một cái gì đó như thế này

str = "{0:.2f}".format(var) if isinstance(var, float) else var 
print(str) 
Các vấn đề liên quan