2

C# に変換する古い VB6 プロジェクトがあります。私はひもを持っています。一度に 1 文字ずつ、 のみが含まれていることを確認しています[E0-9.+-]

これは古い VB6 コードです。

sepIndex = 1

Do While Mid(xyString, sepIndex, 1) Like "[E0-9.+-]"
    sepIndex = sepIndex + 1
Loop

次に、インデックス番号を使用して同じ文字列のLeftを計算し、それを double に変換します。Rightを使用して、必要な文字列の残りの部分に文字列を切り詰めます。

xFinal = CDbl(left(xyString, sepIndex - 1))
xyString = LTrim(right(xyString, Len(xyString) - sepIndex + 1))

これはVBでうまく機能し、まったく問題はありません。C# では違います。C# でLeft/Mid/Rightをエミュレートする唯一の方法は、独自の関数を作成することだとわかっていたので、そのようにしました (Utils 名前空間の一部)。

public static string Mid(string param, int startIndex)
   {
       try
       {

           //start at the specified index and return all characters after it
           //and assign it to a variable
           string result = param.Substring(startIndex);
           //return the result of the operation
           return result;
       }
       catch
       {
           return string.Empty;
       }
   }

public static string Right(string param, int length)
   {
       try
       {
           //start at the index based on the lenght of the sting minus
           //the specified lenght and assign it a variable
           string result = param.Substring(param.Length - length, length);
           //return the result of the operation
           return result;
       }
       catch
       {
           return string.Empty;
       }
   }
public static string Left(string param, int length)
   {
       try
       {
           //we start at 0 since we want to get the characters starting from the
           //left and with the specified lenght and assign it to a variable
           string result = param.Substring(0, length);
           //return the result of the operation
           return result;
       }
       catch
       {
           return string.Empty;
       }
   }

私の知る限り、コードを VB6 から C# に変換しました。問題は、最終的に を設定xyStringすると、文字列が間違った場所で切断され、必要な末尾の文字が残っていることですxFinal

私が収集したものから、これはインデックスの問題 (C# でわかっていることです。Substringは 0 ベースであるためsepIndex、値を 0 に変更しました)、または間違ったループ構造の問題である可能性があります。

変換されたコードは次のとおりです。ここで何が起こっているかを理解できれば幸いです。

sepIndex = 0;

while (Regex.IsMatch(Utils.Mid(xyString, sepIndex, 1), "[E0-9.+-]"))
{
    sepIndex++;
}

xFinal = Convert.ToDouble(Utils.Left(xyString, sepIndex - 1)); // - 1
xyString = Utils.Right(xyString, xyString.Length - sepIndex + 1).TrimStart(' '); // + 1

編集

これは解決されました。Utils.Left 関数から +1 と -1 を削除しただけで、適切な文字列が返されました。入力していただきありがとうございます。

4

3 に答える 3

1

"[^E0-9.+-]" という否定的な条件を持つ RegEx 数学のようです:

 var sepIndex = Regex.Match(xyString, @"[^E0-9\.+-]+").Index;

手動で行う必要がある場合、単一の文字を取得する最も簡単な方法は、トリミングせずに文字列から単一の文字を取得することです。

  // replace Utils.Mid(xyString, sepIndex, 1) with
  xyString[sepIndex] 
于 2013-04-22T04:31:37.103 に答える
1

なぜmicrosoft.visualbasic 名前空間をインポートしないのですか?

class Program
{
    static void Main(string[] args)
    {
        string t = Microsoft.VisualBasic.Strings.Mid("hello", 2);
    }
}

今まで使っていたものを再利用できる

于 2013-04-23T23:51:27.133 に答える