2014-02-07 62 views
1

我經常使用這個小函數eng(x)特別是以易於閱讀的方式顯示大數或小數。我可以寫"%e" % (number)如何定義一個新的字符串格式化程序

我希望能寫"%n" % (number)並得到這個eng(x)函數格式化的數字。

有沒有辦法做到這一點?

+2

另請參閱http://stackoverflow.com/questions/18394385/extending-python-string-formatting-with-custom-conversion-types。您可能希望使用'str.format()'而不是使用基於'%'的格式化來使用新樣式格式。 – senshin

+0

「%s」%eng(x) - 是你需要的嗎?但不知道。 –

+3

新樣式格式允許您使用['string.Formatter'](http://docs.python.org/2/library/string.html#string.Formatter)定義自定義格式說明符,以便您可以編寫'myfmt .format('{0:n}',數字)' – bereal

回答

0

您可以實現一個新的數字類:

from math import floor, log10 
class snumber(float): 
     def powerise10(x): 
      if x == 0: return 0 , 0 
      Neg = x <0 
      if Neg : x = -x 
      a = 1.0 * x/10**(floor(log10(x))) 
      b = int(floor(log10(x))) 
      if Neg : a = -a 
      return a ,b 

     def __str__(x): 
      a , b = snumber.powerise10(x) 
      if -3<b<3: return "%.4g" % x 
      a = a * 10**(b%3) 
      b = b - b%3 
      return "%.4g*10^%s" %(a,b) 

print "{}".format(snumber(100000)) 

給出:

100*10^3 
0

經過進一步的研究,我發現如何繼承string.Formatter按@變成真正的建議。

import string 
from math import floor, log10 

class CustFormatter(string.Formatter): 
    "Defines special formatting" 
    def __init__(self): 
     super(CustFormatter, self).__init__() 

    def powerise10(self, x): 
     if x == 0: return 0, 0 
     Neg = x < 0 
     if Neg: x = -x 
     a = 1.0 * x/10**(floor(log10(x))) 
     b = int(floor(log10(x))) 
     if Neg: a = -a 
     return a, b 

    def eng(self, x): 
     a, b = self.powerise10(x) 
     if -3 < b < 3: return "%.4g" % x 
     a = a * 10**(b%3) 
     b = b - b%3 
     return "%.4g*10^%s" % (a, b) 

    def format_field(self, value, format_string): 
     # handle an invalid format 
     if format_string == "i": 
      return self.eng(value) 
     else: 
      return super(CustFormatter,self).format_field(value, format_string) 

fmt = CustFormatter() 
print('{}'.format(0.055412)) 
print(fmt.format("{0:i} ", 55654654231654)) 
print(fmt.format("{} ", 0.00254641)) 

唯一的問題是,我已經部分斷裂它作爲最後一行,如果我不按位置參考變量,我得到一個KeyError

+0

從那時起就已經解決了:http://stackoverflow.com/questions/21664318/subclass-string-formatter – Cambium

相關問題