我有一个旧的 VB6 项目,我正在转换为 C#。我有一个字符串。我正在验证一次 1 个字符,它只包含[E0-9.+-]
.
这是旧的 VB6 代码:
sepIndex = 1
Do While Mid(xyString, sepIndex, 1) Like "[E0-9.+-]"
sepIndex = sepIndex + 1
Loop
然后我使用索引号来计算同一字符串的左侧,并将其转换为双精度。使用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# 中,子字符串是基于 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,它返回了正确的字符串。感谢您的投入。