Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用公制前缀格式化数字?_C#_.net_String_Formatting_Numbers - Fatal编程技术网

C# 使用公制前缀格式化数字?

C# 使用公制前缀格式化数字?,c#,.net,string,formatting,numbers,C#,.net,String,Formatting,Numbers,可能重复: a是否比a更可取可能会引起争论,但我认为它对于物理单位有其使用案例 我环顾了一下四周,但似乎.NET没有任何类似的内置功能,或者我错了吗?任何实现这一目标的方法都是好的 澄清一下:目标是将任何给定的数字显示为浮点或整数字符串,其值介于1和999之间,并带有相应的度量前缀 e、 g 1000->1k 0.05->50米 四舍五入: 1436963->1.44M根据这些以及我自己的研究,没有一种以公制单位格式化数字的原生方法。您需要编写自己的方法来解析单位并附加相关度量,例如MSDN中

可能重复:

a是否比a更可取可能会引起争论,但我认为它对于物理单位有其使用案例

我环顾了一下四周,但似乎.NET没有任何类似的内置功能,或者我错了吗?任何实现这一目标的方法都是好的

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

e、 g

1000->1k
0.05->50米

四舍五入:


1436963->1.44M

根据这些以及我自己的研究,没有一种以公制单位格式化数字的原生方法。您需要编写自己的方法来解析单位并附加相关度量,例如MSDN中的一个扩展示例。您还可以尝试找到用于开发的。我还没有测试过它,但它应该或多或少是正确的

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;
}

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

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

现在还不清楚你在问什么。请提供输入和预期输出的示例。您的意思是将
12345000
转换为
12.34M
,而不是
1.234e007
?据我所知,这并没有内置的支持。@DanielHilgarth:补充了一些说明。@Veredesmarld:是的,对我来说也是这样。@H.B:谢谢。不幸的是,我不知道有哪个库会这样做。可能会对非常小或很大的数字使用一些错误处理,但总的来说它是有效的。如果
d
为0,则在函数项处检查是有用的,因为除此之外,
degree
-Infinity
值。我在这里无法强调,如果
d
为零(正如@LucaG)已经暗示的那样,这将崩溃。求反
-Infinity
或在这种特殊情况下
Int32.MinValue
将导致溢出异常。@LPeteR90请随意提交编辑。我自己已经好几年没碰过C#了。