【问题标题】:Formatting a number with a metric prefix? [duplicate]用公制前缀格式化数字? [复制]
【发布时间】:2012-08-29 15:05:26
【问题描述】:

可能重复:
Engineering notation in C#?

metric prefix 是否比 scientific notation 更可取可能还有待商榷,但我认为它有物理单位的用例。

我环顾四周,但似乎 .NET 没有内置类似的东西,还是我弄错了?任何实现这一点的方法都可以。

澄清一下:目标是将任何给定数字显示为浮点数或整数字符串,其值介于 1 和 999 之间,并带有相应的度量前缀。

例如

1000 -> 1k
0.05 -> 50m

四舍五入:

1,436,963 -> 144 万

【问题讨论】:

  • 不太清楚你在这里问什么。请提供输入和预期输出示例。
  • 您的意思是将12345000 转换为12.34M 而不是1.234e007?据我所知,没有内置支持。
  • @DanielHilgarth:添加了一些说明。
  • @veredesmarald:是的,在我看来也是这样。
  • @H.B.:谢谢。不幸的是,我不知道有任何图书馆这样做。

标签: c# .net string formatting numbers


【解决方案1】:

试试这个。我没有测试过,但它应该或多或少是正确的。

public string ToSI(double d, string format = null)
{
    char[] incPrefixes = new[] { 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y' };
    char[] decPrefixes = new[] { 'm', '\u03bc', 'n', 'p', 'f', 'a', 'z', 'y' };

    int degree = (int)Math.Floor(Math.Log10(Math.Abs(d)) / 3);
    double scaled = d * Math.Pow(1000, -degree);

    char? prefix = null;
    switch (Math.Sign(degree))
    {
        case 1:  prefix = incPrefixes[degree - 1]; break;
        case -1: prefix = decPrefixes[-degree - 1]; break;
    }

    return scaled.ToString(format) + prefix;
}

【讨论】:

  • 可能会使用一些错误处理来处理非常小或大的数字,但总的来说它可以工作。
  • 检查函数入口处很有用,如果d为0,否则degree-Infinity值。
  • 我在这里怎么强调都不过分,如果d 已经暗示为零(如@LucaG),这将崩溃。否定 -Infinity 或在这种特殊情况下为 Int32.MinValue 将导致溢出异常。
  • @LPeteR90 随时提交编辑。我自己已经很多年没有接触过 C#了。
【解决方案2】:

根据这些SO Articles 和我自己的研究,没有以公制单位格式化数字的本地方法。您将需要编写自己的方法来解析单位并附加相关的度量标准,例如 MSDN 上此 interface tutorial 的扩展示例。您也可以尝试找到metric units coding library 用于开发。

【讨论】:

    【解决方案3】:

    为每个数字类型创建一个扩展方法。您可以为自定义格式调用 ToStringMetric()。

    public static class Int32Extensions
    {
            public static string ToStringMetric(this Int32 x) { return (x / 1000).ToString() + " K"; }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-20
      • 2011-04-30
      • 2011-08-09
      • 2014-07-10
      • 1970-01-01
      • 2017-06-28
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多