【问题标题】:Perl module to convert between MB/GB/TB without converting to bytes first?Perl 模块在 MB/GB/TB 之间转换而不先转换为字节?
【发布时间】:2013-08-01 04:17:02
【问题描述】:

我正在尝试通过将可用物理扩展区的数量乘以扩展区大小来计算 LVM 物理卷上的可用空间,例如:

3623365 free extents * 4.00 MB each = 13.8 TB

我使用Number::Format 将扩展区大小转换为字节并将乘法的结果转换回人类可读的字符串,但不支持 TB 和更高,所以我最终得到更长、更不可读的@ 987654329@.

根据文档,不支持 TB 及以上的原因是因为 32 位系统上的整数溢出,这让我想知道是否应该在不使用 Math::BigInt 之类的情况下将任意大数相乘。我看到Number::Bytes::Human 支持高达 YB(yottabytes)的数字,但它仍处于 alpha 阶段,所以我不愿在生产代码中使用它。

我的下一个想法是,当我可以计算出以 MB 为单位的可用空间然后转换为 TB 时,为什么还要先转换为字节?不幸的是,Number::FormatNumber::Bytes::Human 似乎都不支持从一个“后缀”到另一个的转换,例如MB-> 结核病。是否有执行此操作的现有模块?我真的很喜欢 Number::FormatNumber::Bytes::Human 如何处理 SI/非 SI 单位(MB 与 MiB),允许您设置精度等,因此如果有类似的全功能模块,我会犹豫推出我自己的解决方案已经做到了。

编辑: 范围大小并不总是以 MB 为单位,可用空间也不总是以 TB 为单位,所以我不是在问如何从 MB 转换为 TB(这将是微不足道的)。我am询问是否有任何现有模块可以从一个 [任意] 后缀转换为另一个而无需先转换为字节。

【问题讨论】:

    标签: perl module byte number-formatting


    【解决方案1】:

    在不通过字节的情况下从 MB 转换为 TB:

    TB 数 = MB 数 *(1 TB 中的字节数/1 MB 中的字节数)


    更新: 概括:

    新单元数 = 旧单元数 *(1 个新单元中的字节数 / 1 个旧单元中的字节数)

    【讨论】:

    • 对不起,我的问题应该更清楚...我不会总是从 MB 转换,也不会总是希望以 TB 告终。我希望我的结果字符串尽可能短,这意味着使用适当的后缀(GB、TB、你有什么)。
    • @ThisSuitIsBlackNot:已更新
    • 我认为您不太了解我的问题。我有一个值,其单位在运行时之前是未知的(可能是 kB、GiB、TB 等)。然后将该值乘以一个整数,该整数在运行时之前也是未知的。您如何确定应该使用哪些单位来尽可能简洁地表达结果(例如 9.8GB 而不是 10,000MB)? PerlMonks 上有一些简单的解决方案,但它们没有考虑兆字节与兆字节之类的东西。因此我的问题。
    • 您的来源单位将非常有限,也许有很多可能性。用正则表达式提取它是微不足道的。乘法后,您的值在您想要的范围内、高于或低于(1 到 1000 或 1024)。根据需要进行缩放。
    猜你喜欢
    • 2012-08-02
    • 2015-05-18
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多