Cách xóa số không hàng đầu bằng C #


133

Làm cách nào để loại bỏ các số 0 đứng đầu trong chuỗi bằng C #?

Ví dụ trong các số sau, tôi muốn xóa tất cả các số 0 đứng đầu.

0001234
0000001234
00001234

3
bởi 'nvarchar datatype' Tôi giả sử bạn có nghĩa là chuỗi.
Ray

Và 'C £' là viết tắt của 'C #' ...
T30

Câu trả lời:


151

Nó thực sự phụ thuộc vào thời gian NVARCHAR là bao lâu, vì một vài trong số các phương thức trên (đặc biệt là các phương thức chuyển đổi qua IntXX) sẽ không hoạt động:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

Một cái gì đó như thế này sẽ

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

17
có vấn đề khi strInput= "0000000";hoặc tương tự. bởi vì nó sẽ trả về một chuỗi rỗng thay vì một số không.
avrahamcool

2
@avrahamcool có thể được xử lý bằng cách xem xét độ dài của chuỗi và chỉ cần trả về "0"nếu nó trống sau khi cắt. Hoặc sử dụng PadLeft(1, '0').
Cœur

309

Đây là mã bạn cần:

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

7
có vấn đề khi strInput= "0000000";hoặc tương tự
avrahamcool 6/214

@Emjay vì nó sẽ trả về một chuỗi rỗng thay vì một số không.
avrahamcool

22
@avrahamcool nó vẫn sẽ làm chính xác những gì nó cần. Trả về một số 0 duy nhất sẽ là một ngoại lệ và cần được xử lý bởi nhà phát triển.
dùng609926

12
strInput.TrimStart('0').PadLeft(1, '0');sẽ xử lý "0000" > "0".
Chris Romp

30

Mã để tránh trả về một chuỗi trống (khi đầu vào giống như "00000").

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

2
Hãy giả sử rằng chuỗi rất dài, tại sao cắt nó hai lần? bạn có thể lưu chuỗi đã cắt trong một biến
avrahamcool

@avrahamcool, ý bạn là gì, nó được cắt hai lần ở đâu? Cảm ơn các bình luận.
msysmilu

ah, @avrahamcool, có lẽ đó là lý do tại sao tôi chỉnh sửa nó :) cuối cùng đó là một câu hỏi bộ nhớ so với thời gian tính toán; Tôi đoán bộ nhớ ngày nay không còn là vấn đề nữa trong các loại ứng dụng này
msysmilu

25

return numberString.TrimStart('0');


5
có vấn đề khi numberString= "0000000";hoặc tương tự
avrahamcool 6/214

1
@msysmilu vì nó sẽ trả về một chuỗi rỗng thay vì một số không.
avrahamcool

1
@avrahamcool Bạn nói đúng. Ergo tôi đã đề xuất một câu trả lời để tránh điều này
msysmilu

5

TryPude hoạt động nếu số của bạn ít hơn Int32.MaxValue . Điều này cũng cung cấp cho bạn cơ hội để xử lý các chuỗi định dạng xấu. Hoạt động tương tự cho Int64.MaxValueInt64.TryPude .

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

Có lẽ quá mức cho câu hỏi như được đặt ra, đây là giải pháp mà tôi đang tìm kiếm vì nó cũng cho phép loại bỏ các số 0 được đệm phải cho số thập phân. (Decimal.TryPude)
winwaed

@JK Tôi biết bài viết đã cũ nhưng tôi thực sự thích giải pháp này vì nó sạch sẽ và rất dễ hiểu. Chỉ cần một câu hỏi thay đổi văn bản trong một sự kiện nhấn phím cũng sẽ kích hoạt sự kiện được trao đổi văn bản - tôi có đúng không?
Ken

3

Regex này cho phép bạn tránh kết quả sai với các chữ số chỉ xuất phát từ số "0000" và hoạt động trên các chữ số có độ dài bất kỳ:

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

Và regex này sẽ xóa các số 0 đứng đầu ở bất cứ đâu trong chuỗi:

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

2

Sử dụng như sau sẽ trả về một 0 khi đầu vào là 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
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Nic3500

Cải thiện câu trả lời theo đề xuất từ ​​@ Nic3500
Bharat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.