----- Original Message -----
> From: Steven D'Aprano <[email protected]>
> To: [email protected]
> 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
> <[email protected]> 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 - [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor