【问题标题】:How to take away fraction part from decimal?如何从小数中去掉小数部分?
【发布时间】:2010-09-13 09:40:07
【问题描述】:

如何在 .NET 中格式化小数类型时去掉小数部分?我需要两种变体的通用语法。有什么温和的解决办法吗?

            decimal a = 1.22M;
            decimal b = 1.00M;

            String.Format("${0}", a); // result is $1.22
            String.Format("${0}", b); // result is $1.00, should be $1, HOW?

【问题讨论】:

  • String.Format("${0}", b.Replace(".00",string.Empty));

标签: c# .net formatting decimal


【解决方案1】:

假设“通用语法”意味着您需要一种解决方案来提供两种输出,String.Format("${0:#.##}", x) 可以解决问题。当x1.00M 时,结果将为"$1"。当x1.22M 时,结果为"$1.22"

【讨论】:

  • 但是如果那个东西是0,那么输出就是空的。我得到的是“$”而不是“$0”。
  • @user337085,试试我的方法,它不像格式化那样优雅,但在任何情况下都可以使用... String.Format("${0}", anyvalue.Replace(".00",string .空));
  • @user337085:使用0.## 而不是#.##。当值为零时,这将解决您的问题。
【解决方案2】:

试试这些 - 两者都会为当前系统输出适当的货币符号:

a.ToString("C2");  // Outputs 2DP
b.ToString("C0"); // Outputs no DP

如果您需要提供特定的货币符号,请使用与上述相同的符号,但用 N 代替 C。

【讨论】:

  • @eugeneK - 以何种方式 - 他想要一种通用的方式来输出一个小数作为具有特定小数位数的字符串。这是做什么的......
  • 不,他想在有小数时用小数显示十进制值...“两种解决方案的通用语法”
  • @Paddy,那是不公平的,因为我们有不同的时区,而我已经参加了第二场比赛……
【解决方案3】:

Decimal 类型旨在跟踪它有多少有效数字。这就是1.00M.ToString() 返回字符串1.00 的原因。

要打印不带派系部分的Decimal,您可以使用格式说明符N,精度为0

1.22M.ToString("N0") => "1"
1.00M.ToString("N0") => "1"
1.77M.ToString("N0") => "2"

这将在转换过程中对Decimal 进行四舍五入。

【讨论】:

    【解决方案4】:

    在 VB.NET 中我会使用

     CINT(INT(a))
    

    我想存在一个 C# 变体。

    我在这个链接找到了一个可能的解决方案:

    http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

    进一步解释:

    decimal a = 1.55M;
    Console.WriteLine("$" & CInt(Int(a)).ToString()); // result is $2
    
    decimal b = 1.22M;
    Console.WriteLine("$" & CInt(Int(b)).ToString()); // result is $1
    

    我会避免使用货币格式,因为小数是该类所固有的。

    【讨论】:

    • 如果值是小数,则 INT(value) 将删除分数。
    • CINT(INT(a)) 确保正确舍入
    • 那么如果该值为 1.22,它将像 INT() 一样在他想要获得 1.22 时四舍五入到 1,并且在没有分数的情况下删除 .00
    • 首先,INT() 去掉小数点。没有四舍五入。
    • 其次,Int() 以 Short 形式出现。然后 CINT 会将其转换为整数。 CInt 本身实际上是对数字进行四舍五入。
    【解决方案5】:
    string.Format("${0:0}",b)
    

    在 C# 中,您可以使用{0} 来告知参数,{0:format} 可以使用格式来告知参数。

    编辑

    哦,我认为 OP 想要做的是删除 b 的数字。但现在我意识到他想删除无用的零。

    string.Format("${0:#.##}",b)
    

    【讨论】:

      【解决方案6】:

      我认为这里还有其他问题。如果问题是完全忽略小数位,那么仅转换为整数会产生所需的输出,但显然会降低精度,这不是一件好事。

      在格式化为字符串时也需要考虑舍入,如下例所示。

      decimal a = 1.55M;
      Console.WriteLine(a.ToString("C0")); // result is $2
      
      decimal b = 1.22M;
      Console.WriteLine( b.ToString( "C0" ) ); // result is $1
      

      【讨论】:

        【解决方案7】:

        我认为这只是为了显示而不是当数字在小数点后没有值时将数据类型更改为 INT。

        使用系统;

        namespace stackOverflow
        {
            class Program
            {
                static void Main(string[] args)
                {
                    decimal a = 1.2245M;
                    decimal b = 1.00M;
        
        
        
                    Console.WriteLine("Your percentage to date is: {0:#.#####}", a);
                    Console.WriteLine("Your percentage to date is: {0:#.#####}", b);//#.#### gives number upto 4 decimal
                    Console.ReadLine();
        
                }
        
        
            } 
        
        }
        

        【讨论】:

          【解决方案8】:
          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;
          
          namespace ConsoleApplication1
          {
              class Program
              {
          
                  static void Main(string[] args)
                  {
                      double n, x;
                      int a, dec = 0;
                      Console.WriteLine("Enter double");
                      n = Convert.ToDouble(Console.ReadLine());
          
                      a = Convert.ToInt32(n);
                      x = n - a;
                      if (x < 0)
                          a--;
                      int k = 1000;
                      for (int i = 0; i < n.ToString().Length; i++)
                      {
                          if (n.ToString()[i] == '.')
                              k = i;
                          if (i > k)
                              dec = dec * 10 + (n.ToString()[i]-48);
                      }
          
                      Console.WriteLine("Non-fraction " + a);
                      Console.WriteLine("Fraction " + dec);
          
          
                      Console.ReadKey();
          
                  }
          
          
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多