14

可能重复:
C# 中的工程符号?

公制前缀是否比科学记数法更可取可能有争议,但我认为它有物理单位的用例。

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

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

例如

1000 -> 1k
0.05 -> 50m

进行一些舍入:

1,436,963 -> 144 万

4

3 回答 3

13

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

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;
}
于 2012-08-29T15:41:52.933 回答
1

根据这些SO 文章和我自己的研究,没有以公制单位格式化数字的本地方法。您将需要编写自己的方法来解析单位并附加相关的度量度量,例如MSDN上此接口教程的扩展示例。您还可以尝试查找用于开发的公制单位编码库。

于 2012-08-29T15:19:37.460 回答
1

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

public static class Int32Extensions
{
        public static string ToStringMetric(this Int32 x) { return (x / 1000).ToString() + " K"; }
}
于 2012-08-29T15:44:39.620 回答