仅将指数限制为特定的权力

时间:2013-02-21 17:25:29

标签: c# string-formatting

在我们的计划中,我们需要显示大约数百万到毫米的值。由于用户要求,用户只希望看到可被3分割的指数值,意味着要显示的值应该是

  • 1E0
  • 10e0
  • 100e0
  • 1E3
  • 10E3
  • 100e3
  • 1E6

等等。我想改变遇到数千个的指数,以简化用户区分千比特,兆比特,千兆比特的方式。

是否可以使用格式字符串获得此效果?

3 个答案:

答案 0 :(得分:0)

像这样的东西

int val = 123456789;
var order = (int)Math.Log10(val);
var auxOrder = order/3;
var charToShow = val.ToString().Length - (auxOrder *3);
var result = val.ToString().Substring(0, charToShow )+"e"+(auxOrder *3);

像尾数e指数这样的变量有更好的名称,但是它会起作用

答案 1 :(得分:0)

来自Servy的代码是起点,但它仍然有一些错误,不适用于负值或非常小的值。我像这样扩展它

        double exponent = Math.Log10(Math.Abs(val));

        var negcompensator = 0;
        if (exponent < 0)
        {
            negcompensator = -1;
        }
        int displayExponent = (int)(Math.Truncate((exponent + negcompensator) / 3)) * 3;

        if (displayExponent==0 || double.IsInfinity(exponent))
        {
            return val.ToString("###0.##");
        }
        else
        {
            var displayValue = (val / Math.Pow(10, displayExponent));
            return string.Format("{0}e{1}", displayValue, displayExponent);
        }

答案 2 :(得分:-2)

我不喜欢这样涉及字符串操作的解决方案,所以我在这里以数学方式计算了两个部分。

public static string MyFormat(int value)
{
    double exponent = Math.Log10(value);
    int displayExponent = (int)(exponent / 3);

    int displayValue = (int)(value / Math.Pow(exponent, 10));
    return string.Format("{0}e{1}", displayValue, displayExponent);
}