【问题标题】:Format decimal c# - Keep last zero格式化十进制 c# - 保留最后一个零
【发布时间】:2012-07-25 21:02:56
【问题描述】:

我一直在寻找这个,但似乎找不到答案。我有以下小数以及我想要的 String.Format 的相应输出

100.00 -> 100
100.50 -> 100.50
100.51 -> 100.51

我的问题是,我似乎无法找到一种格式,既能在 100.50 末尾保留 0,又能从 100 中删除 2 个零。

非常感谢任何帮助。

编辑 为了更清楚。我有十进制类型的变量,它们只会是小数点后 2 位。基本上我想显示 2 位小数,如果它们存在或没有,我不想在 100.50 变为 100.5 的情况下显示 1 位小数

【问题讨论】:

  • 你想让“100.50”变成“1.50”吗?

标签: c# string-formatting


【解决方案1】:

据我所知,没有这种格式。您必须手动执行此操作,例如:

String formatString = Math.Round(myNumber) == myNumber ? 
                      "0" :     // no decimal places
                      "0.00";   // two decimal places

【讨论】:

  • @MarkusJarderot:确实。只有 OP 可以回答这是否是所需的行为。他没有包含更多数字的示例。
  • 迄今为止最好的解决方案。谢谢你
【解决方案2】:

你可以用这个:

string s = number.ToString("0.00");
if (s.EndsWith("00"))
{
    s = number.ToString("0");
}

【讨论】:

  • 与 tobias86 的回答一样,这不适用于所有机器,因为有些机器使用逗号作为小数分隔符。
  • 谢谢马克。抱歉应该更清楚地了解文化,在这种情况下我可以忽略它。这非常有效。
  • s = s.Substring(0, s.Length - 3) 替换为s = number.ToString("0") 可能稍微安全一些,以防万一可能存在使用多字符小数点的奇怪文化。诚然,这似乎不太可能,但作为一个原则问题,最好尽可能少做假设。
  • @IlmariKaronen:哦,非常好的解决方案!感谢您的建议。
  • @IlmariKaronen:因为我们谈论的是奇怪的文化,而不是依赖假设......如果我们假设 a) 输入可能是负数并且 b) NumberNegativePattern 是 3,那么我的解决方案再次不起作用!唉……我想有时候做一些假设比试图解决全世界的所有问题更简单。
【解决方案3】:

测试你的数字是否为整数,并根据格式使用:

string.Format((number % 1) == 0 ? "{0}": "{0:0.00}", number)

【讨论】:

    【解决方案4】:

    好的,这伤害了我的眼睛,但应该给你你想要的:

    string output = string.Format("{0:N2}", amount).Replace(".00", "");
    

    更新:我更喜欢 Heinzi 的回答。

    【讨论】:

    • 这在我的机器上不起作用,其中逗号是小数的默认值。 :)
    • @AndersHolmström True...我没想过本地化。
    【解决方案5】:

    这种方法将在应用指定的文化的同时达到预期的结果:

    decimal a = 100.05m;
    decimal b = 100.50m;
    decimal c = 100.00m;
    
    CultureInfo ci = CultureInfo.GetCultureInfo("de-DE");
    
    string sa = String.Format(new CustomFormatter(ci), "{0}", a); // Will output 100,05
    string sb = String.Format(new CustomFormatter(ci), "{0}", b); // Will output 100,50
    string sc = String.Format(new CustomFormatter(ci), "{0}", c); // Will output 100
    

    您可以将文化替换为 CultureInfo.CurrentCulture 或任何其他文化以满足您的需求。

    CustomFormatter 类是:

    public class CustomFormatter : IFormatProvider, ICustomFormatter
    {
        public CultureInfo Culture { get; private set; }
    
        public CustomFormatter()
            : this(CultureInfo.CurrentCulture)
        { }
    
        public CustomFormatter(CultureInfo culture)            
        {
            this.Culture = culture;
        }
    
        public object GetFormat(Type formatType)
        {
            if (formatType == typeof(ICustomFormatter))
                return this;
    
            return null;
        }
    
        public string Format(string format, object arg, IFormatProvider formatProvider)
        {
            if (formatProvider.GetType() == this.GetType())
            {
                return string.Format(this.Culture, "{0:0.00}", arg).Replace(this.Culture.NumberFormat.NumberDecimalSeparator + "00", "");
            }
            else
            {
                if (arg is IFormattable)
                    return ((IFormattable)arg).ToString(format, this.Culture);
                else if (arg != null)
                    return arg.ToString();
                else
                    return String.Empty;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2020-07-21
      • 1970-01-01
      • 2016-11-13
      • 2023-02-22
      相关资源
      最近更新 更多