[英]Is it possible to convert vb6 "Val()" to c#?
我目前正在将 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
即使使用 visualbasic.conversion.dll 中的“Val”,也不能像 vb6 一样工作 有没有人解决了这个问题,使其工作相同? 最好使用 c# 解决方案。
我不知道这个VisualBasic.Conversion.dll
(也没有谷歌 ),但Microsoft.VisualBasic
命名空间(在Microsoft.VisualBasic.dll
)是核心框架的一部分,完全没问题,可以从C#中使用。 还有其他不错的宝石(即TextFieldParser
),但这应该具有您需要的确切Val()
实现。
如果这是你已经尝试过的库而且看起来不对,那么我再去看看它上面的单元测试。
int.TryParse()
,C#中用于将字符串转换为整数的可接受方式是int.Parse()
, int.TryParse()
和Convert.ToInt32()
。 但是,无论喜欢与否, Microsoft.VisualBasic.dll
库中的Val()
函数是您将为代码的现有行为找到的最接近的匹配项。
以上都没有满足我的需求,所以我写了以下内容:
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);
}
测试数据的结果:
"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
c#中没有与vb6 val函数完全等效的函数。 但是在c#中使用Microsoft.VisualBasic命名空间可以使用此函数。
要在c#中使用val()函数,请添加Microsoft.VisualBasic命名空间并使用以下代码:
Conversion.Val("09sdf");
查看此站点: http : //www.dreamincode.net/forums/topic/36064-val-replacement/其他人举例说明如何实现自己的Val()函数。
从您的示例中可能看起来与此类似。 但由于我不知道VB val
规范,它可能无法正确处理所有字符串。
Decimal ParseNumerString(string s)
{
Decimal value=0;
Decimal multiplier=1;
bool decimalPart=false;
foreach(char c in s)
{
if(IsDigit(c))
{
int i=ParseDigit(c);
if(!decimalPart)
{
value=value*10+i;
}
else
{
muliplier/=10;
value=value+multiplier*i;
}
if(c=='.')
decimapPart=true;
}
return value;
}
这是伪代码,你需要实现解析数字并且是自己的数字(微不足道)。 我选择Decimal
作为内部表示,因为这样我在小数部分没有得到奇怪的舍入误差。
您可以使用Convert static class。 它非常接近Val(),但您需要指定转换为类型。 它位于System命名空间中。
例如:
int x = Convert.ToInt32("23");
int y = Convert.ToDouble("23.342");
http://msdn.microsoft.com/en-us/library/system.convert(v=vs.71).aspx
有同样的问题,从@ericosg 的回答开始,然后意识到我需要负数和科学记数法
namespace VB6
{
public class Helper
{
public static double Val(object value)
{
double returnVal = 0;
string sToParse = value.ToString();
string result = string.Empty;
string num = string.Empty; //In the case of scientific notation e.g. 3e5 = 300000
foreach (char c in sToParse)
{
if (result.Length == 0 && c.Equals('-'))//negative numbers
result += c;
else if (Char.IsNumber(c) || (c.Equals('.') && result.Count(x => x.Equals('.')) == 0))
result += c;
else if ((c.Equals('e') || c.Equals('E')) && num.Length == 0 && result.Length != 0) //scientific notation
{
num = result;
result = string.Empty;
}
else if (!c.Equals(' '))
{
break;
}
}
if (num.Length > 0)
{
//scientific notation
double fSignificantFigures = string.IsNullOrEmpty(result) || result == "-" ? 1 : Math.Pow(10, Convert.ToDouble(result));
returnVal = num == "-" ? 0 : Convert.ToDouble(num) * fSignificantFigures;
}
else
{
returnVal = string.IsNullOrEmpty(result) || result == "-" ? 0 : Convert.ToDouble(result);
}
return returnVal;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.