在C#中从字符串中移除最后几个字符,有优雅的方式吗?

88

我有一个数值字符串,类似这样的格式:2223,00。我想将其转化为 2223,也就是去掉 "," 后面的信息。假设只会有两位小数在 "," 之后

我的尝试:

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

有没有更优雅的解决方案?也许使用另一个函数? -我不喜欢放置明确的数字-

10个回答

177

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

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

不过,如果你想避免硬编码长度,可以使用以下代码:

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

我收到了很多好的答案。但是这个答案是我会使用的,因为它更加优雅。然而,在低级别方面,我不知道哪一个更有效率。所以,请自行选择! - user935375
6
第二种解决方案更易于阅读、理解和维护,在低级别性能方面,差异非常微不足道。如果你知道逗号,总是在第三个位置上,那么第一种解决方案仍然可以使用,但是过早优化是浪费时间的可怕事情。 - Scott Rippey
2
@Kani 第一个是最有效的-但我完全同意Scott的看法。 除非在分析后我知道这里存在性能瓶颈,否则我总会选择第二个。 这些都(以及大多数其他答案)将非常快速-足以满足几乎所有目的。 - Reed Copsey
假设如果没有逗号,您希望字符串保持不变? - Kyle Delaney

16

也许是这样:

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

我认为这是答案中“最优雅”的一个 - 至少目前为止。 - Tom Bushell
1
你认为 @ReedCopsey 的想法怎么样?我认为它非常好。 - user935375
@Kani:就优雅而言,我认为大多数回答都足够好了。除非真的证明是瓶颈,否则我不会担心性能问题。唯一需要考虑的是如何处理以不同格式出现的字符串... - k.m
考虑向 Split 传递第二个参数 2,因为您不关心任何进一步的逗号。 - Richard

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)

这将使用当前区域设置解析双精度数字(在美国,我们使用 . 作为小数点)。但是,这再次假设您的输入字符串可以被解析。


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")));

在这种情况下,我得到的数字是一样的,上面有逗号。 - user935375
你使用的确切字符串是什么,你的计算机所使用的文化是什么? - Patrick Desjardins
就像例子中的 dddd,dd,其中 d 代表数字。在这种情况下,小数点在 , 后面。我正在标准化一些结果,删除 . 和 **,**,或者使用 . 代替 **,**。 - user935375
我个人不确定是否会使用string.Format来完成这个任务。虽然它可以工作,但它会在传递给string.Format之前将double装箱,从而创建一个额外的对象。 - Christopher Currens
我必须说,就性能而言,在使用String(substring)或boxing时哪个更好,我不知道。如果不是被大量使用,我认为这并不重要。这取决于具体情况 :) - Patrick Desjardins
@Daok,我完全同意,boxing只有在例如大循环中使用时才真正重要,因为每次迭代都会分配一个新对象。 - Christopher Currens

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 链接使用。 示例: f1.Substring(directorypathLength).SubstringFromEnd(1)
  2. 速度。

1

自 C# 8.0 开始,使用 范围运算符 可以实现此操作。

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

这将输出字符串2223

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

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

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

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


1
你可以使用 LastIndexOf 和 Substring 结合起来,以获取字符串中逗号最后一个索引左边的所有字符。
代码如下:
``` string var = var.Substring(0, var.LastIndexOf(',')); ```

0
你可以使用 TrimEnd。它既高效,又看起来很干净。
"Name,".TrimEnd(',');

4
这将仅删除字符串末尾的任何','字符。由于字符串“123,45”以数字结尾,因此"123,45".TrimEnd(',') 将返回 "123,45"。 - phoog
Remove last characters from a string if this character is... Just fits me well. Appreciated. "oppa/ ".Trim().TrimEnd('/'); - it3xl

0
尝试以下方法,这对我有效:
str = str.Split(',').Last();

-3
使用 lastIndexOf。例如:
string var = var.lastIndexOf(',');

变量名应该是 var。它不应该被用作字符串的名称。-1;此外,这只给出了索引,因此它只解决了问题的一部分。你需要使用 Remove()。 - Patrick Knott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接