Удалите последние символы из строки в C #. Элегантный способ?


84

У меня есть такая числовая строка 2223,00. Я хотел бы преобразовать его в 2223. Это: без информации после " , ". Предположим, что после " , " будет только два десятичных знака .

Я сделал:

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

Есть ли более элегантное решение? Может использовать другую функцию? -Я не люблю указывать явные числа-

Ответы:


173

Фактически вы можете просто использовать перегрузку Remove, которая принимает один параметр:

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

Однако, если вы пытаетесь избежать жесткого кодирования длины, вы можете использовать:

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

Получил много хороших ответов. Но это тот, который я буду использовать с точки зрения элегантности. Тем не менее, я не знаю, на низком уровне , что более эффективно. Итак, сделайте свой выбор!
Kani

6
Второе решение намного проще читать, понимать и поддерживать, и с точки зрения производительности на низком уровне разница невероятно незначительна. Если вы ЗНАЕТЕ, что ,всегда находится в позиции -3, то первое решение все еще в порядке, но преждевременная оптимизация - ужасная вещь, на которую можно тратить время.
Скотт Риппи

2
@Kani Первый - самый эффективный, но я полностью согласен со Скоттом. Я всегда выбирал второе, если только после профилирования не знал, что это перфоманс. узкое место здесь. Оба эти (и большинство других ответов) будут очень быстрыми - достаточно хорошими почти для всех целей.
Reed Copsey

Предположим, вы хотите, чтобы строка оставалась неизменной, если нет запятой?
Kyle Delaney

15

Возможно это:

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

Я думаю, что это «самый элегантный» из ответов - по крайней мере, пока.
Tom Bushell

1
Что тебе нравится в @ ReedCopsey? Думаю, очень хороший.
Kani

@Kani: с точки зрения элегантности я считаю, что большинство опубликованных ответов достаточно хороши . Я бы тоже не стал беспокоиться о производительности, если только она не окажется узким местом. Единственное, что нужно учитывать, это как вы хотите поступить со струнами, поступающими в другом формате ...
km

Подумайте о передаче второго аргумента 2для, 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

В этом примере я выбираю инвариантную культуру, но вы можете использовать ту, которую хотите.

Я предпочитаю использовать функцию форматирования, потому что вы никогда не знаете, может ли десятичная дробь содержать 2 или 3 ведущих числа в будущем.

Изменить: вы также можете использовать Truncateдля удаления всего после, или.

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

Что ж, в этом случае я получаю тот же номер, но без комы .
Kani

Какую именно строку вы используете и какой культурой пользуется ваш компьютер?
Патрик Дежарден

Как в примере: dddd, dd , где d - цифра. В десятичных есть после того , как , в этом случае. Некоторые результаты стандартизирую, удаляю . и , или используя . вместо ,
Kani

Я не знаю, буду ли я использовать string.Format для этого лично. Пока он работает, он завершает упаковку двойника перед его передачей в string.Format, создавая таким образом дополнительный объект.
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. 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».
phoog

Remove last characters from a string if this character is... Просто мне подходит. Оценил. "oppa/ ".Trim().TrimEnd('/');
it3xl


-3

Используйте lastIndexOf. Подобно:

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

var - имя переменной. Его никогда не следует использовать в качестве имени строки. -1; кроме того, это дает только индекс, поэтому это решает только часть проблемы. Вам понадобится Remove ().
Патрик Нотт,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.