【问题标题】:How to convert decimal to string without part after floating point, if it's zero, and in specific currency format?如果浮点数为零,如何以特定货币格式将十进制转换为字符串?
【发布时间】:2012-12-12 14:09:31
【问题描述】:

例如我有几个小数:

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);

也不行,我得到1c 或1,1c

是否有一些不棘手的方法来获得我需要的格式?

【问题讨论】:

    标签: c# formatting tostring


    【解决方案1】:

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

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

    如果 d 可能有超过 2 个小数位,并且您不想为任何会舍入为 .00try 的值显示小数

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

    作为旁注,您可以避免将常量定义为十进制文字:

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

    【讨论】:

      【解决方案2】:
      string res = @decimal.ToString(@decimal == decimal.Truncate(@decimal) ? "c0" : "c", culture);
      

      【讨论】:

        【解决方案3】:

        也许您可以简单地附加货币符号:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-19
          • 1970-01-01
          • 2017-04-04
          • 2020-05-22
          • 2012-01-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多