在我们的程序中,我们需要显示大约数百万到百万的值。由于用户要求,用户只想看到可被 3 整除的指数值。意味着要显示的值应如下所示
- 1e0
- 10e0
- 100e0
- 1e3
- 10e3
- 100e3
- 1e6
等等。我想改变遇到数千的指数,以简化用户区分千比特、兆比特、千兆比特的方式。
是否可以使用格式字符串来获得这种效果?
在我们的程序中,我们需要显示大约数百万到百万的值。由于用户要求,用户只想看到可被 3 整除的指数值。意味着要显示的值应如下所示
等等。我想改变遇到数千的指数,以简化用户区分千比特、兆比特、千兆比特的方式。
是否可以使用格式字符串来获得这种效果?
像这样的东西
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);
像尾数和指数这样的变量有更好的名称,但它可以解决问题
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);
}
我不喜欢这样涉及字符串操作的解决方案,所以我在这里用数学方法计算了这两个部分。
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);
}