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 を削除しただけで、適切な文字列が返されました。入力していただきありがとうございます。