小数点以下2桁だけになるようにC#でa Double
をa にフォーマットするにはどうすればよいString
ですか?
私が使用String.Format("{0:0.00}%", myDoubleValue)
する場合、数値は丸められ、丸めのない単純な切り捨てが必要です。また、コンバージョンをString
文化に敏感にしたいと考えています。
小数点以下2桁だけになるようにC#でa Double
をa にフォーマットするにはどうすればよいString
ですか?
私が使用String.Format("{0:0.00}%", myDoubleValue)
する場合、数値は丸められ、丸めのない単純な切り捨てが必要です。また、コンバージョンをString
文化に敏感にしたいと考えています。
回答:
私は以下を使用します:
double x = Math.Truncate(myDoubleValue * 100) / 100;
例えば:
数が50.947563で、次を使用すると、次のようになります。
- Math.Truncate(50.947563 * 100) / 100;
- Math.Truncate(5094.7563) / 100;
- 5094 / 100
- 50.94
そして、あなたの答えは切り捨てられています、今文字列をフォーマットするには、単に次のようにします:
string s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format
string.Format
文字列をフォーマットするのと同じ手順で、カルチャに依存したフォーマットを実行できます。以下の私の答えを参照してください。
次の例では、数値を丸めていますが、のおかげで小数点以下2桁までしか表示されていません(後続のゼロは削除されています).##
。
decimal d0 = 24.154m;
decimal d1 = 24.155m;
decimal d2 = 24.1m;
decimal d3 = 24.0m;
d0.ToString("0.##"); //24.15
d1.ToString("0.##"); //24.16 (rounded up)
d2.ToString("0.##"); //24.1
d3.ToString("0.##"); //24
http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/
最初に切り捨ててからフォーマットすることをお勧めします:
double a = 123.4567;
double aTruncated = Math.Truncate(a * 100) / 100;
CultureInfo ci = new CultureInfo("de-DE");
string s = string.Format(ci, "{0:0.00}%", aTruncated);
2桁の切り捨てには定数100を使用します。1に続けて、必要な小数点以下の桁と同じ数のゼロを使用します。フォーマット結果を調整するために必要なカルチャ名を使用します。
new CultureInfo("de-DE")
、静的プロパティを使用する必要があると思いますCulture.InvariantCulture
これは古いスレッドであることは知っていますが、これを実行する必要がありました。ここでの他のアプローチは機能しますが、への多くの呼び出しに影響を与えることができる簡単な方法が必要でしたstring.format
。したがって、Math.Truncate
へのすべての呼び出しにを追加することは、実際には適切なオプションではありませんでした。また、フォーマットの一部がデータベースに保存されているため、さらに悪化しました。
したがって、フォーマット文字列に切り捨てを追加できるカスタム形式プロバイダーを作成しました。例:
string.format(new FormatProvider(), "{0:T}", 1.1299); // 1.12
string.format(new FormatProvider(), "{0:T(3)", 1.12399); // 1.123
string.format(new FormatProvider(), "{0:T(1)0,000.0", 1000.9999); // 1,000.9
実装は非常にシンプルで、他の要件に簡単に拡張できます。
public class FormatProvider : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof (ICustomFormatter))
{
return this;
}
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (arg == null || arg.GetType() != typeof (double))
{
try
{
return HandleOtherFormats(format, arg);
}
catch (FormatException e)
{
throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
}
}
if (format.StartsWith("T"))
{
int dp = 2;
int idx = 1;
if (format.Length > 1)
{
if (format[1] == '(')
{
int closeIdx = format.IndexOf(')');
if (closeIdx > 0)
{
if (int.TryParse(format.Substring(2, closeIdx - 2), out dp))
{
idx = closeIdx + 1;
}
}
else
{
throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
}
}
}
double mult = Math.Pow(10, dp);
arg = Math.Truncate((double)arg * mult) / mult;
format = format.Substring(idx);
}
try
{
return HandleOtherFormats(format, arg);
}
catch (FormatException e)
{
throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
}
}
private string HandleOtherFormats(string format, object arg)
{
if (arg is IFormattable)
{
return ((IFormattable) arg).ToString(format, CultureInfo.CurrentCulture);
}
return arg != null ? arg.ToString() : String.Empty;
}
}
私はXamarinフォームでその問題を抱えていて、これで解決しました:
percent.ToString("0.##"+"%")
独自のIFormatProviderを記述することもできますが、最終的には実際の切り捨てを行う方法を考える必要があると思います。
.NET Frameworkは、カスタムフォーマットもサポートしています。これには通常、IFormatProviderとICustomFormatterの両方を実装するフォーマットクラスの作成が含まれます。(msdn)
少なくとも、簡単に再利用できます。
独自のIFormatProvider / ICustomFormatterを実装する方法についての記事は、こちらのCodeProjectにあります。この場合、既存の数値フォーマットを「拡張」するのが最善の策かもしれません。難しく見えません。
以下は、Stringのプロパティを使用する表示のみに使用できます。
double value = 123.456789;
String.Format("{0:0.00}", value);
また、システムのCultureInformationにも注意してください。ここで丸めなしの私の解決策。
この例では、変数MyValueをdoubleとして定義する必要があります。結果として、文字列変数NewValueでフォーマットされた値を取得します。
注-C#のusingステートメントも設定します。
using System.Globalization;
string MyFormat = "0";
if (MyValue.ToString (CultureInfo.InvariantCulture).Contains (CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
{
MyFormat += ".00";
}
string NewValue = MyValue.ToString(MyFormat);