我是DDT的新手,我用整数和双值创建了一个非常小的测试。 我可以毫无问题地解析整数但我无法使用双精度。
这是我的C#代码:
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "bounds.csv", "bounds#csv",
DataAccessMethod.Sequential)]
[DeploymentItem("bounds.csv")]
[DeploymentItem("schema.ini")]
[TestMethod]
public void GetBestUsingBounds()
{
// https://msdn.microsoft.com/en-us/library/ee624082.aspx
var x1 = Convert.ToDouble(TestContext.DataRow["x1"]);
var x2 = Convert.ToDouble(TestContext.DataRow["x2"]);
}
这是我的csv档案:
x1;y1
11,1;55.1
-6;50
我的scheme.ini:
[bounds.csv]
Format=Delimited(;)
第二行是正确读取的,它们只是整数,但第一行要么被删除小数:11.1变为11或从小数点剥离11.1变为111.
当我添加引号(双引号或单引号)时,将跳过整行。
如果我使用schema.ini并不重要; as delimiter或没有scheme.ini,默认为分隔符。
问题不在于 Convert.ToDouble TestContext.DataRow [" x1"] 已经错误。
我在荷兰的Win8.1上使用VS2013 Pro。关于如何解决这个看似简单的问题的任何建议?
答案 0 :(得分:1)
可以(至少在VS2015中)引用该值,如下所示:
x1;y1
"11.1";"55.1"
-6;50
然后它将被视为字符串文字,并且可以像这样转换为double:
Convert.ToDouble(TestContext.DataRow["x1"], CultureInfo.InvariantCulture);
答案 1 :(得分:0)
这是一个与全球化有关的错误。你得到的答案取决于你的地区。
例如:
NumberFormat format = NumberFormat.getInstance(Locale.FRANCE);
Number number = format.parse("1,234");
double d = number.doubleValue();
答案 2 :(得分:0)
这似乎是MsTest中的一个错误(正如Margus指出的那样)。这是我在相同情况下使用的解决方法:
将您的csv更改为
x1;y1
a11.1;a55.1
a-6;a50
和您的C#代码
var x1 = Convert.ToDouble(TestContext.DataRow["x1"]ToString().TrimStart('a'));
var x2 = Convert.ToDouble(TestContext.DataRow["x2"]ToString().TrimStart('a'));
当然,任何其他信件也可以完成这项工作。使用字母前缀,可以避免MsTest将csv数据自动转换为双倍,从而使其无法正确执行此操作。
我知道这很难看,但似乎没有人有更好的答案......
答案 3 :(得分:0)
问题是您无法将11,1
和55.1
解析为同一语言环境中的双精度数。对于荷兰语语言环境,只接受逗号。
我建议总是使用dot,因为它匹配不变的文化;为了确保双分隔符按预期工作,只需添加
DecimalSymbol=.
在schema.ini
中。 (我没有找到解释CSV解析器的方法,这是.csv文件的语言环境;它似乎是一个错误。)