(C#)我的代码似乎没问题,但每当我把0作为第二个参数时它就会显示出来 “敌人50”,当我希望敌人57变成敌人00时。我认为第三个if语句存在问题,但不确定是否可以修复它。
主要
string enemy57 = "enemy57";
Console.WriteLine("The old image name is: " + enemy57);
Console.WriteLine("New image name: " + BuildingBlock.NextImageName(enemy57, 0));
Console.ReadLine();
class BuildingBlock
{
public static string ReplaceOnce(string word, string characters, int position)
{
word = word.Remove(position, characters.Length);
word = word.Insert(position, characters);
return word;
}
public static string GetLastName(string name)
{
string result = "";
int posn = name.LastIndexOf(' ');
if (posn >= 0) result = name.Substring(posn + 1);
return result;
}
public static string NextImageName(string filename, int newNumber)
{
if (newNumber > 9)
{
return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 2));
}
if (newNumber < 10)
{
return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 1));
}
if (newNumber == 0)
{
return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 2));
}
return filename;
}
答案 0 :(得分:2)
这是一个可能会做你想要的例子。
它会:
意思是:
Enemy01, replace with 5, will be Enemy05
Enemy57, replace with 5, will be Enemy05
Enemy1, replace with 57, will be Enemy57
这是一个LINQPad程序,演示了:
void Main()
{
NextImageName("Enemy01", 5).Dump();
NextImageName("Enemy57", 5).Dump();
NextImageName("Enemy5", 57).Dump();
}
public static string NextImageName(string filename, int newNumber)
{
var re = new Regex(@"\d+$");
return re.Replace(filename, match =>
{
return newNumber.ToString().PadLeft(match.Length, '0');
});
}
输出:
Enemy05
Enemy05
Enemy57
正则表达式
\d+$
意味着:
+- one or more times
v
\d+$
^^ ^
| |
| +-- followed by the end of the string
|
digits (0-9)
换句话说:
答案 1 :(得分:1)
尝试用
替换上次调用ReplaceOnce return ReplaceOnce(filename, newNumber.ToString("D2"), (filename.Length - 2));
问题是因为您传递的整数0被转换为字符串“0”,其长度为1个字符。因此,ReplaceOnce方法仅替换保留5的最后一个字符。
使用ToString composite formatting规则D2确保传递给方法的任何数字都将使用至少两个字符进行格式化。
说,看到你测试newNumber == 0你也可以写
return ReplaceOnce(filename, "00", (filename.Length - 2));
此外,应在测试之前执行零测试。 10否则你用错误的参数调用方法。
public static string NextImageName(string filename, int newNumber)
{
if (newNumber == 0)
{
return ReplaceOnce(filename, "00", (filename.Length - 2));
}
if (newNumber > 9)
{
return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 2));
}
if (newNumber < 10)
{
return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 1));
}
// Unreachable code ???
// return filename;
}
如果您确定twh结尾字符总是两位数,并且您想要将当前数字替换为另外两位数,也只替换一位数newNumber
,您可以写
public static string NextImageName(string filename, int newNumber)
{
// ToString("D2") forces the 1-9 range to be passed as 0X no need to test
return ReplaceOnce(filename, newNumber.ToString("D2"), (filename.Length - 2));
}
删除所有现在不必要的数字长度测试
答案 2 :(得分:1)
你的代码的问题是最后一个检查0但在你检查&lt;之前的if语句。 10如果newnumber为0将进入。所以它只是切换,如果高于其他2或他们之间像这样:
public static string NextImageName(string filename, int newNumber)
{
if (newNumber == 0)
{
return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 2));
}
if (newNumber > 9)
{
return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 2));
}
if (newNumber < 10)
{
return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 1));
}
return filename;
}
或者如果你想作为一个例子,你也可以删除ReplaceOnce方法,并像这样做:
public static string NextImageName(string filename, int newNumber)
{
if (newNumber == 0)
{
return Regex.Replace(filename, @"[\d+]", newNumber.ToString());
}
if (newNumber > 9)
{
return Regex.Replace(filename, @"(\d+)(?!.*\d)", newNumber.ToString());
}
if (newNumber < 10)
{
return Regex.Replace(filename, @"(\d)(?!.*\d)", newNumber.ToString());
}
return filename;
}