2012-09-07 14 views
9

मैं पाइथन के साथ इंजीनियरिंग प्रारूप में एक संख्या मुद्रित करने की कोशिश कर रहा हूं, लेकिन मुझे इसे काम करने के लिए प्रतीत नहीं होता है। वाक्यविन्यास सेम काफी सरल है, लेकिन यह सिर्फ काम नहीं करता है।इंजीनियरिंग प्रारूप में प्रिंट नंबर

>>> import decimal 
>>> x = decimal.Decimal(1000000) 
>>> print x 
1000000 
>>>> print x.to_eng_string() 
1000000 

मुझे यह नहीं पता कि यह क्यों है। दो मान बराबर नहीं हैं (एक स्ट्रिंग है, दूसरा एक int है)। decimal में विभिन्न संदर्भों को सेट करने में कोई मदद नहीं लगती है। कोई सुराग या विचार?

+0

मैं यहाँ समाधान नहीं मिला "% .4g"% एक्स – lehalle

उत्तर

17

इस काम करने के लिए प्राप्त करने के लिए लगता है, तो संपादित करने के लिए स्वतंत्र महसूस, आपको पहले दशमलव को सामान्य बनाने के लिए है:

>>> x = decimal.Decimal ('10000000') 

>>> x.normalize() 
Decimal('1E+7') 

>>> x.normalize().to_eng_string() 
'10E+6' 

इस का कारण यह स्रोत में जाने पर द्वारा की खोज की जा सकती है कोड।

आप अजगर 2.7.3 स्रोत पेड़ में to_eng_string() (Lib/decimal.py Gzipped स्रोत राल गेंद here से) की जांच करते हैं, तो यह बस सच करने के लिए eng सेट के साथ __str__ कहता है।

फिर आप देख सकते हैं कि इसके साथ शुरू में कितने अंक दशमलव के बाईं ओर जाना पर फैसला:

leftdigits = self._exp + len(self._int) 

निम्न तालिका पता चलता है कि मूल्यों को उन दो बातों के लिए कर रहे हैं:

      ._exp  ._int   len leftdigits 
         -----  ---------  --- ---------- 
Decimal (1000000)   0  '1000000'  7   7 
Decimal ('1E+6')    6  '1'    1   7 

कोड है कि उसके बाद भी जारी है:

if self._exp <= 0 and leftdigits > -6: 
    # no exponent required 
    dotplace = leftdigits 
elif not eng: 
    # usual scientific notation: 1 digit on left of the point 
    dotplace = 1 
elif self._int == '0': 
    # engineering notation, zero 
    dotplace = (leftdigits + 1) % 3 - 1 
else: 
    # engineering notation, nonzero 
    dotplace = (leftdigits - 1) % 3 + 1 

और आपको लगता है कि, Unle देख सकते हैं एसएस पहले से ही में एक निश्चित सीमा (self._exp > 0 or leftdigits <= -6) में एक एक्सपोनेंट है, स्ट्रिंग प्रतिनिधित्व में इसे कोई भी नहीं दिया जाएगा।


आगे की जांच इस व्यवहार का कारण बताती है। कोड को स्वयं देखकर, आप देखेंगे कि यह General Decimal Arithmetic Specification (पीडीएफ here) पर आधारित है।

"करने के लिए वैज्ञानिक-स्ट्रिंग" आपरेशन धर्मान्तरित:

आप to-scientific-string (जिस पर to-engineering-string भारी आधारित है) के लिए है कि दस्तावेज़ खोजते हैं, तो यह हिस्सा (दूसरे शब्दों में बयान, और मेरे बोल्ड बिट्स के साथ) में कहा गया है एक एक्सपोनेंट की आवश्यकता होने पर वैज्ञानिक नोटेशन का उपयोग करके स्ट्रिंग की संख्या। ऑपरेशन संदर्भ से प्रभावित नहीं है।

संख्या तो एक सीमित संख्या है:

गुणांक पहले एक स्ट्रिंग के लिए आधार दस में पात्रों 0 का उपयोग कर के माध्यम से 9 में कोई शून्य के साथ (यदि अपने मूल्य शून्य है सिवाय बदल जाती है, जिस स्थिति एक में एकल 0 वर्ण का उपयोग किया जाता है)।

इसके बाद, समायोजित प्रतिपादक गणना की जाती है; यह एक्सपोनेंट है, साथ ही परिवर्तित गुणांक में वर्णों की संख्या, कम एक है। वह है, एक्सपोनेंट + (क्लैथेंथ -1), जहां दशमलव अंक दशमलव में गुणांक की लंबाई है।

तो प्रतिपादक से कम या शून्य के बराबर है और समायोजित प्रतिपादक से अधिक या -6 के बराबर है, संख्या घातीय संकेतन का उपयोग किए बिना एक चरित्र रूप में परिवर्तित हो जाएगा। इस मामले में, यदि एक्सपोनेंट शून्य है तो कोई दशमलव बिंदु जोड़ा नहीं जाता है। अन्यथा (एक्सपोनेंट नकारात्मक होगा), एक दशमलव बिंदु दशमलव बिंदु के दाईं ओर वर्णों की संख्या निर्दिष्ट करने वाले एक्सपोनेंट के पूर्ण मूल्य के साथ डाला जाएगा। आवश्यक रूप से परिवर्तित गुणांक के बाईं ओर वर्ण "0" जोड़े गए हैं। यदि इस प्रविष्टि के बाद दशमलव बिंदु दशमलव बिंदु से पहले कोई चरित्र नहीं है तो एक पारंपरिक "0" वर्ण उपसर्ग किया गया है।

दूसरे शब्दों में, यह कर रहा है कि यह क्या कर रहा है क्योंकि मानक यह करने के लिए कहता है।

+0

यह जांचने के लिए परेशान क्यों होगा? मैंने इसे कुछ विशिष्ट के लिए पूछा। फिर उसने फैसला किया कि मैं वह नहीं चाहता था और सिर्फ वही चाहता था जो मैंने दिया था? पाइथन मुझे कई बार भ्रमित करता है ... – jmurrayufo

+2

@jmurrayufo, अद्यतन की जांच करें। असल में, यह ऐसा इसलिए कर रहा है क्योंकि मानक यह करने के लिए कहता है। – paxdiablo

4

यह है कि आप रोल करने के लिए जा रहे हैं मुझे लगता है अपनी खुद की:

from math import log10 
def eng_str(x): 
    y = abs(x) 
    exponent = int(log10(y)) 
    engr_exponent = exponent - exponent%3 
    z = y/10**engr_exponent 
    sign = '-' if x < 0 else '' 
    return sign+str(z)+'e'+str(engr_exponent) 

यद्यपि आप z भाग के स्वरूपण में एक छोटे से अधिक देखभाल करने के लिए चाहते हो सकता है ...

अच्छी तरह से परीक्षण नहीं किया गया। आप कीड़े

+0

मैं विचार कोई आपत्ति नहीं है, वहीं मैं और अधिक उत्सुक हूँ क्यों 'decimal' वर्ग ऐसा नहीं करता है यह क्या लगता है यह होना चाहिए, या मैं इसे गलत तरीके से कैसे उपयोग कर रहा हूं – jmurrayufo

+0

@jmurrayufo - क्षमा करें, मुझे लगता है कि मैंने सवाल को गलत समझा :)। – mgilson

-1

पहले मैं जवाब देने के लिए कोशिश की, लेकिन पता चला कि यह सिर्फ अभी भी वैज्ञानिक संकेतन है। इंजीनियरिंग नोटेशन पाइथन प्रारूप विनिर्देशक (3.2?) के भविष्य के संस्करणों में समर्थित होगा, लेकिन पायथन 2.7 में नहीं। इस मुद्दे http://bugs.python.org/issue8060

+1

वास्तव में, यह संबंधित है लेकिन यह दशमलव के बजाय EFloat प्रकारों के लिए है। – paxdiablo

+0

पक्सडीब्लो की व्याख्या गलत प्रतीत होती है, उल्लिखित ईफ्लैट वांछित व्यवहार के लिए सिर्फ एक प्रदर्शन वर्ग प्रतीत होता है। लेकिन 2010 से यह मुद्दा हाल ही में बंद/अस्वीकार कर दिया गया है। – handle

2

मुझे लगता है कि यह एक पुराने धागा है, लेकिन यह python engineering notation के लिए एक खोज के शीर्ष के निकट आता है पर

देखो।

मैं एक इंजीनियर जो "इंजीनियरिंग 101" इंजीनियरिंग इकाइयों पसंद करती हूँ। मैं मुझे लगता है कि 100nF पढ़ने के लिए चाहते हो, यहां तक ​​कि नहीं इस तरह के 0.1uF के रूप में पदों की तरह। मैं Decimal वर्ग के साथ खेला और संभावित मान की सीमा पर अपने व्यवहार की तरह वास्तव में नहीं था, इसलिए मैं एक पैकेज है कि पिप-स्थापना योग्य है engineering_notation बुलाया गिर गयी है।

pip install engineering_notation 

अजगर के भीतर से:

>>> from engineering_notation import EngNumber 
>>> EngNumber('1000000') 
1M 
>>> EngNumber(1000000) 
1M 
>>> EngNumber(1000000.0) 
1M 
>>> EngNumber('0.1u') 
100n 
>>> EngNumber('1000m') 
1 

इस पैकेज भी तुलना और अन्य साधारण संख्यात्मक संचालन का समर्थन करता है।

https://github.com/slightlynybbled/engineering_notation

संबंधित मुद्दे