如何从十进制数中去除小数部分?

4
在.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)); 字符串格式化:String.Format("${0}", b.Replace(".00",string.Empty)); - eugeneK
8个回答

8
假设“常见语法”是指您需要一种解决方案来同时给出两个输出,那么String.Format("${0:#.##}", x)就可以解决问题。当x1.00M时,结果将为"$1"。当x1.22M时,结果为"$1.22"

但是如果那个值为0,输出是空的。我得到了"$"而不是"$0"。 - Roman Pushkin
@user337085,试试我的方法吧,虽然没有格式化那么优雅,但在任何情况下都能正常工作... String.Format("${0}", anyvalue.Replace(".00",string.Empty)); - eugeneK
5
请使用 0.## 而不是 #.##。这将修复当数值为零时出现的问题。 - Martin Liversage

4

请尝试以下两种方法 - 它们都可以输出当前系统的适当货币符号:

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

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

@eugeneK - 他想要一种通用的方法,将十进制数以特定小数位数的字符串形式输出。这就是这个程序所做的事情... - Paddy
不,他想要在有小数时显示带分数的十进制值... "两种解决方案的常见语法" - eugeneK
@Paddy,这不公平,因为我们处于不同的时区,而我已经喝了第二杯... - eugeneK

2
Decimal类型旨在跟踪其具有的有效数字位数。这就是为什么1.00M.ToString()返回字符串1.00的原因。
要打印一个没有小数部分的Decimal,可以使用精度为0的格式说明符N
1.22M.ToString("N0") => "1"
1.00M.ToString("N0") => "1"
1.77M.ToString("N0") => "2"

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


2

在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)将删除小数部分。 - eugeneK
CINT(INT(a)) 确保正确的四舍五入。 - Michael Eakins
如果值为1.22,则它将四舍五入为1,就像INT()在想要获取1.22时所做的那样,并在没有小数部分的情况下删除“.00”。 - eugeneK
首先,INT()会舍去小数部分。没有四舍五入。 - Jimmie Clark
第二,Int()会输出Short类型。然后CINT将其转换为整数。CInt本身实际上四舍五入了数字。 - Jimmie Clark
这个解决方案正是我会用来去掉数字小数位的方法。 - Jimmie Clark

0

我认为这里还有其他问题。如果问题是完全忽略小数位,那么将其转换为整数就可以产生所需的输出,但显然会失去精度,这是不好的。

当将其格式化为字符串时,还需要考虑四舍五入的问题,例如下面的示例。

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

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

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

在C#中,您可以使用{0}来表示参数,使用{0:format}来表示带有格式的参数。 编辑 哦,我以为OP想要做的是删除b的数字。但现在我意识到他想要删除无用的零。
string.Format("${0:#.##}",b)

0

我猜这只是用于显示,而不是在小数点后没有值时将数据类型更改为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();

        }


    } 

}

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

        }


    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接