From 677c8d39dd992784f5d5474ade2b62faea27b8df Mon Sep 17 00:00:00 2001 From: Randle Taylor Date: Sun, 25 Aug 2013 16:13:37 -0400 Subject: [PATCH] first version of to_precision --- to_precision.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 to_precision.py diff --git a/to_precision.py b/to_precision.py new file mode 100644 index 0000000..86fe8c0 --- /dev/null +++ b/to_precision.py @@ -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)