C # 'da bir dizeden son karakterleri kaldırın. Zarif bir yol mu?


84

Bunun gibi sayısal bir dizim var 2223,00. Onu dönüştürmek istiyorum 2223. Bu: " , " işaretinden sonraki bilgiler olmadan . "Sonra sadece iki haneli olacağını varsayın , ".

Yaptım:

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

Daha zarif bir çözüm var mı? Belki başka bir işlev kullanıyor? -Açık sayılar koymaktan hoşlanmam-

Yanıtlar:


173

Aslında sadece bir parametre alan Aşırı yüklemeyi kaldır'ı kullanabilirsiniz:

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

Bununla birlikte, uzunluğu sabit kodlamaktan kaçınmaya çalışıyorsanız, şunları kullanabilirsiniz:

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

Çok güzel cevaplar aldım. Ama bu şıklık açısından kullanacağım. Yine de düşük seviyede hangisinin daha verimli olduğunu bilmiyorum . Öyleyse, seçimini yap!
— Kani

6
İkinci çözümün okunması, anlaşılması ve bakımı çok daha kolaydır ve düşük seviyeli performans açısından fark inanılmaz derecede önemsizdir. Eğer ,her zaman -3 konumunda olduğunu BİLİYORSANIZ, o zaman ilk çözüm hala uygundur, ancak erken optimizasyon zamanınızı boşa harcamak için korkunç bir şeydir.
— Scott Rippey

2
@Kani İlki en verimli olanı - ancak Scott'a tamamen katılıyorum. Profil oluşturduktan sonra bir performans olduğunu bilmediğim sürece her zaman ikinciyi seçerdim. burada darboğaz. Bunların her ikisi (ve diğer yanıtların çoğu) çok hızlı olacak - neredeyse tüm amaçlar için yeterince iyi.
— Reed Copsey

Virgül yoksa dizenin değiştirilmemiş olmasını istediğinizi varsayalım.
— Kyle Delaney

15

Belki bu:

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

Bence bu cevapların "en zarif" i - en azından şimdiye kadar.
— Tom Bushell

1
@ ReedCopsey ile ilgili ne düşünüyorsunuz? Bence çok iyi.
— Kani

@Kani: Zarafet açısından cevapların çoğunun yeterince iyi gönderildiğini düşünüyorum . Gerçekten darboğaz olduğu kanıtlanmadığı sürece performanstan da rahatsız olmazdım . Dikkate alınması gereken tek şey, farklı formatta gelen dizelerle nasıl başa çıkmak istediğinizdir ...
— km

Daha fazla virgül umursamadığınız 2için için ikinci bir argüman iletmeyi düşünün Split.
— Richard

5

Bu size virgülden sonraki her şeyi hariç tutan bir dize döndürecektir

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

Elbette, bu , dizenizin aslında ondalık sayılarla virgül içerdiğini varsayar . Aksi takdirde yukarıdaki kod başarısız olacaktır. Daha fazla kontrol yapmak istersiniz:

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

Başlamak için bir dizeyle çalıştığınızı varsayıyorum. İdeal olarak, şamandıra veya çift gibi, başlamak için bir sayı ile çalışıyorsanız, onu bir sayıya çevirebilir int, sonra şöyle yapabilirsiniz myInt.ToString():

myInt = (int)double.Parse(myString)

Bu, mevcut kültürü kullanarak ikiliyi ayrıştırır (burada ABD'de, .ondalık basamaklar için kullanıyoruz ). Ancak, bu yine girdi dizenizin ayrıştırılabileceğini varsayar.


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

Başlangıç ​​değeriniz ondalık bir dizge ise, dönüştürmeniz gerekir

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

Bu örnekte, Değişmez kültürü seçiyorum ama istediğinizi kullanabilirsiniz.

Biçimlendirme işlevini kullanmayı tercih ederim çünkü ondalık basamağın ileride 2 veya 3 önde gelen sayı içerebileceğini asla bilemezsiniz.

Düzenle:, Truncateveya işaretinden sonra tümünü kaldırmak için de kullanabilirsiniz .

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

Bu davada komaya girmesine rağmen aynı numarayı alıyorum .
— Kani

Kullandığınız tam dizi nedir ve bilgisayarınızın kültürü nedir?
— Patrick Desjardins

Örnekteki gibi: gggg, gg , burada d bir rakamdır. Ondalık sayılar peşinde , bu durumda. Bazı sonuçları standartlaştırıyorum, siliyorum . ve , veya kullanıyor . yerine ,
— Kani

Bunu kişisel olarak yapmak için string.Format kullanıp kullanmayacağımı bilmiyorum. Çalışırken, string.Format'a geçmeden önce ikiye katlama yaparak fazladan bir nesne yaratır.
— Christopher Currens

String (substring) ile oynamak veya boks yapmak arasında performans açısından neyin daha iyi olduğunu bilmediğimi söylemeliyim. Yoğun olarak kullanılmamasının gerçekten önemli olduğunu sanmıyorum. Duruma göre :)
— Patrick Desjardins

1

Kullanım:

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

Burada iki nedenden dolayı bir uzatma yöntemini tercih ediyorum:

  1. Substring ile zincirleyebilirim. Example: f1.Substring(directorypathLength).SubstringFromEnd(1)
  2. Hız.

1

Tüm karakterleri virgülün son dizininin soluna getirmek için LastIndexOf ve Substring'i birlikte kullanabilirsiniz.

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


0

Kullanabilirsiniz TrimEnd. Aynı zamanda verimli ve temiz görünüyor.

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

4
Bu yalnızca dizenin sonundaki tüm ',' karakterlerini kaldırır. "123,45" dizesi rakamlarla bittiği için "123,45".TrimEnd(',')"123,45" döndürür.
— phoog

Remove last characters from a string if this character is... Bana çok iyi uyuyor. Takdir edildi. "oppa/ ".Trim().TrimEnd('/');
— it3xl


-3

LastIndexOf kullanın. Sevmek:

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

var bir değişken adıdır. Asla bir dizge adı olarak kullanılmamalıdır. -1; ek olarak bu sadece indeksi verir, bu yüzden problemin sadece bir kısmını çözer. Kaldır'a () ihtiyacınız var.
— Patrick Knott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.