【问题标题】:Problem in Converting Decimal To String in C#.Net在 C#.Net 中将十进制转换为字符串的问题
【发布时间】:2011-09-16 01:56:39
【问题描述】:

在将十进制转换为字符串时,我尝试了两种方法。

方法一:

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

它抛出错误,无法将十进制转换为字符串。

方法二:

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

它不会抛出错误并且工作正常。

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

【问题讨论】:

    标签: c# asp.net user-controls types decimal


    【解决方案1】:

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

    第二个接受小数并在其上调用 ToString() 方法 - 因为 ToString 是小数类型的有效方法,所以这会进行正常的实例方法调用,并且您会获得该调用的返回值,即字符串。

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

    如果您将“添加两位小数”分隔到单独的本地变量中可能会更清楚,因为这对两者都是通用的。

    因此,(已注释掉的)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);
    

    【讨论】:

      【解决方案2】:

      在第一种方法中你基本上是在做什么

      string a = (string)150m;
      

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

      在你调用的第二种方法中

      string a = 150m.ToString();
      

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

      【讨论】:

        【解决方案3】:

        第一个代码尝试将十进制“类型转换”为字符串,而第二个代码在十进制上调用 ToString 方法以获取十进制的字符串表示形式。从十进制到字符串的类型转换不起作用,除非十进制类型重载了类型转换运算符,但它没有重载,因此类型转换会引发异常。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

              Explicit Numeric Conversions Table (C# Reference)

              第二种方法有效,因为您正在使用对象类的 ToString() 方法。

              【讨论】:

              • nit-pick,但是虽然 System.Object 定义了 ToString()(显然),但实际使用的实现是在 System.Decimal 中创建的覆盖。如果不这样做,结果将是一个类似“System.Decimal”的字符串,因为对象 ToString() 会打印出类型名称。
              猜你喜欢
              • 1970-01-01
              • 2023-02-08
              • 2022-07-22
              • 1970-01-01
              • 2016-03-06
              • 2018-12-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多