Удалите последние символы из строки в 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 (','));

Nothingman
источник
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
0

Попробуйте следующее. У меня сработало:

str = str.Split(',').Last();
Хамидреза Амини
источник
-3

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

string var = var.lastIndexOf(',');
шрей
источник
var - имя переменной. Его никогда не следует использовать в качестве имени строки. -1; кроме того, это дает только индекс, поэтому это решает только часть проблемы. Вам понадобится Remove ().
Патрик Нотт,