[Python-de] Tausenderpunkt

Hans-Peter Jansen hpj at urpla.net
Don Dez 2 12:10:54 CET 2004


On Thursday 02 December 2004 09:13, Bertram Scharpf wrote:
> Hallo,
>
> Am Mittwoch, 01. Dez 2004, 23:55:00 +0100 schrieb Hans-Peter Jansen:
> > On Wednesday 01 December 2004 18:38, Peter Otten wrote:
> > > Am Mittwoch, 1. Dezember 2004 18:07 schrieb Christian Klinger:
> > > > gibt es irgendwo eine Funktion wie man bei der ausgabe eines
> > > > Integer einen 1000er Punkt mit eintragen kann!
> > > >
> > > >>> import locale
> > > >>> locale.setlocale(locale.LC_ALL, "")
> > >
> > > 'de_DE.UTF-8'
> > >
> > > >>> locale.format("%d", 10000, True)
> > >
> > > '10.000'
> >
> > Den kannte ich noch nicht: Cool!
> >
> > Hier ist meine:
> >
> > def fdotval(val, sep='.', blk=3):
> >     """ format integer values in dot separated representation """
> >     s, r = '%s' % val, ''
> >     if s[-1] == 'L':
> >         s = s[:-1]
> >     while len(s) > blk:
> >         r = sep + s[-blk:] + r
> >         s = s[:-blk]
> >     return s + r
> >
> > Die Zeilen 4 und 5 verraten, aus welcher Zeit sie stammt ;-)
> >
> > Macht's jemand besser?
>
> Ein wenig kürzer, ein wenig kryptischer, dafür ein wenig
> mehr pythonisch, vielleicht ein bißchen schneller:
>
>     def fmtd( v):
>         v, l = str( v), []
>         while v:
>             v, l[:0] = v[:-3], [ v[-3:]]
>         return '.'.join( l)

Ahh, der [:0] Trick ist auch nicht schlecht.. Muß ich mir merken! 
Wo wir schon mal dabei sind, hat jemand dafür 'ne bessere Lösung:

def fquant(val, prec=2):
    """ format data quantities in human readable form """
    for l, q in (( "TB", 1024L * 1024L * 1024L * 1024L ),
                 ( "GB", 1024L * 1024L * 1024L ),
                 ( "MB", 1024L * 1024L ),
                 ( "KB", 1024L ),
                 ( "B",  1L )):
        if val >= q:
            break
    v = float(val)/q
    fs = "%%.%02df %%s" % prec
    return (fs % (v, l))

Ciao,
Pete