Як видалити провідні нулі за допомогою C #


134

Як видалити провідні нулі в рядках за допомогою C #?

Наприклад, у наступних номерах я хотів би видалити всі провідні нулі.

0001234
0000001234
00001234

3
"nvarchar datatype" я припускаю, що ви маєте на увазі рядок.
Рей

І "C £" означає "C #" ...
T30

Відповіді:


151

Це дійсно залежить від тривалості NVARCHAR, оскільки деякі з перерахованих вище (особливо ті, які перетворюються через IntXX) не працюватимуть для:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

Щось подібне було б

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

17
проблематично, коли strInput= "0000000";або подібне. тому що він поверне порожній рядок замість одного нуля.
avrahamcool

2
@avrahamcool, яку можна обробити, переглянувши довжину струни та просто повернувшись, "0"якщо після обрізки вона порожня. Або за допомогою PadLeft(1, '0').
Cœur

310

Це потрібний вам код:

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

7
проблематично, коли strInput= "0000000";чи подібне
avrahamcool

@Emjay, оскільки він поверне порожній рядок замість одного нуля.
avrahamcool

22
@avrahamcool все одно робитиме саме те, що має. Повернення єдиного нуля було б винятком, і ним повинен займатися розробник.
user609926

12
strInput.TrimStart('0').PadLeft(1, '0');впорається "0000" > "0".
Кріс Ромп

30

Код, щоб уникнути повернення порожнього рядка (коли введення типу "00000").

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

2
припустимо, що струна дуже довга, навіщо обрізати її двічі? ви можете зберегти обрізану рядок у змінній
avrahamcool

@avrahamcool, що ти маєш на увазі, де її обрізають двічі? Дякуємо за коментар
msysmilu

ах, @avrahamcool, можливо, саме тому я її відредагував :) врешті-решт це питання пам’яті проти обчислення часу; Я думаю, сьогодні пам’ять вже не є проблемою у подібних додатках
msysmilu

25

return numberString.TrimStart('0');


5
проблематично, коли numberString= "0000000";чи подібне
avrahamcool

1
@msysmilu, оскільки він поверне порожній рядок замість одного нуля.
avrahamcool

1
@avrahamcool Ви праві. Ерго я запропонував відповідь, щоб цього уникнути
msysmilu

5

TryParse працює, якщо ваш номер менше Int32.MaxValue . Це також дає можливість обробляти рядки з неправильним форматуванням. Працює так само для Int64.MaxValue та Int64.TryParse .

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

Можливо, надмірне ставлення до поставленого питання, це саме таке рішення, яке я шукаю, оскільки він також дозволяє видалити нульові нулі для десяткових знаків. (Decimal.TryParse)
winwaed

@JK Я знаю, що пост старий, але мені дуже подобається це рішення, оскільки воно чисте і дуже легко зрозуміти. Лише одне запитання про зміну тексту під час ключової події також призведе до запуску змінити текст - чи я правильно?
Кен

3

Цей Regex дозволяє уникнути неправильного результату з цифрами, що складається лише від нулів "0000", і працювати над цифрами будь-якої довжини:

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

І цей регулярний вираз видалить провідні нулі де-небудь всередині рядка:

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

2

Використовуючи наведене нижче, повернеться один 0, коли вхід буде 0.

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
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
Nic3500

Удосконалена відповідь за пропозицією від @ Nic3500
Bharat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.