ipython:打印带有千位分隔符的数字
ipython: print numbers with thousands separator
我在 Debian 10
.
上使用 ipython
5.8.0
这是输出的样子:
In [1]: 50*50
Out[1]: 2500
是否可以配置 ipython
打印所有带有千位分隔符的数字?即:
In [1]: 50*50
Out[1]: 2'500
In [2]: 5000*5000
Out[2]: 25'000'000
也许,是否有可能让 ipython
也理解输入的千位分隔符?
In [1]: 5'000*5'000
Out[1]: 25'000'000
更新
@Chayim Friedman
接受的答案适用于整数,但不适用于浮点数:
In [1]: 500.1*500
Out[1]: 250050.0
此外,当它工作时,它使用 ,
作为千位分隔符的字符:
In [1]: 500*500
Out[1]: 250,000
我可以改用 '
吗?
更新后:您可以继承 int:
class Int(int):
def __repr__(self):
return "{:,}".format(self)
Int(1000)
# 1,000
我不相信你可以在不重写 iPython 解释器的情况下实现你正在寻找的 all,这意味着改变 Python 语言规范, 以便能够输入带有嵌入 '
字符的数字并忽略它们。但是你可以实现其中的一些。 Subclassing int
class 是一个好的开始。但是您还应该重载您计划使用的各种运算符。例如:
class Integer(int):
def __str__(self):
# if you want ' as the separator:
return "{:,}".format(self).replace(",", "'")
def __add__(self, x):
return Integer(int(self) + x)
def __mul__(self, x):
return Integer(int(self) * x)
"""
define other operations: __sub__, __floordiv__, __mod__, __neg__, etc.
"""
i1 = Integer(2)
i2 = Integer(1000) + 4.5 * i1
print(i2)
print(i1 * (3 + i2))
打印:
1'009
2'024
更新
对于 Python 3.7,您似乎需要覆盖 __str__
方法而不是 __repr__
方法。这适用于 Python 3.8,也适用于更高版本。
更新 2
import locale
#locale.setlocale(locale.LC_ALL, '') # probably not required
print(locale.format_string("%d", 1255000, grouping=True).replace(",", "'"))
打印:
1'255'000
如果你有软件包 Babel
from the PyPi
存储库:
from babel import Locale
from babel.numbers import format_number
locale = Locale('en', 'US')
locale.number_symbols['group'] = "'"
print(format_number(1255000, locale='en_US'))
打印:
1'255'000
或者,如果您更愿意为此目的定制一个语言环境,而不修改标准 en_US
语言环境。 这还展示了如何解析输入值:
from copy import deepcopy
from babel import Locale
from babel.numbers import format_number, parse_number
my_locale = deepcopy(Locale('en', 'US'))
my_locale.number_symbols['group'] = "'"
print(format_number(1255000, locale=my_locale))
print(parse_number("1'125'000", locale=my_locale))
打印:
1'255'000
1125000
基于PEP-0378,可以使用如下代码:
a = 1200
b = 500
c = 10
#res = a
#res = a*b
res = a*b*c
dig = len(str(res)) # to figure out how many digits are required in result
print(format(res, "{},d".format(dig)))
它将产生:
6,000,000
在输入中使用 '
作为千位分隔符是很有问题的,因为 Python 使用 '
来分隔字符串,但是您可以使用 _
(PEP 515, Underscores in Numeric Literals ):
关于输出,这有点难,但可以使用 IPython 扩展来完成。
将以下 Python 代码放在 ~/.ipython/extensions/thousands_separator.py 的新文件中:
default_int_printer = None
def print_int(number, printer, cycle):
printer.text(f'{number:,}') # You can use `'{:,}'.format(number)` if you're using a Python version older than 3.6
def load_ipython_extension(ipython):
global default_int_printer
default_int_printer = ipython.display_formatter.formatters['text/plain'].for_type(int, print_int)
def unload_ipython_extension(ipython):
ipython.display_formatter.formatters['text/plain'].for_type(int, default_int_printer)
此代码告诉 IPython 将默认的 int
格式化程序替换为加载此扩展时打印千位分隔符的格式化程序,并在卸载时恢复原始格式。
编辑: 如果您想要不同的分隔符,例如 '
,请将 f'{number:,}'
替换为 f'{number:,}'.replace(',', "'")
。
您可以使用魔术命令 %load_ext thousands_separator
加载扩展并使用 %unload_ext thousands_separator
卸载它,但如果您始终需要它,可以将它放在默认配置文件中。
运行终端中的以下代码:
ipython3 profile create
它会报告创建了一个文件~/.ipython/profile_default/ipython_config.py。输入它,然后搜索以下字符串:
## A list of dotted module names of IPython extensions to load.
#c.InteractiveShellApp.extensions = []
将其替换为以下内容:
# A list of dotted module names of IPython extensions to load.
c.InteractiveShellApp.extensions = [
'thousands_separator'
]
这告诉 IPython 默认加载此扩展程序。
完成!
编辑: 我看到你想 a) 使用 '
作为分隔符,b) 对浮点数做同样的事情:
使用不同的分隔符非常简单:只需 str.replace()
:
def print_int(number, printer, cycle):
printer.text(f'{number:,}'.replace(',', "'"))
对浮点数做同样的事情也很简单:只需设置 print_int
就可以将浮点数打印到。我还建议将名称更改为 print_number
.
最终代码:
default_int_printer = None
default_float_printer = None
def print_number(number, printer, cycle):
printer.text(f'{number:,}'.replace(',', "'"))
def load_ipython_extension(ipython):
global default_int_printer
global default_float_printer
default_int_printer = ipython.display_formatter.formatters['text/plain'].for_type(int, print_number)
default_float_printer = ipython.display_formatter.formatters['text/plain'].for_type(float, print_number)
def unload_ipython_extension(ipython):
ipython.display_formatter.formatters['text/plain'].for_type(int, default_int_printer)
ipython.display_formatter.formatters['text/plain'].for_type(float, default_float_printer)
我在 Debian 10
.
ipython
5.8.0
这是输出的样子:
In [1]: 50*50
Out[1]: 2500
是否可以配置 ipython
打印所有带有千位分隔符的数字?即:
In [1]: 50*50
Out[1]: 2'500
In [2]: 5000*5000
Out[2]: 25'000'000
也许,是否有可能让 ipython
也理解输入的千位分隔符?
In [1]: 5'000*5'000
Out[1]: 25'000'000
更新
@Chayim Friedman
接受的答案适用于整数,但不适用于浮点数:
In [1]: 500.1*500
Out[1]: 250050.0
此外,当它工作时,它使用 ,
作为千位分隔符的字符:
In [1]: 500*500
Out[1]: 250,000
我可以改用 '
吗?
更新后:您可以继承 int:
class Int(int):
def __repr__(self):
return "{:,}".format(self)
Int(1000)
# 1,000
我不相信你可以在不重写 iPython 解释器的情况下实现你正在寻找的 all,这意味着改变 Python 语言规范, 以便能够输入带有嵌入 '
字符的数字并忽略它们。但是你可以实现其中的一些。 Subclassing int
class 是一个好的开始。但是您还应该重载您计划使用的各种运算符。例如:
class Integer(int):
def __str__(self):
# if you want ' as the separator:
return "{:,}".format(self).replace(",", "'")
def __add__(self, x):
return Integer(int(self) + x)
def __mul__(self, x):
return Integer(int(self) * x)
"""
define other operations: __sub__, __floordiv__, __mod__, __neg__, etc.
"""
i1 = Integer(2)
i2 = Integer(1000) + 4.5 * i1
print(i2)
print(i1 * (3 + i2))
打印:
1'009
2'024
更新
对于 Python 3.7,您似乎需要覆盖 __str__
方法而不是 __repr__
方法。这适用于 Python 3.8,也适用于更高版本。
更新 2
import locale
#locale.setlocale(locale.LC_ALL, '') # probably not required
print(locale.format_string("%d", 1255000, grouping=True).replace(",", "'"))
打印:
1'255'000
如果你有软件包 Babel
from the PyPi
存储库:
from babel import Locale
from babel.numbers import format_number
locale = Locale('en', 'US')
locale.number_symbols['group'] = "'"
print(format_number(1255000, locale='en_US'))
打印:
1'255'000
或者,如果您更愿意为此目的定制一个语言环境,而不修改标准 en_US
语言环境。 这还展示了如何解析输入值:
from copy import deepcopy
from babel import Locale
from babel.numbers import format_number, parse_number
my_locale = deepcopy(Locale('en', 'US'))
my_locale.number_symbols['group'] = "'"
print(format_number(1255000, locale=my_locale))
print(parse_number("1'125'000", locale=my_locale))
打印:
1'255'000
1125000
基于PEP-0378,可以使用如下代码:
a = 1200
b = 500
c = 10
#res = a
#res = a*b
res = a*b*c
dig = len(str(res)) # to figure out how many digits are required in result
print(format(res, "{},d".format(dig)))
它将产生:
6,000,000
在输入中使用 '
作为千位分隔符是很有问题的,因为 Python 使用 '
来分隔字符串,但是您可以使用 _
(PEP 515, Underscores in Numeric Literals ):
关于输出,这有点难,但可以使用 IPython 扩展来完成。
将以下 Python 代码放在 ~/.ipython/extensions/thousands_separator.py 的新文件中:
default_int_printer = None
def print_int(number, printer, cycle):
printer.text(f'{number:,}') # You can use `'{:,}'.format(number)` if you're using a Python version older than 3.6
def load_ipython_extension(ipython):
global default_int_printer
default_int_printer = ipython.display_formatter.formatters['text/plain'].for_type(int, print_int)
def unload_ipython_extension(ipython):
ipython.display_formatter.formatters['text/plain'].for_type(int, default_int_printer)
此代码告诉 IPython 将默认的 int
格式化程序替换为加载此扩展时打印千位分隔符的格式化程序,并在卸载时恢复原始格式。
编辑: 如果您想要不同的分隔符,例如 '
,请将 f'{number:,}'
替换为 f'{number:,}'.replace(',', "'")
。
您可以使用魔术命令 %load_ext thousands_separator
加载扩展并使用 %unload_ext thousands_separator
卸载它,但如果您始终需要它,可以将它放在默认配置文件中。
运行终端中的以下代码:
ipython3 profile create
它会报告创建了一个文件~/.ipython/profile_default/ipython_config.py。输入它,然后搜索以下字符串:
## A list of dotted module names of IPython extensions to load.
#c.InteractiveShellApp.extensions = []
将其替换为以下内容:
# A list of dotted module names of IPython extensions to load.
c.InteractiveShellApp.extensions = [
'thousands_separator'
]
这告诉 IPython 默认加载此扩展程序。
完成!
编辑: 我看到你想 a) 使用 '
作为分隔符,b) 对浮点数做同样的事情:
使用不同的分隔符非常简单:只需 str.replace()
:
def print_int(number, printer, cycle):
printer.text(f'{number:,}'.replace(',', "'"))
对浮点数做同样的事情也很简单:只需设置 print_int
就可以将浮点数打印到。我还建议将名称更改为 print_number
.
最终代码:
default_int_printer = None
default_float_printer = None
def print_number(number, printer, cycle):
printer.text(f'{number:,}'.replace(',', "'"))
def load_ipython_extension(ipython):
global default_int_printer
global default_float_printer
default_int_printer = ipython.display_formatter.formatters['text/plain'].for_type(int, print_number)
default_float_printer = ipython.display_formatter.formatters['text/plain'].for_type(float, print_number)
def unload_ipython_extension(ipython):
ipython.display_formatter.formatters['text/plain'].for_type(int, default_int_printer)
ipython.display_formatter.formatters['text/plain'].for_type(float, default_float_printer)