Видаліть останні символи з рядка в C #. Елегантний спосіб?


84

У мене є такий числовий рядок 2223,00. Я хотів би перетворити його на 2223. Це: без інформації після " , ". Припустимо, що після " , " буде лише два знаки після коми .

Я зробив:

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

Є більш елегантне рішення? Можливо, використовуючи іншу функцію? -Я не люблю вводити явні цифри-

Відповіді:


173

Ви насправді можете просто скористатися Remove overload, який приймає один параметр:

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

Однак, якщо ви намагаєтеся уникати жорсткого кодування довжини, ви можете використовувати:

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

Я отримав багато хороших відповідей. Але саме цей я буду використовувати з точки зору елегантності. Тим не менше, я не знаю, на низькому рівні , який з них є більш ефективним. Отже, зробіть свій вибір!
Кані

6
Друге рішення набагато легше читати, розуміти та підтримувати, а з точки зору низького рівня ефективності різниця є неймовірно незначною. Якщо ви ЗНАЄТЕ, що a ,завжди знаходиться в положенні -3, то перше рішення все ще гаразд, але передчасна оптимізація - це жахлива річ, на яку витрачаєте час.
Скотт Ріппі,

2
@Kani Перший є найефективнішим - але я повністю згоден із Скоттом. Я завжди вибирав би другу, якщо тільки не знав, після профілювання, що є задум. вузьке місце тут. Обидва ці варіанти (і більшість інших відповідей) будуть дуже швидкими - досить хорошими майже для всіх цілей.
Рід Копсі,

Припустимо, ви хочете, щоб рядок не змінювався, якщо немає коми?
Kyle Delaney

15

Можливо, це:

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

Я думаю, що це "найелегантніший" з відповідей - принаймні поки що.
Том Бушелл,

1
що ви думаєте про @ ReedCopsey? Я думаю, це дуже добре.
Кані

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

Подумайте над тим, щоб передати другий аргумент 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")));

Ну, я отримую те саме число в цьому випадку, хоч і кома на ньому.
Кані

Який саме рядок ви використовуєте та яку культуру має ваш комп’ютер?
Patrick Desjardins

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

Не знаю, чи використовував би я string.Format, щоб зробити це особисто. Поки він працює, він закінчує боксувати дубль до того, як його передати string.Format, створюючи таким чином додатковий об'єкт.
Крістофер Керренс,

Потрібно сказати, що я не знаю, що є кращим з точки зору продуктивності між грою зі Стрингом (підстрокою) або боксом. Я не думаю, що насправді має значення, якщо він не використовується інтенсивно. Залежно від ситуації :)
Патрік Дежардін

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.