ฟิลด์โมเดล django ที่ดีที่สุดที่จะใช้แทนจำนวนเงินดอลลาร์สหรัฐคืออะไร?


106

ฉันต้องการเก็บเงินดอลลาร์สหรัฐไว้ในโมเดล Django ประเภทฟิลด์โมเดลที่ดีที่สุดที่จะใช้คืออะไร? ฉันต้องสามารถให้ผู้ใช้ป้อนค่านี้ได้ (ด้วยการตรวจสอบข้อผิดพลาดต้องการตัวเลขที่ถูกต้องเป็นเซ็นต์เท่านั้น) จัดรูปแบบเพื่อส่งออกไปยังผู้ใช้ในที่ต่างๆและใช้เพื่อคำนวณตัวเลขอื่น ๆ

คำตอบ:


172

ฟิลด์ทศนิยมเป็นทางเลือกที่เหมาะสมสำหรับค่าของสกุลเงิน

จะมีลักษณะดังนี้:

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

111
เว้นแต่คุณต้องการเป็นตัวแทนหนี้ของประเทศซึ่งในกรณีนี้ max_digits จะต้องเป็น> 20
Bron Davies

4
decimal_places = 2 ไม่จำเป็นต้องถูกต้องหากคุณต้องการสิ่งนี้เพื่อรองรับสกุลเงินอื่น บางสกุลเงินมีทศนิยมสามตำแหน่งและ Bitcoin มี 8 ตำแหน่ง
Lie Ryan

2
ฉันคิดว่าตัวอย่างนี้ถูกต้องเกือบทุกสกุลเงิน ในการแสดงสกุลเงินเป็น Bitcoin ฉันคิดว่าเป็นการดีกว่ามากที่จะใช้ฟิลด์จำนวนเต็มเพื่อบันทึกจำนวนใน satoshis แล้วแสดงให้ผู้ใช้ขั้นสุดท้ายเป็นตัวแทนที่คุณต้องการ (BTC, mBTC ฯลฯ )
jion

เว้นแต่คุณต้องการเป็นตัวแทนหนี้แห่งชาติของเวเนซุเอลาในสกุลเงินประจำชาติของเวเนซุเอลาซึ่งในกรณีนี้คุณต้องมี max_digits 21 รายการ
Luis Sieira

@LieRyan นั่นคือเรื่องจริง เราต้องสังเกต "สกุลเงิน" ประเภทใหม่ ๆ เพื่อป้องกันการแก้ไขฐานข้อมูลในอนาคต ไม่มีความผิดสำหรับการใช้คำพูด
enchance


35

คำตอบอื่น ๆ นั้นถูกต้อง 100% แต่ใช้งานไม่ได้จริงเนื่องจากคุณยังต้องจัดการเอาต์พุตการจัดรูปแบบและอื่น ๆ ด้วยตนเอง

ฉันขอแนะนำให้ใช้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,
    )

ทำงานโดยอัตโนมัติจากเทมเพลต:

{{ somemodel.some_currency }}

เอาท์พุต:

$123.00

มันมีแบ็กเอนด์ที่ทรงพลังผ่าน python-money และโดยพื้นฐานแล้วมันคือการแทนที่แบบดรอปอินสำหรับฟิลด์ทศนิยมมาตรฐาน


(ด้วยการตรวจสอบข้อผิดพลาดต้องการเพียงตัวเลขที่ถูกต้องเป็นเซ็นต์) จัดรูปแบบเพื่อส่งออกไปยังผู้ใช้ในที่ต่างๆและใช้เพื่อคำนวณตัวเลขอื่น ๆ สำหรับกรณีเช่นนี้การใช้งานDecimalFieldจะเป็นประโยชน์มากขึ้น และฉันเชื่อว่ามันใช้ได้กับคนส่วนใหญ่ ใช้django-moneyตามที่ไฮไลต์ไว้รวมถึงการจัดการสกุลเงิน ดังนั้นนี่จึงเป็นโครงการที่เกี่ยวข้องกับการทำธุรกรรมเช่นไซต์อีคอมเมิร์ซเกตเวย์การชำระเงินสกุลเงินดิจิทัลการธนาคาร ฯลฯ ...
Yeo

ฉันขอยืนยันว่าเนื่องจากพวกเขาทำงานร่วมกับ USD ซึ่งเป็นสกุลเงินจึงเหมาะสมกว่าที่จะใช้ไลบรารีจัดการสกุลเงินเช่น django-money (python-money) เนื่องจากทำให้ทุกอย่างทำงานได้ตามที่คุณคาดหวังและคุ้มค่า การปรับเปลี่ยนคุณสมบัติในอนาคต คำถามเดิมบอกว่าพวกเขาต้องการการจัดรูปแบบและการคำนวณ (ตามที่คุณยกมา) และคุณควรใช้ไลบรารีสกุลเงินแทนการใช้ช่องทศนิยมธรรมดา
Michael Thompson

1
จะเกิดอะไรขึ้นถ้าฉันต้องการเพิ่มช่องเงินสองช่องหรือทำการคำนวณ?
saran3h

1
@ saran3h คุณสามารถทำงานกับอินสแตนซ์ Money และทำการคำนวณเช่นเดียวกับอินสแตนซ์ตัวเลขอื่น ๆ (ทศนิยม) คุณสามารถบวก / ลบคูณด้วยจำนวนเต็ม ฯลฯ
Michael Thompson

9

กำหนดทศนิยมและส่งกลับเครื่องหมาย $ หน้าค่า

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

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

6
คุณตระหนักดีว่าคุณเพิ่งสร้างวงวนซ้ำที่ไม่มีที่สิ้นสุดในทรัพย์สินของคุณใช่ไหม?
El Ninja Trepador

น่าสนใจ. ฉันขอถามว่ามันเป็นอย่างไร
Redgren Grumbholdt

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

ควรสร้างฟิลด์สำหรับ PostgreSQL เช่น:

 "field" numeric(8, 2) NOT NULL

ซึ่งเป็นวิธีที่ดีที่สุดสำหรับ PostGreSQL ที่เก็บไว้เป็นเงินดอลลาร์สหรัฐ

หากคุณต้องการฟิลด์ PostgreSQL ประเภท "double precision" คุณต้องทำใน django model:

field = models.FloatField()

3
ระวังการแสดงเงินเป็นตัวเลขทศนิยมเนื่องจากผู้คนมักไม่พอใจกับข้อผิดพลาดในการปัดเศษเงินของตน ดู: stackoverflow.com/questions/3730019/…สำหรับรายละเอียดเพิ่มเติม
Adam Parkin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.