----- Original Message ----- > From: Steven D'Aprano <st...@pearwood.info> > To: tutor@python.org > Cc: > Sent: Friday, October 5, 2012 8:54 AM > Subject: Re: [Tutor] rounding up to the nearest multiple of 8 > > On Thu, Oct 04, 2012 at 05:26:13PM -0400, eryksun wrote: >> On Thu, Oct 4, 2012 at 4:04 PM, Joel Goldstick > <joel.goldst...@gmail.com> wrote: >> > >> >>>> my_string = "123" >> >>>> pad = 8 - len(my_string) % 8 >> >>>> my_string = my_string + " " * pad >> >>>> my_string >> > '123 ' >> >> If len(my_string) is already a multiple of 8, the above sets pad to 8: >> >> >>> s = "12345678" >> >>> pad = 8 - len(my_string) % 8 >> >>> pad >> 8 > > Here's another way: > > > py> from __future__ import division > py> from math import ceil > py> "%*s" % (int(ceil(len(mystring)/8)*8), mystring) > ' 123412341234' > > > Or left-justified: > > py> "%-*s" % (int(ceil(len(mystring)/8)*8), mystring) > '123412341234 ' > > > In Python 3, there is no need for the "from __future__" line.
Hi Steven, Eryksun, Joel, Thanks for your replies! Steven, I noticed that the "from __future__" line can be omitted if len(mystring) is divided by 8.0 (ie, by a float rather than an int). I compared the "ceil" approach to the "modulo" approach, and found that the ceil approach is 2.6 times slower than the other approach. In this case, that's a relevant difference as the padding sometimes needs to be done millions of times. import timeit ver1 = timeit.timeit(""" import math value = "1234" value = "%-*s" % (int(math.ceil(len(value)/8.0)*8), value) """) ver2 = timeit.timeit(""" value = "1234" value = value.ljust( len(value) + (-len(value) % 8) ) """) print ver1 print ver2 print ver1 / ver2 _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor