从C#中的字符串中删除最后一个字符。优雅的方式?


84

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

我做了:

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

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

Answers:


173

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

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

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

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

我收到了很多很好的答案。但是,就优雅而言,这是我将要使用的那个。但是,我不知道在低层次上哪种效率更高。因此,请自行选择!
卡尼

6
第二种解决方案是更易于阅读,理解和维护的方式,并且在低级别性能方面,差异是微不足道的。如果您知道,总是在-3位置,那么第一个解决方案仍然可以,但是过早的优化是浪费时间的可怕事情。
Scott Rippey

2
@Kani首先是效率最高的-但我完全同意Scott的观点。我总是会选择第二个,除非我在分析后知道有性能。瓶颈在这里。这两个(以及大多数其他答案)都将非常快-几乎可以满足所有目的。
Reed Copsey

如果没有逗号,您是否希望字符串不被修改?
凯尔·德莱尼

15

也许这:

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

我认为这是答案的“最优雅”-至少到目前为止。
汤姆·布谢尔

1
您对@ ReedCopsey怎么看?我认为是非常好的。
卡尼

@Kani:在优雅方面,我发现张贴的大多数答案都足够好除非确实被证明是瓶颈,否则我也不会为性能而烦恼。唯一要考虑的是如何处理不同格式的字符串...
km

考虑将第二个论点传递给2to,Split因为您不再关心任何逗号。
理查德

5

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

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)

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


3
String.Format("{0:0}", 123.4567);      // "123"

如果您的初始值为十进制成字符串,则需要转换

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

在此示例中,我选择不变文化,但您可以使用所需的文化。

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

编辑:您也可以使用Truncate删除或之后的所有内容。

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

好吧,在这种情况下,我得到了相同的数字,但昏迷了。
卡尼

您使用的确切字符串是什么?计算机使用哪种文化?
Patrick Desjardins

类似于示例:dddd,dd,其中d是数字。在这种情况下小数点位于之后。我正在标准化一些结果,删除了或使用而不是
卡尼

我不知道我是否会使用string.Format亲自进行此操作。在工作时,它会在将double传递给string.Format之前结束对double的装箱操作,从而创建一个额外的对象。
Christopher Currens,2011年

我不得不说,我不知道在玩String(子字符串)或拳击之间在性能方面有什么更好的选择。如果不大量使用,我认为这并不重要。视情况而定:)
Patrick Desjardins,

1

使用:

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. 速度。

1

您可以将LastIndexOf和Substring结合使用,以使所有字符都位于字符串中逗号最后一个索引的左侧。

字符串var = var.Substring(0,var.LastIndexOf(','));


0

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

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

4
这样只会删除字符串末尾的所有','字符。由于字符串“ 123,45”以数字结尾,因此"123,45".TrimEnd(',')将返回“ 123,45”。
pho11

Remove last characters from a string if this character is... 刚好适合我。感激。"oppa/ ".Trim().TrimEnd('/');
it3xl


-3

使用lastIndexOf。喜欢:

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

var是一个变量名。永远不要将其用作字符串的名称。-1; 另外,这仅给出索引,因此只能解决部分问题。您需要Remove()。
帕特里克·诺特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.