ลบอักขระสุดท้ายออกจากสตริงใน C # วิธีที่สง่างาม?


84

2223,00ฉันมีสตริงเป็นตัวเลขเช่นนี้ 2223ผมอยากจะเปลี่ยนไป นี่คือ: ไม่มีข้อมูลหลังเครื่องหมาย " , " สมมติว่าจะมีทศนิยมเพียงสองตัวหลังเครื่องหมาย " , "

ฉันทำ:

str = str.Remove(str.Length - 3, 3);

มีวิธีแก้ปัญหาที่หรูหรากว่านี้หรือไม่? อาจจะใช้ฟังก์ชั่นอื่น? - ฉันไม่ชอบใส่ตัวเลขที่ชัดเจน -

คำตอบ:


173

คุณสามารถใช้ Remove overload ที่รับพารามิเตอร์เดียว:

str = str.Remove(str.Length - 3);

อย่างไรก็ตามหากคุณพยายามหลีกเลี่ยงการเข้ารหัสความยาวอย่างหนักคุณสามารถใช้:

str = str.Remove(str.IndexOf(','));

ฉันได้รับคำตอบที่ดีมากมาย แต่อันนี้เป็นสิ่งที่ฉันจะใช้ในแง่ของความสง่างาม อย่างไรก็ตามฉันไม่รู้ว่าในระดับต่ำอันไหนมีประสิทธิภาพมากกว่ากัน ดังนั้นให้คุณเลือก!
Kani

6
วิธีที่สองคือวิธีที่ง่ายกว่าในการอ่านทำความเข้าใจและดูแลรักษาและในแง่ของประสิทธิภาพระดับต่ำความแตกต่างนั้นไม่มีนัยสำคัญอย่างไม่น่าเชื่อ หากคุณรู้ว่า,อยู่ที่ตำแหน่ง -3 เสมอวิธีแก้ปัญหาแรกก็ยังใช้ได้ แต่การเพิ่มประสิทธิภาพก่อนเวลาอันควรเป็นสิ่งที่น่ากลัวที่จะเสียเวลาไปกับคุณ
Scott Rippey

2
@Kani ประการแรกมีประสิทธิภาพมากที่สุด - แต่ฉันเห็นด้วยกับ Scott ฉันจะเลือกอย่างที่สองเสมอเว้นแต่ฉันจะรู้หลังจากสร้างโปรไฟล์แล้วว่ามีความสมบูรณ์แบบ คอขวดที่นี่ ทั้งสองข้อ (และคำตอบอื่น ๆ ส่วนใหญ่) จะเร็วมาก - ดีพอสำหรับวัตถุประสงค์เกือบทั้งหมด
Reed Copsey

สมมติว่าคุณต้องการให้สตริงยกเลิกการแก้ไขหากไม่มีลูกน้ำ?
Kyle Delaney

15

บางทีสิ่งนี้:

str = str.Split(",").First();

ฉันคิดว่านี่เป็นคำตอบที่ "สง่างามที่สุด" - อย่างน้อยก็จนถึงตอนนี้
Tom Bushell

1
คุณคิดยังไงกับ @ ReedCopsey one? ฉันคิดว่าเป็นสิ่งที่ดีมาก
Kani

@Kani: ในแง่ของความสง่างามผมพบว่าส่วนใหญ่ของคำตอบที่โพสต์ที่ดีพอ ฉันจะไม่ใส่ใจกับประสิทธิภาพเช่นกันเว้นแต่จะพิสูจน์ได้ว่าเป็นคอขวดจริงๆ สิ่งเดียวที่ต้องพิจารณาคือคุณต้องการจัดการกับสตริงในรูปแบบที่แตกต่างกันอย่างไร ...
กม.

พิจารณาส่งอาร์กิวเมนต์ที่สองของ2to Splitเพราะคุณไม่สนใจเครื่องหมายจุลภาคใด ๆ อีก
Richard

5

สิ่งนี้จะส่งคืนสตริงให้คุณโดยไม่รวมทุกอย่างหลังเครื่องหมายจุลภาค

str = str.Substring(0, str.IndexOf(','));

แน่นอนว่าสิ่งนี้จะถือว่าสตริงของคุณมีเครื่องหมายจุลภาคพร้อมทศนิยม รหัสด้านบนจะล้มเหลวหากไม่มี คุณต้องการตรวจสอบเพิ่มเติม:

commaPos = str.IndexOf(',');
if(commaPos != -1)
    str = str.Substring(0, commaPos)

ฉันสมมติว่าคุณกำลังทำงานกับสตริงเพื่อเริ่มต้นด้วย ตามหลักการแล้วหากคุณกำลังทำงานกับตัวเลขที่จะเริ่มต้นด้วยเช่น float หรือ double คุณสามารถโยนมันเป็นตัวเลขintจากนั้นทำmyInt.ToString()ดังนี้

myInt = (int)double.Parse(myString)

นี่จะแยกวิเคราะห์สองเท่าโดยใช้วัฒนธรรมปัจจุบัน (ที่นี่ในสหรัฐอเมริกาเราใช้.สำหรับจุดทศนิยม) อย่างไรก็ตามสิ่งนี้ถือว่าอีกครั้งถือว่าสตริงอินพุตของคุณสามารถแยกวิเคราะห์ได้


3
String.Format("{0:0}", 123.4567);      // "123"

หากค่าเริ่มต้นของคุณเป็นทศนิยมในสตริงคุณจะต้องแปลง

String.Format("{0:0}", double.Parse("3.5", CultureInfo.InvariantCulture))  //3.5

ในตัวอย่างนี้ฉันเลือกวัฒนธรรมคงที่ แต่คุณสามารถใช้วัฒนธรรมที่คุณต้องการได้

ฉันชอบใช้ฟังก์ชันการจัดรูปแบบเนื่องจากคุณไม่มีทางรู้ว่าทศนิยมอาจมีเลขนำหน้า 2 หรือ 3 ในอนาคต

แก้ไข: คุณยังสามารถใช้Truncateเพื่อลบทั้งหมดหลังจากหรือ

Console.WriteLine(Decimal.Truncate(Convert.ToDecimal("3,5")));

ดีผมกำลังได้รับหมายเลขเดียวกันในกรณีนี้เล็กน้อยอาการโคม่ากับมัน
Kani

สตริงที่คุณใช้คืออะไรและคอมพิวเตอร์ของคุณเป็นวัฒนธรรมใด
Patrick Desjardins

เหมือนในตัวอย่าง: dddd, ddโดยที่dคือตัวเลข ทศนิยมเป็นหลังจากที่,ในกรณีนี้ ฉันเป็นมาตรฐานผลบางลบ และ,หรือใช้. แทน,
Kani

ฉันไม่รู้ว่าจะใช้ string.Format เพื่อทำสิ่งนี้เป็นการส่วนตัวหรือไม่ ในขณะที่ใช้งานได้มันจะทำให้การชกมวยเป็นสองเท่าก่อนที่จะส่งต่อไปยังสตริงรูปแบบจึงเป็นการสร้างวัตถุพิเศษ
Christopher Currens

ต้องบอกว่าไม่รู้ว่าอะไรจะดีกว่ากันในแง่ของประสิทธิภาพระหว่างการเล่นแบบ String (สตริงย่อย) หรือการชกมวย ฉันไม่คิดว่ามันสำคัญจริงๆถ้าไม่ได้ใช้อย่างเข้มข้น ขึ้นอยู่กับสถานการณ์ :)
Patrick Desjardins

1

ใช้:

public static class StringExtensions
{
    /// <summary>
    /// Cut End. "12".SubstringFromEnd(1) -> "1"
    /// </summary>
    public static string SubstringFromEnd(this string value, int startindex)
    {
        if (string.IsNullOrEmpty(value)) return value;
        return value.Substring(0, value.Length - startindex);
    }
}

ฉันชอบวิธีการขยายที่นี่ด้วยเหตุผลสองประการ:

  1. ฉันสามารถเชื่อมโยงกับ Substring ได้ Example: f1.Substring(directorypathLength).SubstringFromEnd(1)
  2. ความเร็ว.

1

คุณสามารถใช้ LastIndexOf และ Substring รวมกันเพื่อให้อักขระทั้งหมดอยู่ทางซ้ายของดัชนีสุดท้ายของเครื่องหมายจุลภาคภายในการต่อย

สตริง var = var.Substring (0, var.LastIndexOf (','));


0

คุณสามารถใช้TrimEnd. มีประสิทธิภาพเช่นกันและดูสะอาด

"Name,".TrimEnd(',');

4
ซึ่งจะลบเฉพาะอักขระ "," ที่อยู่ท้ายสตริงเท่านั้น เนื่องจากสตริง "123,45" ลงท้ายด้วยตัวเลข"123,45".TrimEnd(',')จะส่งคืน "123,45"
กลัว

Remove last characters from a string if this character is... พอดีฉันดี ชื่นชม. "oppa/ ".Trim().TrimEnd('/');
it3xl


-3

ใช้ lastIndexOf ชอบ:

string var = var.lastIndexOf(',');

var คือชื่อตัวแปร ไม่ควรใช้เป็นชื่อสำหรับสตริง -1; นอกจากนี้ยังให้ดัชนีเท่านั้นดังนั้นจึงแก้ปัญหาได้เพียงบางส่วนเท่านั้น คุณต้องลบ ()
Patrick Knott
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.