Trường mô hình django tốt nhất để sử dụng để biểu thị số lượng đô la Mỹ là gì?


103

Tôi cần lưu trữ một số tiền đô la Mỹ trong một lĩnh vực của mô hình Django. Loại trường mô hình tốt nhất để sử dụng là gì? Tôi cần có thể yêu cầu người dùng nhập giá trị này (với tính năng kiểm tra lỗi, chỉ muốn một số chính xác đến xu), định dạng nó để xuất cho người dùng ở những nơi khác nhau và sử dụng nó để tính các số khác.

Câu trả lời:


166

Trường thập phân là lựa chọn phù hợp cho giá trị tiền tệ.

Nó sẽ giống như sau:

credit = models.DecimalField(max_digits=6, decimal_places=2)

98
Trừ khi bạn muốn đại diện cho nợ quốc gia, trong đó trường hợp max_digits phải là> 20
Bron Davies

4
decimal_places = 2 không nhất thiết chính xác nếu bạn cần điều này để hỗ trợ các loại tiền tệ khác. Một số đồng tiền có ba chữ số thập phân, và Bitcoin có gà 8.
Lie Ryan

2
Tôi nghĩ ví dụ này gần như đúng với tất cả các loại tiền tệ. Để biểu thị tiền tệ dưới dạng Bitcoin, tôi nghĩ tốt hơn nhiều nên sử dụng trường số nguyên để lưu số tiền bằng satoshi và sau đó hiển thị nó cho người dùng cuối cùng trong biểu tượng mà bạn muốn (BTC, mBTC, v.v.)
jion

Trừ khi bạn muốn đại diện cho nợ quốc gia của Venezuela, trong tiền tệ quốc gia Venezuela, vào trường hợp này bạn cần 21 max_digits
Luis Sieira

@LieRyan đó là sự thật. Chúng tôi phải lưu ý các loại "tiền tệ" hiện đại để ngăn chặn bất kỳ sửa đổi db nào trong tương lai. Không vi phạm việc sử dụng các dấu ngoặc kép.
mê hoặc


35

Các câu trả lời khác đúng 100% nhưng không thực tế lắm vì bạn sẽ vẫn phải quản lý đầu ra, định dạng, v.v. theo cách thủ công.

Tôi sẽ đề xuất sử dụng django-money :

from djmoney.models.fields import MoneyField
from django.db import models


def SomeModel(models.Model):
    some_currency = MoneyField(
        decimal_places=2,
        default=0,
        default_currency='USD',
        max_digits=11,
    )

Hoạt động tự động từ các mẫu:

{{ somemodel.some_currency }}

Đầu ra:

$123.00

Nó có một chương trình phụ trợ mạnh mẽ thông qua python-money và về cơ bản nó là một phần mềm thay thế cho các trường thập phân tiêu chuẩn.


(với tính năng kiểm tra lỗi, chỉ muốn một số chính xác đến xu), định dạng nó để xuất cho người dùng ở những nơi khác nhau và sử dụng nó để tính toán các số khác. Đối với những trường hợp như vậy, việc sử dụng DecimalFieldlà thực tế hơn. Và tôi tin rằng nó được áp dụng cho hầu hết mọi người. Sử dụng django-moneynhư họ đã đánh dấu, bao gồm Xử lý tiền tệ . Vì vậy, điều này nhiều hơn cho dự án liên quan đến giao dịch như trang web thương mại điện tử, cổng thanh toán, tiền tệ kỹ thuật số, ngân hàng, v.v.
Yeo

Tôi tranh luận rằng vì họ đang làm việc với USD - một loại tiền tệ - sẽ hợp lý hơn khi sử dụng một thư viện xử lý tiền tệ như django-money (python-money) vì nó làm cho mọi thứ hoạt động như bạn mong đợi và mang lại điều chỉnh tính năng trong tương lai. Câu hỏi ban đầu nói rằng họ cần định dạng và tính toán (như bạn đã trích dẫn) và vì vậy, bạn nên sử dụng thư viện tiền tệ thay vì trường thập phân đơn giản.
Michael Thompson

1
Điều gì sẽ xảy ra nếu tôi muốn thêm hai trường tiền hoặc thực hiện một số phép tính?
saran3h

1
@ saran3h bạn có thể làm việc với các trường hợp tiền và thực hiện các phép tính như bất kỳ trường hợp số (thập phân) nào khác. Bạn có thể thêm / trừ, nhân với số nguyên vv
Michael Thompson

8

Xác định một số thập phân và trả về một dấu $ phía trước giá trị.

    price = models.DecimalField(max_digits=8, decimal_places=2)

    @property
    def price_display(self):
        return "$%s" % self.price

6
Bạn có nhận ra rằng bạn vừa tạo một vòng lặp đệ quy vô hạn trong thuộc tính của mình, phải không?
El Ninja Trepador 14/02/18

Hấp dẫn. Tôi có thể hỏi nó như thế nào không?
kingraphaii

2
field = models.DecimalField(max_digits=8, decimal_places=2)

Nên tạo một trường cho PostgreSQL như:

 "field" numeric(8, 2) NOT NULL

Đó là cách tốt nhất cho số lượng đô la Mỹ được lưu trữ trong PostGreSQL.

Nếu bạn cần loại trường PostgreSQL "độ chính xác kép", thì bạn cần làm trong mô hình django:

field = models.FloatField()

3
Cẩn thận với việc biểu thị tiền dưới dạng số dấu phẩy động, vì mọi người có xu hướng không hài lòng về lỗi làm tròn số tiền của họ. Xem: stackoverflow.com/questions/3730019/… để biết thêm chi tiết.
Adam Parkin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.