私たちのプログラムでは、表示する必要がある数百万から数百万の値があります。ユーザーの要件により、ユーザーは 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);
mantissa e exponent のような変数のより良い名前がありますが、それはうまくいきます
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);
}