#! /usr/bin/python3 #Copyright ReportLab Europe Ltd. 2000-2017 #see license.txt for license details #history https://hg.reportlab.com/hg-public/reportlab/log/tip/src/reportlab/lib/formatters.py __all__=('Formatter','DecimalFormatter') __version__='3.3.0' __doc__=""" These help format numbers and dates in a user friendly way. Used by the graphics framework. """ import string, sys, os, re class Formatter: "Base formatter - simply applies python format strings" def __init__(self, pattern): self.pattern = pattern def format(self, obj): return self.pattern % obj def __repr__(self): return "%s('%s')" % (self.__class__.__name__, self.pattern) def __call__(self, x): return self.format(x) _ld_re=re.compile(r'^\d*\.') _tz_re=re.compile('0+$') class DecimalFormatter(Formatter): """lets you specify how to build a decimal. A future NumberFormatter class will take Microsoft-style patterns instead - "$#,##0.00" is WAY easier than this.""" def __init__(self, places=2, decimalSep='.', thousandSep=None, prefix=None, suffix=None): if places=='auto': self.calcPlaces = self._calcPlaces else: self.places = places self.dot = decimalSep self.comma = thousandSep self.prefix = prefix self.suffix = suffix def _calcPlaces(self,V): '''called with the full set of values to be formatted so we can calculate places''' self.places = max([len(_tz_re.sub('',_ld_re.sub('',str(v)))) for v in V]) def format(self, num): # positivize the numbers sign=num<0 if sign: num = -num places, sep = self.places, self.dot strip = places<=0 if places and strip: places = -places strInt = ('%.' + str(places) + 'f') % num if places: strInt, strFrac = strInt.split('.') strFrac = sep + strFrac if strip: while strFrac and strFrac[-1] in ['0',sep]: strFrac = strFrac[:-1] else: strFrac = '' if self.comma is not None: strNew = '' while strInt: left, right = strInt[0:-3], strInt[-3:] if left == '': #strNew = self.comma + right + strNew strNew = right + strNew else: strNew = self.comma + right + strNew strInt = left strInt = strNew strBody = strInt + strFrac if sign: strBody = '-' + strBody if self.prefix: strBody = self.prefix + strBody if self.suffix: strBody = strBody + self.suffix return strBody def __repr__(self): return "%s(places=%d, decimalSep=%s, thousandSep=%s, prefix=%s, suffix=%s)" % ( self.__class__.__name__, self.places, repr(self.dot), repr(self.comma), repr(self.prefix), repr(self.suffix) ) if __name__=='__main__': def t(n, s, places=2, decimalSep='.', thousandSep=None, prefix=None, suffix=None): f=DecimalFormatter(places,decimalSep,thousandSep,prefix,suffix) r = f(n) print("places=%2d dot=%-4s comma=%-4s prefix=%-4s suffix=%-4s result=%10s %s" %(f.places, f.dot, f.comma, f.prefix, f.suffix,r, r==s and 'OK' or 'BAD')) t(1000.9,'1,000.9',1,thousandSep=',') t(1000.95,'1,001.0',1,thousandSep=',') t(1000.95,'1,001',-1,thousandSep=',') t(1000.9,'1,001',0,thousandSep=',') t(1000.9,'1000.9',1) t(1000.95,'1001.0',1) t(1000.95,'1001',-1) t(1000.9,'1001',0) t(1000.1,'1000.1',1) t(1000.55,'1000.6',1) t(1000.449,'1000.4',-1) t(1000.45,'1000',0)
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
PyFontify.py | File | 4.86 KB | 0644 |
|
__init__.py | File | 258 B | 0755 |
|
_rl_accel.cpython-38-x86_64-linux-gnu.so | File | 44.7 KB | 0644 |
|
abag.py | File | 1.1 KB | 0644 |
|
arciv.py | File | 7.43 KB | 0644 |
|
attrmap.py | File | 5.37 KB | 0644 |
|
boxstuff.py | File | 2.86 KB | 0644 |
|
codecharts.py | File | 12.76 KB | 0644 |
|
colors.py | File | 40.1 KB | 0644 |
|
corp.py | File | 26.53 KB | 0755 |
|
enums.py | File | 296 B | 0644 |
|
extformat.py | File | 2.17 KB | 0644 |
|
fontfinder.py | File | 13.24 KB | 0644 |
|
fonts.py | File | 3.44 KB | 0755 |
|
formatters.py | File | 3.73 KB | 0755 |
|
geomutils.py | File | 1.14 KB | 0644 |
|
hyphen.mashed | File | 35.6 KB | 0644 |
|
logger.py | File | 1.71 KB | 0755 |
|
normalDate.py | File | 21.9 KB | 0755 |
|
pagesizes.py | File | 1.96 KB | 0755 |
|
pdfencrypt.py | File | 30.48 KB | 0644 |
|
pygments2xpre.py | File | 2.66 KB | 0644 |
|
randomtext.py | File | 22.63 KB | 0755 |
|
rl_accel.py | File | 12.72 KB | 0644 |
|
rl_safe_eval.py | File | 42.75 KB | 0644 |
|
rltempfile.py | File | 1.09 KB | 0644 |
|
rparsexml.py | File | 17.4 KB | 0644 |
|
sequencer.py | File | 9.98 KB | 0644 |
|
styles.py | File | 16.38 KB | 0644 |
|
testutils.py | File | 11.57 KB | 0644 |
|
textsplit.py | File | 9.5 KB | 0644 |
|
units.py | File | 919 B | 0755 |
|
utils.py | File | 50.57 KB | 0644 |
|
validators.py | File | 10.42 KB | 0644 |
|
yaml.py | File | 5.58 KB | 0644 |
|