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.