Usuń ostatnie znaki z ciągu w C #. Elegancki sposób?


84

Mam taki ciąg numeryczny 2223,00. Chciałbym to przekształcić w 2223. To jest: bez informacji po, ”. Załóżmy, że po znaku „ , ” będą tylko dwa miejsca po przecinku .

Zrobiłem:

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

Czy jest bardziej eleganckie rozwiązanie? Może używając innej funkcji? -Nie lubię podawać jednoznacznych liczb-

Odpowiedzi:


173

Możesz po prostu użyć Usuń przeciążenie, które przyjmuje jeden parametr:

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

Jeśli jednak próbujesz uniknąć twardego kodowania długości, możesz użyć:

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

Otrzymałem wiele dobrych odpowiedzi. Ale to ten, którego użyję, jeśli chodzi o elegancję. Niemniej jednak nie wiem, na niskim poziomie , który jest bardziej wydajny. Więc dokonaj wyboru!
Kani

6
Drugie rozwiązanie jest dużo łatwiejsze do odczytania, zrozumienia i utrzymania, a jeśli chodzi o wydajność na niskim poziomie , różnica jest niewiarygodnie niewielka. Jeśli WIESZ, że ,jest zawsze na pozycji -3, to pierwsze rozwiązanie jest nadal OK, ale przedwczesna optymalizacja jest straszną rzeczą, na którą marnujesz czas.
Scott Rippey

2
@Kani Pierwsza jest najbardziej wydajna - ale całkowicie zgadzam się ze Scottem. Zawsze wybierałbym ten drugi, chyba że po wyprofilowaniu wiedziałem, że jest perf. wąskie gardło tutaj. Obie te odpowiedzi (i większość innych odpowiedzi) będą bardzo szybkie - wystarczająco dobre do prawie wszystkich celów.
Reed Copsey

Załóżmy, że chcesz, aby ciąg był niezmodyfikowany, jeśli nie ma przecinka?
Kyle Delaney

15

Być może to:

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

Myślę, że to „najbardziej elegancka” z odpowiedzi - przynajmniej na razie.
Tom Bushell

1
co sądzisz o tym @ ReedCopsey? Myślę, że jest bardzo dobry.
Kani

@Kani: Jeśli chodzi o elegancję, większość opublikowanych odpowiedzi wydaje mi się wystarczająco dobra . Nie przejmowałbym się też wydajnością, chyba że naprawdę okaże się wąskim gardłem. Jedyną rzeczą do rozważenia jest to, jak chcesz radzić sobie ze strunami w innym formacie ...
km

Rozważ przekazanie drugiego argumentu 2do, Splitponieważ nie obchodzą Cię żadne dalsze przecinki.
Richard

5

To zwróci ci łańcuch wykluczający wszystko po przecinku

str = str.Substring(0, str.IndexOf(','));

Oczywiście przy założeniu , że Twój ciąg ma przecinek z miejscami dziesiętnymi. Powyższy kod nie powiedzie się, jeśli tak się nie stanie. Chciałbyś zrobić więcej kontroli:

commaPos = str.IndexOf(',');
if(commaPos != -1)
    str = str.Substring(0, commaPos)

Zakładam, że zaczynasz od sznurka. Idealnie, jeśli pracujesz z liczbą na początku, taką jak zmiennoprzecinkowa lub podwójna, możesz po prostu rzucić ją na int, a następnie wykonaj myInt.ToString():

myInt = (int)double.Parse(myString)

To analizuje double przy użyciu bieżącej kultury (tutaj w USA używamy .dla miejsc dziesiętnych). Jednak w tym przypadku ponownie zakłada się, że można przeanalizować ciąg wejściowy.


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

Jeśli twoja wartość początkowa jest ułamkiem dziesiętnym na ciąg, musisz dokonać konwersji

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

W tym przykładzie wybieram kulturę niezmienną, ale możesz użyć tej, którą chcesz.

Wolę używać funkcji formatowania, ponieważ nigdy nie wiadomo, czy w przyszłości liczba dziesiętna może zawierać 2 lub 3 wiodące liczby.

Edycja: możesz również użyć, Truncateaby usunąć wszystko po, lub.

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

Cóż, w tym przypadku otrzymuję ten sam numer, ze śpiączką .
Kani

Jakiego dokładnie ciągu używasz i jakiej kultury jest Twój komputer?
Patrick Desjardins

Jak w przykładzie: dddd, dd , gdzie d jest cyfrą. Te są po przecinku , w tym przypadku. Standaryzuję niektóre wyniki, usuwam . i , lub używając . zamiast ,
Kani

Nie wiem, czy użyłbym string.Format do tego osobiście. Podczas gdy to działa, kończy umieszczanie podwójnego przed przekazaniem go do string.Format, tworząc w ten sposób dodatkowy obiekt.
Christopher Currens

Muszę powiedzieć, że nie wiem, co jest lepsze pod względem wydajności między zabawą Stringiem (podciągiem) a boksem. Nie sądzę, żeby miało to znaczenie, jeśli nie jest intensywnie używane. Zależy od sytuacji :)
Patrick Desjardins

1

Posługiwać się:

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

Wolę tutaj metodę rozszerzenia z dwóch powodów:

  1. Mogę to połączyć za pomocą Substring. Example: f1.Substring(directorypathLength).SubstringFromEnd(1)
  2. Prędkość.

1

Możesz użyć kombinacji LastIndexOf i Substring, aby uzyskać wszystkie znaki po lewej stronie ostatniego indeksu przecinka w żądle.

string var = var.Substring (0, var.LastIndexOf (','));


0

Możesz użyć TrimEnd. Jest również wydajny i wygląda na czysty.

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

4
Spowoduje to usunięcie tylko wszystkich znaków „,”, które znajdują się na końcu ciągu. Ponieważ ciąg „123,45” kończy się cyframi, "123,45".TrimEnd(',')zwróci „123,45”.
phoog

Remove last characters from a string if this character is... Po prostu dobrze mi pasuje. Doceniony. "oppa/ ".Trim().TrimEnd('/');
it3xl


-3

Użyj lastIndexOf. Lubić:

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

var to nazwa zmiennej. Nigdy nie powinno być używane jako nazwa dla łańcucha. -1; dodatkowo daje to tylko indeks, więc rozwiązuje tylko część problemu. Potrzebujesz Usuń ().
Patrick Knott,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.