是否可以将vb6“Val()”转换为c#?

时间:2010-12-01 15:20:24

标签: c# vb.net

我目前正在将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#解决方案最好。

6 个答案:

答案 0 :(得分:5)

我对此VisualBasic.Conversion.dll一无所知(google也没有),但Microsoft.VisualBasic命名空间(在Microsoft.VisualBasic.dll中)是核心框架的一部分,完全正常可以接受使用C#。还有其他不错的宝石(即TextFieldParser),但这应该具有您需要的确切Val()实现。

如果这是你已经尝试过的库而且看起来不对,那么我再去看看它上面的单元测试。

除此之外,C#中用于将字符串转换为整数的可接受方式是int.Parse()int.TryParse()Convert.ToInt32()。但是,无论喜欢与否,Val()库中的Microsoft.VisualBasic.dll函数是您将为代码的现有行为找到的最接近的匹配。

答案 1 :(得分:4)

以上都没有满足我的需求,所以我写了以下内容:

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

答案 2 :(得分:1)

查看此网站:http://www.dreamincode.net/forums/topic/36064-val-replacement/其他人举例说明如何实现自己的Val()函数。

答案 3 :(得分:1)

c#中没有完全等效的vb6 val函数。但是可以在c#中使用Microsoft.VisualBasic命名空间来使用此函数。

要在c#中使用val()函数,请添加Microsoft.VisualBasic命名空间并使用以下代码:

Conversion.Val("09sdf");

答案 4 :(得分:0)

从您的示例中可能看起来与此类似。但由于我不知道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作为内部表示,因为这样我在小数部分不会出现奇怪的舍入错误。

答案 5 :(得分:0)

您可以使用Convert static class。它非常接近Val(),但您需要指定转换为类型。它在System命名空间中。

E.g:

int x = Convert.ToInt32("23");
int y = Convert.ToDouble("23.342");

http://msdn.microsoft.com/en-us/library/system.convert(v=vs.71).aspx