Formatting a numerical string w/commas

Berthold Höllmann bhoel at server.python.net
Wed Feb 23 03:30:10 EST 2000


Timothy Grant <tjg at avalongroup.net> writes:

> I've seen some traffic on this formatting numbers, and recently had to
> format and deformat some number for a Tkinter app I was writing, so I
> wrote to fairly generic functions for doing so.
> 
> This is the first time I've ever posted *real* code on the list so
> please be gentle, but constructive criticism, especially about style, is
> always welcome.

Maybe you also like to take a look at my "UnitPrint.py". It is hidden
in my PyLaTeX module on starship
(http://starship.python.net/crew/bhoel/). It is primaly written to
print PhysicalUnits from Konrad Hinsens ScientificPython. Here's a
sample session (using german locale settings):

    >>> from Scientific.Physics import PhysicalQuantities
    >>> p = PhysicalQuantities.PhysicalQuantity
    >>> import UnitPrint
    >>> from UnitPrint import *
    >>> print "got: ->%s<-" % formatInt(1)
    got: ->1<-
    >>> print "got: ->%s<-" % formatInt(12)
    got: ->12<-
    >>> print "got: ->%s<-" % formatInt(123)
    got: ->123<-
    >>> print "got: ->%s<-" % formatInt(1234)
    got: ->1234<-
    >>> print "got: ->%s<-" % formatInt(12345)
    got: ->12345<-
    >>> print "got: ->%s<-" % formatInt(123456)
    got: ->123456<-
    >>> print "got: ->%s<-" % formatInt(1234567)
    got: ->1234567<-
    >>> print "got: ->%s<-" % formatInt(12345678)
    got: ->12345678<-
    >>> print "got: ->%s<-" % formatInt(123456789)
    got: ->123456789<-
    >>> UnitPrint.thousand_sep = r"\,"
    >>> print "got: ->%s<-" % formatInt(1234567890)
    got: ->1\,234\,567\,890<-
    >>> UnitPrint.thousand_sep = r""
    >>> print "got: ->%s<-" % formatInt(1234567890,
    ...                                 {'thousand_sep': '-'})
    got: ->1-234-567-890<-
    >>> print "got: ->%s<-" % formatInt(1.)
    got: ->1<-
    >>> print "got: ->%s<-" % formatInt(12.)
    got: ->12<-
    >>> print "got: ->%s<-" % formatInt(123.)
    got: ->123<-
    >>> print "got: ->%s<-" % formatInt(1234.)
    got: ->1234<-
    >>> print "got: ->%s<-" % formatInt(12345.)
    got: ->12345<-
    >>> print "got: ->%s<-" % formatInt(123456.)
    got: ->123456<-
    >>> print "got: ->%s<-" % formatInt(1234567.)
    got: ->1234567<-
    >>> print "got: ->%s<-" % formatInt(12345678.)
    got: ->12345678<-
    >>> print "got: ->%s<-" % formatInt(123456789.)
    got: ->123456789<-
    >>> print "got: ->%s<-" % formatInt(1234567890.)
    got: ->1234567890<-
    >>> value = 1234.567891234
    >>> print "got: ->%s<-" % formatFloat(value, 1)
    got: ->1234.6<-
    >>> print "got: ->%s<-" % formatFloat(value, format=2)
    got: ->1234.57<-
    >>> print "got: ->%s<-" % formatFloat(value, 3)
    got: ->1234.568<-
    >>> print "got: ->%s<-" % formatFloat(value, 4)
    got: ->1234.5679<-
    >>> print "got: ->%s<-" % formatFloat(value, 5)
    got: ->1234.56789<-
    >>> print "got: ->%s<-" % formatFloat(value, 6)
    got: ->1234.567891<-
    >>> UnitPrint.thousand_sep = r"\,"
    >>> print "got: ->%s<-" % UnitPrint.formatFloat(value, 7)
    got: ->1\,234.567\,891\,2<-
    >>> print "got: ->%s<-" % formatFloat(value, 7)
    got: ->1\,234.567\,891\,2<-
    >>> print "got: ->%s<-" % formatFloat(value, 8,
    ...                                   {'thousand_sep': '-',
    ...                                    'decimal_point': '#'})
    got: ->1-234#567-891-23<-
    >>> print generateUnitList(1)
    ('1.0',)
    >>> print generateUnitList(p("1 m/m"))
    ('1.0',)
    >>> print generateUnitList(1, formatInt)
    ('1',)
    >>> print generateUnitList(1, formatFloat)
    ('1.000',)
    >>> print generateUnitList(p("1m"))
    ('1.0', 'm')
    >>> print generateUnitList(p("1m/s"))
    ('1.0', 'm', 's')
    >>> print generateUnitList(p("1kg*m/s**2"))
    ('1.0', 'kgm', 's2')
    >>> print generateUnitList(1/p("1kg*m/s**2"))
    ('1.0', 's2', 'mkg')
    >>> print generateUnitList(p(1, "1/kg/m/s**2"))
    ('1.0', '1', 'kgms2')
    >>> print generateUnitList(p("1m"), formatInt)
    ('1', 'm')
    >>> print generateUnitList(p("1m"), formatFloat, 2)
    ('1.00', 'm')
    >>> print generateUnitList(p("1m"), formatFloat, 3)
    ('1.000', 'm')
    >>> print generateUnitList(p("12345.678901m"), formatFloat, 5)
    ('12\\,345.678\\,90', 'm')
    >>> print generateUnitList(p("1m/s"), formatInt)
    ('1', 'm', 's')
    >>> print generateUnitList(p("1kg*m/s**2"), formatInt)
    ('1', 'kgm', 's2')
    >>> print generateUnitList(1/p("1kg*m/s**2"), formatInt)
    ('1', 's2', 'mkg')
    >>> print generateUnitList(p(1, "1/kg/m/s**2"), formatInt)
    ('1', '1', 'kgms2')
    >>> print LaTeXGenerateUnit(1)
    {1.0}
    >>> print LaTeXGenerateUnit(1, formatInt)
    {1}
    >>> print LaTeXGenerateUnit(1, formatFloat)
    {1.000}
    >>> print LaTeXGenerateUnit(p("1m"))
    \unit[{1.0}]{{m}}
    >>> print LaTeXGenerateUnit(p("1m/s"))
    \unitfrac[{1.0}]{{m}}{{s}}
    >>> print LaTeXGenerateUnit(p("1kg*m/s**2"))
    \unitfrac[{1.0}]{{kg}\,{m}}{{s}^{2}}
    >>> print LaTeXGenerateUnit(1/p("1kg*m/s**2"))
    \unitfrac[{1.0}]{{s}^{2}}{{m}\,{kg}}
    >>> print LaTeXGenerateUnit(p(1, "1/kg/m/s**2"))
    \unitfrac[{1.0}]{{1}}{{kg}\,{m}\,{s}^{2}}
    >>> print LaTeXGenerateUnit(p("1m"), formatInt)
    \unit[{1}]{{m}}
    >>> print LaTeXGenerateUnit(p("1m"), formatFloat, 2)
    \unit[{1.00}]{{m}}
    >>> print LaTeXGenerateUnit(p("1m"), formatFloat, 3)
    \unit[{1.000}]{{m}}
    >>> print LaTeXGenerateUnit(p("12345.6789012m"), formatFloat, 5)
    \unit[{12\,345.678\,90}]{{m}}
    >>> print LaTeXGenerateUnit(p("1m/s"), formatInt)
    \unitfrac[{1}]{{m}}{{s}}
    >>> print LaTeXGenerateUnit(p("1kg*m/s**2"), formatInt)
    \unitfrac[{1}]{{kg}\,{m}}{{s}^{2}}
    >>> print LaTeXGenerateUnit(1/p("1kg*m/s**2"), formatInt)
    \unitfrac[{1}]{{s}^{2}}{{m}\,{kg}}
    >>> print LaTeXGenerateUnit(p(1, "1/kg/m/s**2"), formatInt)
    \unitfrac[{1}]{{1}}{{kg}\,{m}\,{s}^{2}}
    >>> 

(this is the test session from UnitPrint).

Cheers

Berthold
-- 
bhoel at starship.python.net / http://starship.python.net/crew/bhoel/
        It is unlawful to use this email address for unsolicited ads
        (USC Title 47 Sec.227). I will assess a US$500 charge for
        reviewing and deleting each unsolicited ad.




More information about the Python-list mailing list