วิธีลบเลขศูนย์นำหน้าโดยใช้ C #


138

จะลบเลขศูนย์นำหน้าในสตริงโดยใช้ C # ได้อย่างไร?

ตัวอย่างเช่นในตัวเลขต่อไปนี้ฉันต้องการลบเลขศูนย์นำหน้าทั้งหมด

0001234
0000001234
00001234

3
โดย 'nvarchar datatype' ฉันคิดว่าคุณหมายถึงสตริง
เรย์

และ 'C £' ย่อมาจาก 'C #' ...
T30

คำตอบ:


155

ขึ้นอยู่กับระยะเวลาที่ 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

313

นี่คือรหัสที่คุณต้องการ:

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"จะจัดการ
Chris Romp

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 คุณพูดถูก Ergo ฉันแนะนำคำตอบเพื่อหลีกเลี่ยงสิ่งนี้
msysmilu

5

TryParseทำงานถ้าจำนวนของคุณน้อยกว่าInt32.MaxValue นอกจากนี้ยังเปิดโอกาสให้คุณจัดการกับสตริงที่มีรูปแบบไม่ถูกต้อง การทำงานเหมือนกันสำหรับInt64.MaxValueและInt64.TryParse

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

บางทีอาจจะมากเกินไปสำหรับคำถามที่วางไว้นี่เป็นวิธีแก้ปัญหาที่ฉันกำลังมองหาเพราะมันยังช่วยให้สามารถลบศูนย์เบาะขวาสำหรับทศนิยมได้ (Decimal.TryParse)
winwaed

@JK ฉันรู้ว่าโพสต์เก่า แต่ฉันชอบวิธีนี้มากเพราะมันสะอาดและเข้าใจง่ายมาก คำถามเพียงข้อเดียวที่เปลี่ยนข้อความในเหตุการณ์กดแป้นจะทำให้เหตุการณ์เปลี่ยนแปลงข้อความ - ฉันถูกต้องหรือไม่
Ken

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

และ regex นี้จะลบศูนย์นำหน้าที่ใดก็ได้ภายในสตริง:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.