Skip to content

Commit

Permalink
first version of to_precision
Browse files Browse the repository at this point in the history
  • Loading branch information
randlet committed Aug 25, 2013
0 parents commit 677c8d3
Showing 1 changed file with 62 additions and 0 deletions.
62 changes: 62 additions & 0 deletions to_precision.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
def to_precision(x,p):
"""
returns a string representation of x formatted with a precision of p
Based on the webkit javascript implementation taken from here:
https://code.google.com/p/webkit-mirror/source/browse/JavaScriptCore/kjs/number_object.cpp
"""


import math
x = float(x)

if x == 0.:
return "0." + "0"*(p-1)

out = []

if x < 0:
out.append("-")
x = -x

e = int(math.log10(x))
tens = math.pow(10, e - p + 1)
n = math.floor(x/tens)

if n < math.pow(10, p - 1):
e = e -1
tens = math.pow(10, e - p+1)
n = math.floor(x / tens)

if abs((n + 1.) * tens - x) <= abs(n * tens -x):
n = n + 1

if n >= math.pow(10,p):
n = n / 10.
e = e + 1


m = "%.*g" % (p, n)

if e < -2 or e >= p:
out.append(m[0])
if p > 1:
out.append(".")
out.extend(m[1:p])
out.append('e')
if e > 0:
out.append("+")
out.append(str(e))
elif e == (p -1):
out.append(m)
elif e >= 0:
out.append(m[:e+1])
if e+1 < len(m):
out.append(".")
out.extend(m[e+1:])
else:
out.append("0.")
out.extend(["0"]*-(e+1))
out.append(m)

return "".join(out)

0 comments on commit 677c8d3

Please sign in to comment.