Pastebin

Paste #2099: python doc bug, decimal

< previous paste - next paste>

Pasted by tdn

Download View as text

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)                                 
[GCC 4.5.2] on linux2                                                             
Type "help", "copyright", "credits" or "license" for more information.            
>>> from decimal import *                                                         
>>> getcontext().prec = 2                                                         
>>> def moneyfmt(value, places=2, curr='', sep=',', dp='.',                       
...              pos='', neg='-', trailneg=''):                                   
...     """Convert Decimal to a money formatted string.                           
...                                                                               
...     places:  required number of places after the decimal point                
...     curr:    optional currency symbol before the sign (may be blank)          
...     sep:     optional grouping separator (comma, period, space, or blank)     
...     dp:      decimal point indicator (comma or period)                        
...              only specify as blank when places is zero                        
...     pos:     optional sign for positive numbers: '+', space or blank          
...     neg:     optional sign for negative numbers: '-', '(', space or blank     
...     trailneg:optional trailing minus indicator:  '-', ')', space or blank     
...                                                                               
...     >>> d = Decimal('-1234567.8901')                                          
...     >>> moneyfmt(d, curr='$')                                                 
...     '-$1,234,567.89'                                                          
...     >>> moneyfmt(d, places=0, sep='.', dp='', neg='', trailneg='-')           
...     '1.234.568-'                                                              
...     >>> moneyfmt(d, curr='$', neg='(', trailneg=')')                          
...     '($1,234,567.89)'                                                         
...     >>> moneyfmt(Decimal(123456789), sep=' ')                                 
...     '123 456 789.00'                                                          
...     >>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')                     
...     '<0.02>'                                                                  
...                                                                               
...     """                                                                       
...     q = Decimal(10) ** -places      # 2 places --> '0.01'                     
...     sign, digits, exp = value.quantize(q).as_tuple()                          
...     result = []                                                               
...     digits = map(str, digits)                                                 
...     build, next = result.append, digits.pop                                   
...     if sign:                                                                  
...         build(trailneg)                                                       
...     for i in range(places):                                                   
...         build(next() if digits else '0')                                      
...     build(dp)                                                                 
...     if not digits:                                                            
...         build('0')                                                            
...     i = 0                                                                     
...     while digits:                                                             
...         build(next())                                                         
...         i += 1                                                                
...         if i == 3 and digits:                                                 
...             i = 0                                                             
...             build(sep)                                                        
...     build(curr)                                                               
...     build(neg if sign else pos)                                               
...     return ''.join(reversed(result))                                          
...                                                                               
>>> d = Decimal('-1234567.8901')                                                  
>>> moneyfmt(d, curr='$')                                                         
Traceback (most recent call last):                                                
  File "<stdin>", line 1, in <module>                                             
  File "<stdin>", line 28, in moneyfmt                                            
  File "/usr/lib/python2.7/decimal.py", line 2430, in quantize                    
    'quantize result has too many digits for current context')                    
  File "/usr/lib/python2.7/decimal.py", line 3844, in _raise_error                
    raise error(explanation)                                                      
decimal.InvalidOperation: quantize result has too many digits for current context 
>>>               

New Paste


Do not write anything in this field if you're a human.

Go to most recent paste.