【问题标题】:Is it possible to convert vb6 "Val()" to c#?是否可以将 vb6 "Val()" 转换为 c#?
【发布时间】:2010-12-01 15:20:23
【问题描述】:

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

【问题讨论】:

  • 当 x 被声明为整数时,它怎么可能是 1.23?
  • 它是那些小数整数之一,这些都是现在的时尚......
  • 我个人认为这个功能很疯狂。如果德国人(非程序员)输入“1,23”,他会不满意结果是 123 而不是 1.23
  • @Code - 在德语系统上,知道 . 而不是 .是小数点。
  • @Joel:根据文档,它不够聪明:Val 函数仅将句点 (.) 识别为有效的小数分隔符。” @ 987654321@

标签: c# vb.net


【解决方案1】:

以上似乎都不能满足我的需求,所以我写了以下内容:

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】:

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

    如果这是您已经尝试过的库并且看起来不正确,那么我会再看看它的单元测试。

    除此之外,在 C# 中将字符串转换为整数的公认方法是 int.Parse()int.TryParse()Convert.ToInt32()。但是,不管你喜不喜欢,Microsoft.VisualBasic.dll 库中的 Val() 函数是你要找到的最接近代码现有行为的匹配项。

    【讨论】:

    • 我理解并感谢 - 我希望 Val() 完全匹配 vb6 Val,但也许接近会很好。
    • +1 不要让偏见损害您的工作效率。另见讨论here
    【解决方案3】:

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

    【讨论】:

    • “我强烈希望不要在转换后的代码中使用 visualbasic dll...”
    • 很抱歉。添加了指向另一个网站的链接,他们建议在该网站上实现您自己的 Val() 函数。
    • @Peter:对于它的价值,我认为使用现有的Val 是最好的选择,因为它提供了 OP 想要的确切功能。 (更不用说它已经在数百万种情况下经过数百万次的试验和测试了。)
    • @LukeH 它没有提供确切的功能,因为它的行为与 vb6 val 不完全相同,但它很接近可以工作。
    • 据我所知,该链接中的所有各种重新实现都将因 Aditya 问题中的一些示例而失败。它们都没有考虑到包含小数点的字符串(带有小数部分的数字)。看在可惜的份上,就用Microsoft.VisualBasic.dll,然后继续为可怜的老用户实现更多功能。
    【解决方案4】:

    您可以使用 Convert 静态类。它非常接近 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

    【讨论】:

    • 这并不像您想象的那么接近,因为Val("") = 0Convert.ToDouble("") 会引发异常
    【解决方案5】:

    C# 中没有与 vb6 val 函数完全等效的函数。但是这个功能可以通过在C#中使用Microsoft.VisualBasic命名空间来使用。

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

    Conversion.Val("09sdf");
    

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2010-09-28
        • 1970-01-01
        • 2011-10-29
        • 1970-01-01
        • 2011-05-08
        • 2012-03-26
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多