ฉันต้องการให้ข้อความเช่น "joe ($ 3,004.50)" ถูกกรองลงเหลือ 3004.50 แต่ regex แย่มากและไม่สามารถหาวิธีแก้ปัญหาที่เหมาะสมได้ ดังนั้นควรมีเพียงตัวเลขและจุดเท่านั้น - ทุกอย่างจะถูกกรอง ฉันใช้ C # และ VS.net 2008 framework 3.5
ฉันต้องการให้ข้อความเช่น "joe ($ 3,004.50)" ถูกกรองลงเหลือ 3004.50 แต่ regex แย่มากและไม่สามารถหาวิธีแก้ปัญหาที่เหมาะสมได้ ดังนั้นควรมีเพียงตัวเลขและจุดเท่านั้น - ทุกอย่างจะถูกกรอง ฉันใช้ C # และ VS.net 2008 framework 3.5
คำตอบ:
สิ่งนี้ควรทำ:
string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");
Regex.Replace(s, "[^$0-9.]", "");
คุณต้องการทิ้งเครื่องหมายดอลลาร์
regex คือ:
[^0-9.]
คุณสามารถแคช regex:
Regex not_num_period = new Regex("[^0-9.]")
จากนั้นใช้:
string result = not_num_period.Replace("joe ($3,004.50)", "");
อย่างไรก็ตามคุณควรจำไว้ว่าบางวัฒนธรรมมีระเบียบการเขียนจำนวนเงินที่แตกต่างกันเช่น 3.004,50
.
ไม่มีความหมายพิเศษ
คุณกำลังจัดการกับสตริง - สตริงคือ an IEumerable<char>
ดังนั้นคุณสามารถใช้ LINQ:
var input = "joe ($3,004.50)";
var result = String.Join("", input.Where(c => Char.IsDigit(c) || c == '.'));
Console.WriteLine(result); // 3004.50
สำหรับคำตอบที่ได้รับการยอมรับ MatthewGunn จะยกจุดที่ถูกต้องว่าตัวเลขเครื่องหมายจุลภาคและจุดทั้งหมดในสตริงทั้งหมดจะรวมเข้าด้วยกัน สิ่งนี้จะหลีกเลี่ยงสิ่งนั้น:
string s = "joe.smith ($3,004.50)";
Regex r = new Regex(@"(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)/)");
Match m = r.match(s);
string v = null;
if (m.Success) {
v = m.Groups[1].Value;
v = Regex.Replace(v, ",", "");
}
(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)
จะจับคู่ "h25" ในสตริง "joe.smith25 ($ 3,004.50)" ด้วย
วิธีการลบตัวละครที่ไม่เหมาะสมอาจเป็นปัญหาได้ จะเกิดอะไรขึ้นถ้ามีสายอื่น.
อยู่ในสตริง? มันจะไม่ถูกลบออกแม้ว่ามันควรจะเป็น!
การลบตัวเลขที่ไม่ใช่ตัวเลขหรือจุดออกสตริงjoe.smith ($3,004.50)
จะเปลี่ยนเป็นส่วนที่ไม่สามารถวิเคราะห์.3004.50
ได้
Imho ควรจับคู่รูปแบบเฉพาะและแยกออกโดยใช้กลุ่ม สิ่งง่ายๆคือการค้นหาเครื่องหมายจุลภาคตัวเลขและจุดที่ต่อเนื่องกันทั้งหมดด้วย regexp:
[\d,\.]+
ตัวอย่างการทดสอบ:
Pattern understood as:
[\d,\.]+
Enter string to check if matches pattern
> a2.3 fjdfadfj34 34j3424 2,300 adsfa
Group 0 match: "2.3"
Group 0 match: "34"
Group 0 match: "34"
Group 0 match: "3424"
Group 0 match: "2,300"
จากนั้นสำหรับการแข่งขันแต่ละรายการให้ลบเครื่องหมายจุลภาคทั้งหมดและส่งไปยังโปรแกรมแยกวิเคราะห์ หากต้องการจัดการกรณีเช่น12.323.344
คุณสามารถตรวจสอบอีกครั้งเพื่อดูว่าสตริงย่อยที่ตรงกันมีมากที่สุดหนึ่ง.
รายการ
""
ตอนนี้มันตรงกับทุกอย่างยกเว้น
Single.Parse()
หรือSingle.TryParse
?
joe.smith ($3,004.50)
? การลบคลาสตัวละครที่ไม่เหมาะสมก็อาจผิดพลาดได้