1

たとえば、いくつかの小数があります。

decimal[] arr = { 1, (decimal)1.1, (decimal)1.00 };

これらはロシア ルーブルでの価格を表しています。

var overrideCulture = new System.Globalization.CultureInfo("ru-RU");

私が使用するとき:

foreach (var d in arr)
{
     string s = d.ToString("c", overrideCulture);
     Console.WriteLine(s);
}

私は得る

1,00p.
1,10p.
1,00p.

結果として、しかし私が必要とするのは、分数がゼロの場合、それを表示したくないが、通貨形式を維持する必要があるということです。この例では、取得したい:

1p.
1,10p.
1p.

次のような分数を簡単に取得できます。

foreach (var d in arr)
{
     string s = d.ToString("#.##", overrideCulture);
     Console.WriteLine(s);
}

ただし、通貨形式は失われます。

string s = d.ToString("#.##c", overrideCulture);

また、動作しません1c1,1c

私が必要とするようなフォーマットを取得するためのトリッキーではない方法はありますか?

4

3 に答える 3

3

それを行う単一のフォーマット文字列はわかりませんが、1つの方法は次のとおりです。

string format = (d == Math.Round(d,0)) ? "c0" : "c";
string s = d.ToString(format, overrideCulture);

.00dの小数点以下の桁数が2を超える可能性があり、丸めて試行する値の小数点以下を表示したくない場合

string format = (Math.Round(d,2) == Math.Round(d,0)) ? "c0" : "c";
string s = d.ToString(format, overrideCulture);

補足として、定数を10進リテラルとして定義するキャストを回避できます。

decimal[] arr = { 1m, 1.1m, 1.00m };
于 2012-12-12T14:15:01.057 に答える
1
string res = @decimal.ToString(@decimal == decimal.Truncate(@decimal) ? "c0" : "c", culture);
于 2012-12-12T14:18:25.600 に答える
0

おそらく、通貨記号を追加するだけで済みます。

string symbol = overrideCulture.NumberFormat.CurrencySymbol;
foreach (var d in arr)
{
    string s = d.ToString("#.##", overrideCulture) + symbol;
    Console.WriteLine(s);
}
于 2012-12-12T14:23:48.267 に答える