字符串等于不适用于字符串格式的数字

时间:2012-01-31 16:26:56

标签: c# unit-testing string-formatting

我的字符串如何具有不同的哈希码,但文本值相同“16 777 216”?

测试方法未通过:

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestStringEquals
{
  [TestClass]
  public class FormatterTests
  {
    [TestMethod]
    public void Double_Test_1()
    {
      Assert.AreEqual("16 777 216", FormatDoubleWithThousandSeparator(16777216, 0));
    }

    public string FormatDoubleWithThousandSeparator(double value, int digits)
    {
      double result = Math.Round((double)value, digits);

      System.Globalization.NumberFormatInfo nfi = (System.Globalization.NumberFormatInfo)System.Globalization.NumberFormatInfo.InvariantInfo.Clone();
      nfi.NumberGroupSeparator = " ";

      return result.ToString("###,###,###,###,###,###,##0.#####", nfi);
    }
  }
}

4 个答案:

答案 0 :(得分:4)

如果用以下代码替换断言,也许测试输出会更有帮助:

Assert.AreEqual("16 777 216", numberToString);

答案 1 :(得分:3)

我在Visual Studio 2010中运行了单元测试,它确实通过了我。它可能与您计算机上的某些文化设置有关,或者可能与==运算符在字符串上的行为有关。

为了清晰起见而编辑

答案 2 :(得分:2)

Assert.IsTrue()接受两个 Object 类型参数。对象类型的==运算符检查引用相等性。字符串重载==运算符而不是检查值是否相等,但是当你将字符串传递给该函数时,你已经将它们有效地转换为对象并强制它使用对象的==运算符:它将检查字符串的引用相等性, 可能会也可能不会返回true ,具体取决于字符串是否被实习。

相反,请使用Assert.AreEqual()
Assert.IsTrue("16 777 216".Equals(numberToString), "Expected 2^24")

答案 3 :(得分:0)

因为两个字符串不是同一个对象,因此它们不相等,所以应该使用字符串比较方法。

确保不是一个字符串具有非打印字符而另一个字符串不具有非打印字符的情况。你必须记住一个字符串是一个对象。因此,您需要将所述对象的值与另一个对象的值进行比较。

http://msdn.microsoft.com/en-us/library/system.string.equals.aspx
http://msdn.microsoft.com/en-us/library/1hkt4325.aspx