यूएस डॉलर की राशि का प्रतिनिधित्व करने के लिए सबसे अच्छा django मॉडल फ़ील्ड क्या है?


103

मुझे एक Django मॉडल के एक क्षेत्र में यूएस $ डॉलर की राशि संग्रहीत करने की आवश्यकता है। उपयोग करने के लिए सबसे अच्छा मॉडल फ़ील्ड प्रकार क्या है? मुझे उपयोगकर्ता को यह मान दर्ज करने में सक्षम होने की आवश्यकता है (त्रुटि की जांच के साथ, केवल सेंट के लिए एक नंबर सटीक चाहिए), इसे विभिन्न स्थानों के उपयोगकर्ताओं के लिए आउटपुट के लिए प्रारूपित करें और अन्य संख्याओं की गणना करने के लिए इसका उपयोग करें।

जवाबों:


166

एक दशमलव फ़ील्ड मुद्रा मूल्य के लिए सही विकल्प है।

यह कुछ इस तरह दिखेगा:

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

98
जब तक आप राष्ट्रीय ऋण का प्रतिनिधित्व नहीं करना चाहते हैं, उस स्थिति में जब अधिकतम_digits> 20
ब्रॉन डेविस

4
अगर आपको अन्य मुद्राओं का समर्थन करने की आवश्यकता है तो दशमलव_प्लेसेस = 2 आवश्यक नहीं है। कुछ मुद्राओं में तीन दशमलव स्थान होते हैं, और बिटकॉइन की एक काली जगह होती है 8.
रेयान

2
मुझे लगता है कि यह उदाहरण लगभग सभी मुद्राओं के लिए सही है। बिटकॉइन के रूप में मुद्राओं का प्रतिनिधित्व करने के लिए, मुझे लगता है कि सैटोशिस में राशि को बचाने के लिए एक पूर्णांक फ़ील्ड का उपयोग करना बेहतर है, और फिर इसे अंतिम उपयोगकर्ता को उस प्रतिनिधित्व में दिखाएं जो आप चाहते हैं (BTC, mBTC, आदि)
jion

जब तक आप venezuelan की राष्ट्रीय मुद्रा में venezuela के राष्ट्रीय ऋण का प्रतिनिधित्व नहीं करना चाहते हैं, जिस पर आपको 21 मैक्स_डिजिट्स की आवश्यकता है
लुइस सिएरा

@ लाइरेन यह सच है। हमें भविष्य की डीबी संशोधनों को रोकने के लिए "मुद्रा" के आधुनिक प्रकारों पर ध्यान देना होगा। उद्धरणों के उपयोग के लिए कोई अपराध नहीं।
ENCHANCE


35

अन्य उत्तर 100% सही हैं, लेकिन बहुत व्यावहारिक नहीं हैं क्योंकि आपको अभी भी मैन्युअल रूप से आउटपुट, स्वरूपण आदि का प्रबंधन करना होगा।

मैं django- मनी का उपयोग करने का सुझाव दूंगा :

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

यह अजगर-पैसे के माध्यम से एक शक्तिशाली बैकेंड है और यह अनिवार्य रूप से मानक दशमलव क्षेत्रों के लिए एक ड्रॉप-इन प्रतिस्थापन है।


(त्रुटि जाँच के साथ, केवल सेंट के लिए एक नंबर सटीक चाहिए), इसे विभिन्न स्थानों के उपयोगकर्ताओं के लिए आउटपुट के लिए प्रारूपित करें, और अन्य संख्याओं की गणना करने के लिए इसका उपयोग करें। ऐसे मामलों के लिए, उपयोग DecimalFieldअधिक व्यावहारिक है। और मेरा मानना ​​है कि यह ज्यादातर लोगों के लिए लागू होता है। django-moneyजैसा कि उन्होंने हाइलाइट किया था, मुद्रा हैंडलिंग को शामिल करते हुए । तो यह इस तरह के ई-कॉमर्स साइटों, भुगतान गेटवे, डिजिटल मुद्रा, बैंकिंग, आदि के रूप में लेनदेन से संबंधित परियोजना के लिए अधिक है ....
यो

मेरा तर्क है कि जब से वे USD के साथ काम कर रहे हैं - एक मुद्रा - यह django-money (python-money) जैसी मुद्रा-हैंडलिंग लाइब्रेरी का उपयोग करने के लिए अधिक समझ में आता है क्योंकि यह आपकी अपेक्षा के अनुसार सब कुछ काम करता है और आपसे अपेक्षा करता है भविष्य की सुविधा समायोजन। मूल प्रश्न कहता है कि उन्हें प्रारूपण और गणना की आवश्यकता है (जैसा कि आपने उद्धृत किया है) और इसके लिए आप एक साधारण दशमलव क्षेत्र के बजाय मुद्रा पुस्तकालय का उपयोग करना बेहतर समझते हैं।
माइकल थॉम्पसन

1
क्या होगा अगर मैं दो पैसे फ़ील्ड जोड़ना चाहता हूं या कुछ गणना करना चाहता हूं?
saran3h

1
@ saran3h आप पैसे के उदाहरणों के साथ काम कर सकते हैं और किसी भी अन्य संख्या (दशमलव) उदाहरण की गणना कर सकते हैं। आप पूर्णांक, आदि से गुणा / घटाकर जोड़ सकते हैं
माइकल थॉम्पसन

8

दशमलव को परिभाषित करें और मूल्य के सामने एक $ चिह्न लौटाएँ।

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

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

6
आपको एहसास होता है कि आपने अपनी संपत्ति में सिर्फ एक अनंत पुनरावर्तन पाश बनाया है, है ना?
एल निंजा ट्रेपडोर

दिलचस्प। मैं पूछ सकता हूँ कि यह कैसे?
राजाप्रभाई

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

PostgreSQL के लिए एक फ़ील्ड बनाना चाहिए:

 "field" numeric(8, 2) NOT NULL

जो PostGreSQL संग्रहीत अमेरिकी डॉलर राशि के लिए सबसे अच्छा तरीका है।

यदि आपको PostgreSQL फ़ील्ड प्रकार "डबल सटीक" की आवश्यकता है, तो आपको django मॉडल में करने की आवश्यकता है:

field = models.FloatField()

3
एक अस्थायी बिंदु संख्या के रूप में धन का प्रतिनिधित्व करने से सावधान रहें, क्योंकि लोग गोल चक्कर त्रुटियों के बारे में दुखी हो जाते हैं, जो उनके पैसे को कम करते हैं। अधिक जानकारी के लिए देखें: stackoverflow.com/questions/3730019/…
एडम पार्किन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.