我目前正在将vb和vb.net转换为c#但有问题.我非常希望不要在转换后的代码中使用visualbasic dll,并且到目前为止一直这样做.
但是这段代码
Dim x as Double 'this was error saying it was integer
x = Val("1 23 45 x 6") ''#x is 12345
x = Val("1..23") ''#x is 1.23
x = Val("1 1,,,,,2,2..3") ''#x is 1122.3
Run Code Online (Sandbox Code Playgroud)
即使使用visualbasic.conversion.dll中的"Val"也不会像vb6一样工作是否有人解决了这个问题?c#解决方案是最好的.
我对此一无所知VisualBasic.Conversion.dll(谷歌也不知道),但Microsoft.VisualBasic名称空间(in Microsoft.VisualBasic.dll)是核心框架的一部分,完全可以接受并且可以从C#中使用.还有其他不错的宝石(即TextFieldParser),但这应该具有Val()您需要的确切实现.
如果这是你已经尝试过的库而且看起来不对,那么我再去看看它上面的单元测试.
这个之外,在C#中接受的方式为字符串转换为整数是int.Parse(),int.TryParse()和Convert.ToInt32().但是,无论喜欢与否,库中的Val()函数Microsoft.VisualBasic.dll是您将为代码的现有行为找到的最接近的匹配.
以上似乎都不能满足我的需求,所以我写了以下内容:
public static Double Val(string value)
{
String result = String.Empty;
foreach (char c in value)
{
if (Char.IsNumber(c) || (c.Equals('.') && result.Count(x => x.Equals('.')) == 0))
result += c;
else if (!c.Equals(' '))
return String.IsNullOrEmpty(result) ? 0 : Convert.ToDouble(result);
}
return String.IsNullOrEmpty(result) ? 0 : Convert.ToDouble(result);
}
Run Code Online (Sandbox Code Playgroud)
测试数据结果:
"0 1 5.2123 123.123. 1 a" 返回 15.21233123
" 1 5.2123 123a" 返回 15.21233123
"a1 5.2123 123.123. 1 a" 返回 0
"" 返回 0