【问题标题】:Remove last characters from a string in C#. An elegant way?从 C# 中的字符串中删除最后一个字符。优雅的方式?
【发布时间】:2011-11-11 18:51:03
【问题描述】:

我有一个像 2223,00 这样的数字字符串。我想将其转换为2223。这是:在“,”之后 没有信息。假设“,”后面只有两位小数。

我做到了:

str = str.Remove(str.Length - 3, 3);

有没有更优雅的解决方案?也许使用其他功能? -我不喜欢输入明确的数字-

【问题讨论】:

    标签: c# .net string


    【解决方案1】:

    您实际上可以只使用带有一个参数的 Remove 重载:

    str = str.Remove(str.Length - 3);
    

    但是,如果您想避免对长度进行硬编码,您可以使用:

    str = str.Remove(str.IndexOf(','));
    

    【讨论】:

    • 我收到了很多很好的答案。但就优雅而言,这是我将使用的那个。不过,我不知道在低级中,哪个更有效。所以,做出你的选择吧!
    • 第二种解决方案更易于阅读、理解和维护,并且就低级性能而言,差异微不足道。如果您知道, 始终位于位置-3,那么第一个解决方案仍然可以,但是过早优化 是一件浪费您时间的可怕事情。
    • @Kani 第一个是最有效的——但我完全同意 Scott 的观点。我总是选择第二个,除非我知道,在分析之后,有一个性能。瓶颈在这里。这两个(以及大多数其他答案)都将非常快 - 几乎可以满足所有目的。
    • 假设如果没有逗号,您希望字符串不被修改?
    【解决方案2】:

    也许是这样的:

    str = str.Split(",").First();
    

    【讨论】:

    • 我认为这是“最优雅”的答案——至少到目前为止。
    • 你对@ReedCopsey 有什么看法?我认为这是一个非常好的。
    • @Kani:就优雅而言,我发现大多数答案足够好。我也不会为性能而烦恼,除非它真的被证明是瓶颈。唯一需要考虑的是你想如何处理不同格式的字符串...
    • 考虑将2 的第二个参数传递给Split,因为您不再关心逗号。
    【解决方案3】:

    这将返回一个字符串,不包括逗号后的所有内容

    str = str.Substring(0, str.IndexOf(','));
    

    当然,这假设你的字符串实际上有一个带小数点的逗号。如果没有,上面的代码将失败。您需要进行更多检查:

    commaPos = str.IndexOf(',');
    if(commaPos != -1)
        str = str.Substring(0, commaPos)
    

    我假设您开始使用字符串。理想情况下,如果您使用数字开头,例如浮点数或双精度数,您可以将其转换为 int,然后执行 myInt.ToString() 之类的操作:

    myInt = (int)double.Parse(myString)
    

    这使用当前文化解析双精度数(在美国,我们使用. 表示小数点)。但是,这再次假设您的输入字符串可以被解析。

    【讨论】:

      【解决方案4】:
      String.Format("{0:0}", 123.4567);      // "123"
      

      如果你的初始值是小数转换成字符串,则需要转换

      String.Format("{0:0}", double.Parse("3.5", CultureInfo.InvariantCulture))  //3.5
      

      在这个例子中,我选择了不变的文化,但你可以使用你想要的。

      我更喜欢使用格式化功能,因为您永远不知道小数将来是否包含 2 或 3 个前导数字。

      编辑:您也可以使用 Truncate 删除所有 , 或 .

      Console.WriteLine(Decimal.Truncate(Convert.ToDecimal("3,5")));
      

      【讨论】:

      • 好吧,在这种情况下,我得到的是相同的号码,只是上面有 coma
      • 您使用的确切字符串是什么?您的计算机是什么文化?
      • 如示例中的: dddd,dd ,其中 d 是一个数字。在这种情况下,小数点在 , 之后。我正在标准化一些结果,删除 .,,或者使用 . 而不是 ,
      • 我不知道我是否会使用 string.Format 来亲自执行此操作。虽然它可以工作,但它会在传递给 string.Format 之前对 double 进行装箱,从而创建一个额外的对象。
      • 我不得不说,我不知道在玩String(子字符串)和拳击之间哪个更好。我认为如果不大量使用它并不重要。视情况而定:)
      【解决方案5】:

      用途:

      public static class StringExtensions
      {
          /// <summary>
          /// Cut End. "12".SubstringFromEnd(1) -> "1"
          /// </summary>
          public static string SubstringFromEnd(this string value, int startindex)
          {
              if (string.IsNullOrEmpty(value)) return value;
              return value.Substring(0, value.Length - startindex);
          }
      }
      

      我更喜欢这里的扩展方法有两个原因:

      1. 我可以用 Substring 链接它。 Example: f1.Substring(directorypathLength).SubstringFromEnd(1)
      2. 速度。

      【讨论】:

        【解决方案6】:

        您可以结合使用 LastIndexOf 和 Substring 来获取字符串中逗号最后一个索引左侧的所有字符。

        string var = var.Substring(0, var.LastIndexOf(','));

        【讨论】:

          【解决方案7】:

          您可以使用TrimEnd。它也很高效,看起来很干净。

          "Name,".TrimEnd(',');
          

          【讨论】:

          • 这只会删除字符串末尾的任何 ',' 字符。由于字符串“123,45”以数字结尾,"123,45".TrimEnd(',') 将返回“123,45”。
          • Remove last characters from a string if this character is... 正好适合我。赞赏。 "oppa/ ".Trim().TrimEnd('/');
          【解决方案8】:

          试试下面的。它对我有用:

          str = str.Split(',').Last();
          

          【讨论】:

            【解决方案9】:

            从 C# 8.0 开始,可以使用 range operator 来执行此操作。

            string textValue = "2223,00";
            textValue = textValue[0..^3];
            Console.WriteLine(textValue);
            

            这将输出字符串2223

            0 表示它应该从字符串中的第零位开始

            .. 表示它应该取两边操作数之间的范围

            ^ 表示它应该采用相对于序列末尾的操作数

            3 表示它应该从字符串的第三个位置结束

            【讨论】:

              【解决方案10】:

              使用 lastIndexOf。喜欢:

              string var = var.lastIndexOf(',');
              

              【讨论】:

              • var 是一个变量名。它永远不应该用作字符串的名称。 -1;另外这只给出了索引,所以它只解决了部分问题。你需要 Remove()。
              猜你喜欢
              • 2011-01-19
              • 2016-10-11
              • 1970-01-01
              • 2010-11-08
              • 2011-04-26
              • 2017-08-19
              相关资源
              最近更新 更多