繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM