C是什么物理量:具有 SI前缀自动缩放功能的漂亮打印物理量

我正在寻找一种优雅的方式来打印具有最合适前缀的物理量(如12300 grams12.3 kilograms)。

def pprint_units(v, unit_str, num_fmt="{:.3f}"):
    """ Pretty printer for physical quantities """
    # prefixes and power:
    u_pres = [(-9, u'n'), (-6, u'µ'), (-3, u'm'), (0, ''),
              (+3, u'k'), (+6, u'M'), (+9, u'G')]
    if v == 0:
        return num_fmt.format(v) + " " + unit_str
    p = np.log10(1.0*abs(v))
    p_diffs = np.array([(p - u_p[0]) for u_p in u_pres])
    idx = np.argmin(p_diffs * (1+np.sign(p_diffs))) - 1
    u_p = u_pres[idx if idx >= 0 else 0]
    return num_fmt.format(v / 10.**u_p[0]) + " " + u_p[1]  + unit_str
for v in [12e-6, 3.4, .123, 3452]:
    print(pprint_units(v, 'g', "{: 7.2f}"))
# Prints:
#  12.00 µg
#   3.40 g
# 123.00 mg
#   3.45 kg

查看unitsPint,我找不到该功能。是否有其他库可以更全面地排版 SI 单元(以处理特殊情况,如角度,温度等)?

10

我曾经解决过同样的问题。和 IMHO 更优雅。虽然没有度或温度。

def sign(x, value=1):
    """Mathematical signum function.
    :param x: Object of investigation
    :param value: The size of the signum (defaults to 1)
    :returns: Plus or minus value
    """
    return -value if x < 0 else value
def prefix(x, dimension=1):
    """Give the number an appropriate SI prefix.
    :param x: Too big or too small number.
    :returns: String containing a number between 1 and 1000 and SI prefix.
    """
    if x == 0:
        return "0  "
    l = math.floor(math.log10(abs(x)))
    if abs(l) > 24:
        l = sign(l, value=24)
    div, mod = divmod(l, 3*dimension)
    return "%.3g %s" % (x * 10**(-l + mod), " kMGTPEZYyzafpnµm"[div])
CommaCalc

这样的程度:

def intfloatsplit(x):
    i = int(x)
    f = x - i
    return i, f
def prettydegrees(d):
    degrees, rest = intfloatsplit(d)
    minutes, rest = intfloatsplit(60*rest)
    seconds = round(60*rest)
    return "{degrees}° {minutes}' {seconds}''".format(**locals())
edit:

增加单位尺寸

>>> print(prefix(0.000009, 2))
9 m
>>> print(prefix(0.9, 2))
9e+05 m

第二个输出不是很漂亮,我知道。您可能想要编辑格式化字符串。

edit:

解析输入,如0.000009 m²。适用于小于 10 的尺寸。

import unicodedata
def unitprefix(val):
    """Give the unit an appropriate SI prefix.
    :param val: Number and a unit, e.g. "0.000009 m²"
    """
    xstr, unit = val.split(None, 2)
    x = float(xstr)
    try:
        dimension = unicodedata.digit(unit[-1])
    except ValueError:
        dimension = 1
    return prefix(x, dimension) + unit
2

decimal模块可以提供帮助。Morover 它可以防止错误的浮点舍入。

import decimal
prefix="yzafpnµm kMGTPEZY"
shift=decimal.Decimal('1E24')
def prettyprint(x,baseunit):
    d=(decimal.Decimal(str(x))*shift).normalize()
    m,e=d.to_eng_string().split('E')    
    return m + " " + prefix[int(e)//3] + baseunit
print(prettyprint (12300,'g'))
>>>> '12.3 kg'

它可以调整为管理格式。

2

如果您有兴趣使用Pint,请查看to_compact方法。

下面是来自 OP 的示例的实现:

import pint
ureg = pint.UnitRegistry()
for v in [12e-6, 3.4, .123, 3452]:
    print('{:~7.2f}'.format((v * ureg('g')).to_compact()))   
>>> 12.00 ug
>>> 3.40 g
>>> 123.00 mg
>>> 3.45 kg

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(876)
Usb修复工具:是否有任何docx修复工具提供有意义的错误消息
上一篇
云服务器怎么赚钱:无服务器 vs无服务器云(serverless vs serverless-stack)
下一篇

相关推荐

  • comeandgetyourlove音乐爱就在你身边

    Come and Get Your Love是一首热门的歌曲,由美国摇滚乐队Redbone演唱。这首歌曲于1974年发行,被收录在他们的专辑《Wovoka》中。歌曲以放克曲风为主,旋律活泼,曲调悠扬,歌词朗朗上口,深受歌迷喜爱。…

    2023-06-29 07:47:31
    0 75 39
  • codeblocks无法编译运行:Codeblocks无法编译运行的解决方案

    codeblocks无法编译运行的原因可能有很多,下面以一段简单的C语言代码为例,来说明codeblocks无法编译运行的情况。…

    2023-07-11 08:01:55
    0 20 93
  • gitlab ci 自动化部署:使用 Gitlab CI 自动化部署提升开发效率

    GitLab CI 自动化部署是一种基于 GitLab CI/CD 的自动化部署方案,可以实现快速、可靠的部署流程。它将代码提交、构建、测试、部署等步骤集成在一起,使得开发者可以更加轻松地完成部署工作。下面是一个示例 .gitlab-ci.yml 文件,可以帮助你实现 GitLab CI 自动化部署:…

    2023-05-20 05:45:38
    0 28 58
  • xl和xe汽车cvt:探索XL和XE汽车的CVT技术优势

    XL和XE汽车CVT是一种变速器,它使用液力变矩器代替传统的机械变速器,以达到更高的效率。它的工作原理是,当发动机输出功率时,液力变矩器就会将这些功率转换为液压能量,然后将能量传递到变速器的输出轴上,从而实现变速。…

    2023-05-16 07:36:03
    0 90 88
  • js添加css:This is a Title

    使用js添加css可以通过修改元素的style属性来实现,具体代码如下:…

    2023-05-27 12:30:24
    0 77 55
  • css 字符间距:### 世界上最美的地方

    示例示例CSS 字符间距是指在文本中的字符之间添加间距,以增强文本的可读性。它可以使文本更容易阅读,也可以使文本看起来更美观。代码示例:…

    2023-04-15 08:45:29
    0 41 47
  • git 删除commit记录:回滚Git Commit记录

    git删除commit记录可以使用git reset命令。使用方法:…

    2023-07-07 04:31:44
    0 65 72
  • java实现tcp:使用Java实现TCP网络编程

    TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。它使用三次握手来建立可靠的连接,并且在数据传输期间可以检测丢失的数据包并重新发送。…

    2023-01-31 10:33:14
    0 18 98

发表评论

登录 后才能评论

评论列表(45条)