【问题标题】:Show 2 decimal only if the decimal is not .00仅当小数不是 .00 时才显示 2 个小数
【发布时间】:2020-12-22 02:18:36
【问题描述】:

所以,我有一个要求,只有当小数本身的值不是 .00 时才显示小数

我目前正在使用这个.ToString("#,###,##0.##"),但我在下面遇到问题

期待

1000 -> 1,000
5522.13 -> 5,522.13
55.1 -> 55.10

现实

1000 -> 1,000
5522.13 -> 5,522.13
55.1 -> 55.1

55.1 部分将只显示一位小数,而不是 55.10。任何帮助将不胜感激

【问题讨论】:

    标签: c# .net vb.net


    【解决方案1】:

    使用单个格式说明符无法做到这一点。在这两种情况下,您将不得不使用一些条件逻辑和不同的格式。有多种方法可以做到这一点,但这里有一个相当简单的方法:

    Imports System.Globalization
    
    Module Module1
    
        Sub Main()
            Console.WriteLine(FormatNumber(1000.0))
            Console.WriteLine(FormatNumber(5522.13))
            Console.WriteLine(FormatNumber(55.1))
    
            Console.ReadLine()
        End Sub
    
        Private Function FormatNumber(number As Double) As String
            Dim temp = number.ToString()
    
            Return If(temp.Contains(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator),
                      number.ToString("n2"),
                      number.ToString("n0"))
        End Function
    
    End Module
    

    请注意,我认为这应该适用于不需要使用科学计数法表示的所有值,这对大多数人来说应该没问题。如果您的值非常大,那么 ToString 可能会输出包含小数分隔符的科学计数法,即使实际数字没有小数部分。

    另一个测试数字而不是数字的字符串表示的选项如下:

    Private Function FormatNumber(number As Double) As String
        Return If(Math.Round(number) = number,
                  number.ToString("n0"),
                  number.ToString("n2"))
    End Function
    

    请注意,在第二种情况下,格式说明符是相反的,因为测试是针对不存在小数点的,而第一个示例测试是否存在小数点。

    【讨论】:

      【解决方案2】:

      在我看来,一个简单的.Replace(".00", "") 可能对你有用。

      var numbers = new [] { 1000.0, 5522.13, 55.1 };
      
      foreach (var number in numbers)
      {
          var formatted = number.ToString("#,###,##0.00").Replace($"{CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator}00", "");
          Console.WriteLine(formatted);
      }
      

      或者:

      Dim numbers = {1000.0, 5522.13, 55.1}
      
      For Each number In numbers
          Dim formatted = number.ToString("#,###,##0.00").Replace($"{CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator}00", "")
          Console.WriteLine(formatted)
      Next
      

      这两个都给我:

      1,000
      5,522.13
      55.10
      

      【讨论】:

      • 作为记录,“#,0.00”将与“#,###,##0.00”执行相同的操作,“n2”也是如此。
      • 该代码的一个潜在问题是它没有考虑文化。在某些文化中,点是组分隔符而不是小数分隔符。在这种文化中,数字 1000.0 将被您的代码格式化为“1.000,00”,然后替换将变为“10,00”。这就是为什么我在我的一个示例中专门使用了CurrentCulture.NumberFormat.NumberDecimalSeparator。如果此代码不会跨文化使用,那么您就可以了。如果可能,那么您应该使用.Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator + "00", string.Empty)
      【解决方案3】:

      使用ToString("#,#.#0")

      var numbers = new [] { 1000.0, 5522.13, 55.1 ,15003.2};
      
      foreach (var number in numbers)
      {
          var formatted = number.ToString("#,#.#0");
          Console.WriteLine(formatted);
      }   
      

      结果:

      1,000.00
      5,522.13
      55.10
      15,003.20
      

      .NET Fiddle

      【讨论】:

        猜你喜欢
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        相关资源
        最近更新 更多