在C#中将十进制转换为字符串时出现问题网

本文关键字:问题 字符串 十进制 转换 | 更新日期: 2023-09-27 17:59:11

在将Decimal转换为String时,我尝试了两种方法。

方法1:

    string a = "100.00", b = "50.00";
    string Total = (string)(Convert.ToDecimal(a) + Convert.ToDecimal(b));

它抛出错误,无法将Decimal转换为String。

方法2:

    string Total = (Convert.ToDecimal(a) + Convert.ToDecimal(b)).ToString();

它不会出错,而且运行良好。

我想知道这两种转换方法之间的区别,以及当我使用方法1时为什么会出错?

在C#中将十进制转换为字符串时出现问题网

第一种方法是尝试取一个小数(2个小数相加的结果)并将其强制转换为字符串。由于没有从十进制到字符串的(隐式或)显式转换,因此由于不匹配,它会抛出。

第二个方法取一个十进制,并对其调用ToString()方法-由于ToString是十进制类型的有效方法,因此这会调用一个普通的实例方法,并获得该调用的返回值,即字符串。

由于您已经在使用Convert调用,您可能会发现进行Convert更自然。ToString,将小数返回到字符串。

如果将"addtwodecimals"分隔到一个单独的局部var中,可能会更清楚,因为这在这里是通用的。

因此,(注释掉的)total1失败了,因为它试图进行强制转换,而我们没有可用的转换。后两者都很好,因为它们是返回字符串的方法调用。

string a = "100.00", b = "50.00";
decimal result = Convert.ToDecimal(a) + Convert.ToDecimal(b);
//string total1 = (string)result;
string total2 = result.ToString();
string total3 = Convert.ToString(result);

第一个代码尝试将十进制"类型强制转换"为字符串,其中第二个代码调用decimal上的ToString方法来获得decimal的字符串表示。从十进制到字符串的类型转换不起作用,除非十进制类型重载了类型转换运算符,而它没有重载,因此类型转换引发异常。

在这种情况下,类型转换就像要求CLR系统将十进制类型转换为字符串,CLR无法做到这一点,因为它找不到方法。调用ToString是要求十进制类型返回其字符串表示

Method1是一个强制转换,因此您试图将十进制变量中包含的数据作为字符串"读取"。。。你当然不能。例如,您可以将一个字节强制转换为int,因为它们都是数字。相反,对于十进制到字符串,您需要一个显式的转换过程。

这是因为在第一种方法中,您将字符串a和b转换为十进制,但当您只是将类型转换为字符串时,您需要将该十进制值转换为字符串,然后再将其分配给字符串变量。在第二种方法中,您实际上是使用ToString()方法将十进制值转换为字符串,所以它不会出错。

这是表的链接,它说您不能像在第一种方法中那样将十进制转换为字符串:

显式数值转换表(C#参考)

第二个方法正在工作,因为您正在使用对象类的ToString()方法。

在第一种方法中,你基本上是在做吗

string a = (string)150m;

其中150是十进制。从十进制到字符串没有显式或隐式转换。编译器无法理解如何进行转换。

在第二种方法中,您调用

string a = 150m.ToString();

在这种情况下,您将调用Decimal类实现的ToString方法(以及所有其他类)。