【问题标题】:how to increase the value of an integer in a string如何增加字符串中整数的值
【发布时间】:2012-04-09 19:09:53
【问题描述】:

好的,我目前有这个代码

        public int i = 0; //this is outside of the private void button1_click
        string str = txtEmail.Text;
        int pos = str.LastIndexOf("@");
        string str2 = str.Substring(pos);
        string str3 = str.Substring(0, str.LastIndexOf("@"));
        txtEmail.Text = str3 + i++ + str2;

它将电子邮件拆分为 2 个字符串,然后将它们与它们之间的整数组合在一起,但我希望它更改整数。但是该代码只是让它说当我按下按钮将 1 增加到 2 时,文本变成了 awesome1@email.com,它只是这样做了。 awesome12@email.com 等等。我如何让它只在 1 上加 1 而不是在 1 旁边放 2?

【问题讨论】:

  • 如果 Jon 的答案不是您想要的,我认为您需要向我们展示您正在使用的循环(我怀疑)。
  • 什么是变量i,在哪里初始化?
  • 变量 i = 0 当前位于 button_click 事件之外,它是一个公共整数,@AlexInParis 我没有使用循环
  • 您需要跟踪原始字符串,或者至少是您插入的数字的最后一个索引,以便准确替换您的 int 值。

标签: c# winforms string substring


【解决方案1】:

不确定i 在这段代码中来自哪里,但希望这会起作用

    string str = txtEmail.Text;
    int pos = str.LastIndexOf("@");
    string str2 = str.Substring(pos);
    string str3 = str.Substring(0, str.LastIndexOf("@"));
    txtEmail.Text = str3 + (i++).ToSting() + str2;

【讨论】:

  • 不起作用仍然只是添加到字符串中并使其更长不会用自身的 +1 版本替换数字
  • 同意,但我认为在这种情况下不会有太大的内存问题
  • 最好使用string.Concat,避免制作stringbuilder的GC开销
  • 另外,这可能会回答:stackoverflow.com/questions/21078/…
  • @RickHoving 我不认为字符串生成器是这样工作的吗?因为这样做给了我一个错误,说 stringbuilder“没有包含 3 个参数的构造函数”。
【解决方案2】:

这应该可行:

String email = "awesome1@email.com";
String[] tokens = email.Split(new char[] { '@' }, StringSplitOptions.RemoveEmptyEntries);
const String allowed = "0123456789";
String part1 = "";
String numberStr = "";
foreach (char c in tokens[0].Reverse())
{
    if (allowed.Contains(c) && part1.Length==0)
    {
        numberStr += c;
    }
    else
    {
        part1 += c;
    }
}
part1 = new String(part1.Reverse().ToArray());
int number = int.Parse(new String(numberStr.Reverse().ToArray()));
String result = String.Format("{0}{1}@{2}", part1, number++, tokens[1]);

虽然看起来有点麻烦。如果有,请接受正则表达式答案。

【讨论】:

    【解决方案3】:

    这会起作用

    public static string IncNumberBeforeAt(string text)
    {
      int lastAt = text.LastIndexOf('@');
      if (lastAt != -1)
      {
        int pos = lastAt - 1;
        string num = "";
        while (text[pos] >= '0' && text[pos] <= '9')
        {
          num = text[pos] + num;
          pos--;
          if (pos < 0)
            break;          
        }
        int numInc = int.Parse(num) + 1;
        return text.Replace(num.ToString() + "@", numInc.ToString() + "@");
      }
      else
      {
        return text;
      }
    }
    

    测试

    IncNumberBeforeAt("awesome1@email.com"); // => returns awesome2@email.com
    IncNumberBeforeAt("awesome234@email.com"); // => returns awesome235@email.com
    IncNumberBeforeAt("email.com"); // => returns email.com
    IncNumberBeforeAt("5@email.com"); // => returns 6@email.com
    

    【讨论】:

    • 测试"awesome๐1@email.com"char.IsNumber(甚至char.IsDigit)允许使用许多字符。
    【解决方案4】:

    您必须记录您的原始电子邮件地址:

    例如

    string originalEmail = "test@gmail.com";
    
    var parts = originalEmail.Split('@');
    
    txtEmail.Text = string.Format("{0}{1}@{2}", parts[0], i++, parts[1]);
    

    【讨论】:

    • 它仍然做同样的事情,也就是它不起作用:/谢谢你的尝试
    • 这只有在您继续使用原始电子邮件地址时才有效,即没有整数的那个。
    【解决方案5】:

    我测试了以下内容,看起来它可以解决您的问题。更改您的这一行:

    string str = txtEmail.Text; 
    

    到这里:

    string str = txtEmail.Text.Replace(string.Format("{0}@", i - 1), "@");
    

    它进行了设置,以便您的电子邮件地址采用以下形式:

    awesome1@email.com 
    awesome2@email.com 
    awesome3@email.com 
    etc.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-27
      • 2021-11-09
      • 2013-05-12
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 2012-11-06
      相关资源
      最近更新 更多