Как удалить ведущие нули с помощью C #

134

Как удалить ведущие нули в строках с помощью C #?

Например, в следующих числах я хотел бы удалить все начальные нули.

0001234
0000001234
00001234
Кер
источник
3
под 'nvarchar datatype' я предполагаю, что вы имеете в виду строку.
Ray
А 'C £' означает 'C #' ...
T30

Ответы:

151

Это действительно зависит от длины NVARCHAR, поскольку некоторые из вышеперечисленных (особенно те, которые конвертируются через IntXX) не будут работать:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

Как то так

String s ="0000058757843950000120465875468465874567456745674000004000".TrimStart(new Char[] { '0' } );
// s = "58757843950000120465875468465874567456745674000004000"
Мастер Инсульт
источник
17
проблематично когда strInput= "0000000";или подобное. потому что он вернет пустую строку вместо одного нуля.
Авраамкул
2
@avrahamcool, который можно обработать, посмотрев на длину строки и просто вернув ее, "0"если после обрезки она пуста. Или используя PadLeft(1, '0').
Cœur
310

Это код, который вам нужен:

string strInput = "0001234";
strInput = strInput.TrimStart('0');
Крейг Хэннон
источник
7
проблематично, когда strInput= "0000000";или подобное
avrahamcool 06
@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";
msysmilu
источник
2
Предположим, что строка очень длинная, зачем обрезать ее дважды? вы можете сохранить обрезанную строку в переменной
avrahamcool
@avrahamcool, что ты имеешь в виду, где он обрезается дважды? Спасибо за комментарий.
msysmilu
ах, @avrahamcool, может, поэтому я его отредактировал :) в конце концов, это вопрос памяти и времени вычислений; я думаю, что сегодня память больше не проблема для такого рода приложений
msysmilu 01
25

return numberString.TrimStart('0');

луч
источник
5
проблематично когда numberString= "0000000";или похоже
avrahamcool
1
@msysmilu, потому что он вернет пустую строку вместо одного нуля.
avrahamcool
1
@avrahamcool Вы правы. Ergo я предложил ответ, чтобы избежать этого
msysmilu
5

TryParse работает, если ваше число меньше Int32.MaxValue . Это также дает вам возможность обрабатывать плохо отформатированные строки. То же самое для Int64.MaxValue и Int64.TryParse .

int number;
if(Int32.TryParse(nvarchar, out number))
{
   // etc...
   number.ToString();
}
JK.
источник
Возможно, это излишек для поставленного вопроса, это решение, которое я ищу, поскольку оно также позволяет удалять нули с правым заполнением для десятичных чисел. (Decimal.TryParse)
winwaed
@JK Я знаю, что пост старый, но мне очень нравится это решение, так как оно чистое и очень простое для понимания. Только один вопрос, изменяющий текст в событии нажатия клавиши, также вызовет событие измененного текста - я прав?
Кен,
3

Это регулярное выражение позволяет избежать неправильного результата с цифрами, которые состоят только из нулей «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"
DNP
источник
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
Бхарат