C # kullanarak baştaki sıfırlar nasıl kaldırılır


134

C # kullanarak dizelerde önde gelen sıfırlar nasıl kaldırılır?

Örneğin, aşağıdaki sayılarda, baştaki tüm sıfırları kaldırmak istiyorum.

0001234
0000001234
00001234

3
'nvarchar datatype' ile dize demek istiyorum.
Ray

Ve 'C £', 'C #' anlamına gelir ...
T30

Yanıtlar:


151

Gerçekten, NVARCHAR'ın ne kadar sürdüğüne bağlıdır, çünkü yukarıdakilerden bazıları (özellikle IntXX aracılığıyla dönüşüm gerçekleştirenler) yöntemleri işe yaramayacaktır:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

Bunun gibi bir şey

String s ="0000058757843950000120465875468465874567456745674000004000".TrimStart(new Char[] { '0' } );
// s = "58757843950000120465875468465874567456745674000004000"

17
ne zaman strInput= "0000000";ya da benzeri sorunlu . çünkü sıfır yerine boş bir dize döndürür.
avrahamcool

2
@avrahamcool, ipin uzunluğuna bakarak ve trimden "0"sonra boşsa geri dönerek işlenebilir . Veya kullanarak PadLeft(1, '0').
Cœur

310

Bu, ihtiyacınız olan koddur:

string strInput = "0001234";
strInput = strInput.TrimStart('0');

7
ne zaman strInput= "0000000";veya benzeri sorunlu
avrahamcool

@Emjay çünkü bir sıfır yerine boş bir dize döndürecek.
avrahamcool

22
@avrahamcool hala tam olarak ne gerekiyorsa yapardı. Tek bir sıfır döndürmek bir istisna olacaktır ve geliştirici tarafından ele alınmalıdır.
user609926

12
strInput.TrimStart('0').PadLeft(1, '0');idare edecek "0000" > "0".
Chris Romp

30

Boş bir dize döndürmekten kaçınmak için kod (giriş "00000" gibi olduğunda).

string myStr = "00012345";
myStr = myStr.TrimStart('0');
myStr = myStr.Length > 0 ? myStr : "0";

2
dizenin çok uzun olduğunu varsayalım, neden iki kez keselim? kesilmiş ipi bir değişkene kaydedebilirsiniz
avrahamcool

@avrahamcool, ne demek istiyorsun, iki kez nerede kesiliyor? Yorum için teşekkürler.
17:45

ah, @avrahamcool, belki de bu yüzden düzenledim :) sonunda bir soru bellek vs işlem süresi; Bugün bellek bu tür uygulamalarda artık bir sorun değil sanırım
msysmilu

25

return numberString.TrimStart('0');


5
ne zaman numberString= "0000000";veya benzeri sorunlu
avrahamcool

1
@ msysmilu, sıfır yerine boş bir dize döndürür.
avrahamcool

1
@avrahamcool Haklısın. Ergo i önlemek için bir cevap önerdi
msysmilu

5

TryParse , numaranız Int32.MaxValue değerinden küçükse çalışır . Bu ayrıca kötü biçimlendirilmiş dizeleri işleme fırsatı verir. Int64.MaxValue ve Int64 için de aynı şekilde çalışır .

int number;
if(Int32.TryParse(nvarchar, out number))
{
   // etc...
   number.ToString();
}

Belki de soru olarak aşırıya kaçmış, bu da ondalık için sağ yastıklı sıfırların kaldırılmasına izin verdiği için aradığım çözüm. (
Ondalık Deneme Parçası

@JK Gönderinin eski olduğunu biliyorum ama temiz ve anlaşılması çok kolay olduğu için bu çözümü gerçekten çok seviyorum. Bir tuşa basma olayında metni değiştiren tek bir soru da metin değişimli olayı tetikleyecektir - doğru mu?
Ken

3

Bu Regex, yalnızca "0000" sıfırlarından oluşan ve herhangi bir uzunlukta rakamlar üzerinde çalışan rakamlarla yanlış sonuçlardan kaçınmanıza izin verir:

using System.Text.RegularExpressions;

/*
00123 => 123
00000 => 0
00000a => 0a
00001a => 1a
00001a => 1a
0000132423423424565443546546356546454654633333a => 132423423424565443546546356546454654633333a
*/

Regex removeLeadingZeroesReg = new Regex(@"^0+(?=\d)");
var strs = new string[]
{
    "00123",
    "00000",
    "00000a",
    "00001a",
    "00001a",
    "0000132423423424565443546546356546454654633333a",
};
foreach (string str in strs)
{
    Debug.Print(string.Format("{0} => {1}", str, removeLeadingZeroesReg.Replace(str, "")));
}

Ve bu normal ifade dize içinde herhangi bir yerde bulunan sıfırları kaldıracaktır:

new Regex(@"(?<!\d)0+(?=\d)");
//  "0000123432 d=0 p=002 3?0574 m=600"
//     => "123432 d=0 p=2 3?574 m=600"

2

Aşağıdakilerin kullanılması, girişin tümü 0 olduğunda tek bir 0 döndürür.

string s = "0000000"
s = int.Parse(s).ToString();

0
Regex rx = new Regex(@"^0+(\d+)$");
rx.Replace("0001234", @"$1"); // => "1234"
rx.Replace("0001234000", @"$1"); // => "1234000"
rx.Replace("000", @"$1"); // => "0" (TrimStart will convert this to "")

// usage
var outString = rx.Replace(inputString, @"$1");

5
Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne ilişkin ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
Nic3500

@ Nic3500
Bharat
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.