2

I want to put a bunch of floating point numbers into a fixed-width table. That is, I want a maximum of 12 characters used. I want a minimum of 10 decimals used (if available); however, if 10 decimals makes it take up more than 12 characters, then round. My original thought was to try something like this

# I only want 12 characters used total

num1 = 0.04154721841
num2 = 10.04154721841

# not what I want
print "{:<12.11g}".format((num1))
# what I want
print "{:<12.10f}".format((num1))

# not what I want
print "{:<12.10f}".format((num2))
# what I want
print "{:<12.11g}".format((num2))

There has to be a way to achieve this without writing a function to check every number and give formatting based on the above conditions. What am I missing?

jseabold
  • 7,903
  • 2
  • 39
  • 53
  • What's wrong with writing a function? – ILYA Khlopotov Dec 08 '11 at 00:16
  • 1
    Why don't you use scientific notation? I'm not sure of the reasons for your requirements, but the formatting you're proposing (have the decimal point jumping all over the place) would not be intuitive or readable for anyone with an engineering/science/maths type background. – wim Dec 08 '11 at 01:01

1 Answers1

6

I'm not sure this is what you are looking for, since it's not accomplished entirely with the format string, however, you could just use string slicing to lop-off the trailing chars when things get too long:

num1 = 0.04154721841
num2 = 10.04154721841
num3 = 1002.04154721841

print "{0:<12.11g}".format(num1)[:12]
print "{0:<12.11g}".format(num2)[:12]
print "{0:<12.11g}".format(num3)[:12]

outputs:

0.0415472184
10.041547218
1002.0415472

Beyond that, I'd say you should just write a function, though I'm not an expert on the str.format stuff, so I may be missing something.

Adam Wagner
  • 15,469
  • 7
  • 52
  • 66
  • Thanks, that makes sense. I ended up just writing a function though. – jseabold Dec 13 '11 at 20:59
  • Just in case somebody arrives here from Google. Beware! This is horribly broken, because `g` can cause scientific notation formatting. `num1 = (10**-12)/3` will print `3.3333333333` instead of `3.333334e-13`. – RuRo Sep 05 '19 at 22:08