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

我不知道可以做到这一点的单个格式字符串,但一种方法是:

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

如果 d 可能有超过 2 位小数,并且您不想显示任何要四舍五入.00尝试的值的小数

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

As a side note you can avoid a cast be defining the constants as decimal literals:

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

Perhaps you can simply append the currency symbol:

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 回答