从 Python 中的指数中提取数字
extract number from exponent in Python
大家好/Python大师
我想知道如何完成以下任务,到目前为止我一直无法完成。
这是我的:
Q1 = 20e-6
现在这是一个指数数,如果您按原样打印 (Q1),它将显示:2e-5,这很好。从数学上讲。
但是,这是我想用它做的事情:
我希望 Q1 只打印数字 20。然后根据这是否是 e-6 打印 uC 或者如果是 e-9 打印 nC。
为了更好地理解,这里有一个例子:
Q1=20e-6
当我运行 print(Q1) 显示:20uC.
Q2=20e-9
当我运行 print(Q2) 显示:20nC.
你能帮我解决这个问题吗?
你可以尝试拆分字符串:
'20e-9'.split('e')
给予
['20', '-9']
从那时起,您可以在这些值之间插入任何您想要的内容:
('u' if int(a[1]) > 0 else 'n').join(a)
(含 a = '20e-9'.split('e')
)
只需使用 str.replace:
替换指数
q1 = 'XXXXXX'
q1 = q1.replace('e-9', 'nC').replace('e-6', 'uC')
print(q1)
你不能。您正在寻找的行为称为 "monkey patching"。这对于 int 和 float 是不允许的。
可以参考这个Whosebug question
我能想到的唯一方法是创建一个扩展 float 的 class,然后根据您的要求实现一个显示的 __str__
方法。
--------更多解释-----
如果你输入
Q1 = 20e-6
在 python shell 然后
type(Q1)
你会得到一个
float
所以基本上你的Q1被python类型系统
认为是浮动的
当你输入 print(Q1)
float 的 _str__
方法被调用
扩展核心的过程 class 是 "monkey patch" 的一个例子,这就是我所指的。
现在的问题是你不能"monkey patch"(或者如果你愿意的话可以扩展)核心class在python中(你可以在某些语言中,比如在Ruby).
[int、float 等是核心 classes 并用 C 编写,用于最常见的 python 发行版。]
那你是怎么解决的呢?
你需要像这样创建一个新的class
class 指数(浮点数):
def <strong>init</strong>(self, value):
self.value = 值
def <code>__str__
(自我):
return "ok"
x = Exponent(10.0)
print(x) ==> "ok"
希望这对您有所帮助
我建议您使用 si-prefix
。
您可以使用 pip
安装它:
sudo pip install si-prefix
然后你可以使用这样的东西:
from si_prefix import si_format
# precision after the point
# char is the unity's char to be used
def get_format(a, char='C', precision=2):
temp = si_format(a, precision)
try:
num, prefix = temp.split()
except ValueError:
num, prefix = temp , ''
if '.' in num:
aa, bb = num.split('.')
if int(bb) == 0:
num = aa
if prefix:
return num + ' ' + prefix + char
else:
return num
tests = [20e-6, 21.46e05, 33.32e-10, 0.5e03, 0.33e-2, 112.044e-6]
for k in tests:
print get_format(k)
输出:
20 uC
2.15 MC
3.33 nC
500
3.30 mC
112.04 uC
大家好/Python大师
我想知道如何完成以下任务,到目前为止我一直无法完成。
这是我的:
Q1 = 20e-6
现在这是一个指数数,如果您按原样打印 (Q1),它将显示:2e-5,这很好。从数学上讲。
但是,这是我想用它做的事情:
我希望 Q1 只打印数字 20。然后根据这是否是 e-6 打印 uC 或者如果是 e-9 打印 nC。
为了更好地理解,这里有一个例子:
Q1=20e-6
当我运行 print(Q1) 显示:20uC.
Q2=20e-9
当我运行 print(Q2) 显示:20nC.
你能帮我解决这个问题吗?
你可以尝试拆分字符串:
'20e-9'.split('e')
给予
['20', '-9']
从那时起,您可以在这些值之间插入任何您想要的内容:
('u' if int(a[1]) > 0 else 'n').join(a)
(含 a = '20e-9'.split('e')
)
只需使用 str.replace:
替换指数q1 = 'XXXXXX'
q1 = q1.replace('e-9', 'nC').replace('e-6', 'uC')
print(q1)
你不能。您正在寻找的行为称为 "monkey patching"。这对于 int 和 float 是不允许的。
可以参考这个Whosebug question
我能想到的唯一方法是创建一个扩展 float 的 class,然后根据您的要求实现一个显示的 __str__
方法。
--------更多解释-----
如果你输入
Q1 = 20e-6
在 python shell 然后
type(Q1)
你会得到一个
float
所以基本上你的Q1被python类型系统
认为是浮动的当你输入 print(Q1)
float 的 _str__
方法被调用
扩展核心的过程 class 是 "monkey patch" 的一个例子,这就是我所指的。
现在的问题是你不能"monkey patch"(或者如果你愿意的话可以扩展)核心class在python中(你可以在某些语言中,比如在Ruby).
[int、float 等是核心 classes 并用 C 编写,用于最常见的 python 发行版。]
那你是怎么解决的呢?
你需要像这样创建一个新的class
class 指数(浮点数):
def <strong>init</strong>(self, value):
self.value = 值
def <code>__str__
(自我):
return "ok"
x = Exponent(10.0)
print(x) ==> "ok"
希望这对您有所帮助
我建议您使用 si-prefix
。
您可以使用 pip
安装它:
sudo pip install si-prefix
然后你可以使用这样的东西:
from si_prefix import si_format
# precision after the point
# char is the unity's char to be used
def get_format(a, char='C', precision=2):
temp = si_format(a, precision)
try:
num, prefix = temp.split()
except ValueError:
num, prefix = temp , ''
if '.' in num:
aa, bb = num.split('.')
if int(bb) == 0:
num = aa
if prefix:
return num + ' ' + prefix + char
else:
return num
tests = [20e-6, 21.46e05, 33.32e-10, 0.5e03, 0.33e-2, 112.044e-6]
for k in tests:
print get_format(k)
输出:
20 uC
2.15 MC
3.33 nC
500
3.30 mC
112.04 uC