Xóa các ký tự cuối cùng khỏi một chuỗi trong C #. Một cách thanh lịch?


84

Tôi có một chuỗi số như thế này 2223,00. Tôi muốn chuyển đổi nó thành 2223. Đây là: không có thông tin sau dấu " , ". Giả sử rằng sẽ chỉ có hai số thập phân sau dấu " , ".

Tôi đã làm:

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

Có một giải pháp thanh lịch hơn? Có thể sử dụng một chức năng khác? -Tôi không thích đặt những con số rõ ràng-

Câu trả lời:


173

Bạn thực sự chỉ có thể sử dụng loại bỏ quá tải có một tham số:

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

Tuy nhiên, nếu bạn đang cố gắng tránh mã hóa khó chiều dài, bạn có thể sử dụng:

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

Tôi nhận được rất nhiều câu trả lời tốt. Nhưng cái này là cái tôi sẽ dùng, xét về độ sang trọng. Tuy nhiên, tôi không biết, ở mức độ thấp , cái nào hiệu quả hơn. Vì vậy, hãy lựa chọn của bạn!
— Kani

6
Giải pháp thứ hai là cách dễ đọc, dễ hiểu và dễ bảo trì hơn, và về mặt hiệu suất ở mức thấp , sự khác biệt là không đáng kể. Nếu bạn BIẾT rằng giá trị ,luôn ở vị trí -3, thì giải pháp đầu tiên vẫn là OK, nhưng tối ưu hóa quá sớm là một điều khủng khiếp khi lãng phí thời gian của bạn.
— Scott Rippey

2
@Kani Cách đầu tiên là hiệu quả nhất - nhưng tôi hoàn toàn đồng ý với Scott. Tôi sẽ luôn chọn thứ hai, trừ khi tôi biết, sau khi lập hồ sơ, rằng có một lỗ hổng. nút cổ chai ở đây. Cả hai điều này (và hầu hết các câu trả lời khác) sẽ rất nhanh - đủ tốt cho hầu hết mọi mục đích.
— Reed Copsey

Giả sử bạn muốn chuỗi không bị sửa đổi nếu không có dấu phẩy?
— Kyle Delaney,

15

Có lẽ điều này:

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

Tôi nghĩ đây là câu trả lời "thanh lịch nhất" - ít nhất là cho đến nay.
— Tom Bushell

1
bạn nghĩ gì về @ ReedCopsey? Tôi nghĩ là một trong những rất tốt.
— Kani 11/11/11

@Kani: về độ sang trọng, tôi thấy hầu hết các câu trả lời được đăng đủ tốt . Tôi cũng sẽ không bận tâm đến hiệu suất, trừ khi nó thực sự chứng tỏ là nút cổ chai. Chỉ có điều để xem xét là làm thế nào để bạn muốn để đối phó với chuỗi sắp tới trong định dạng khác nhau ...
— km

Cân nhắc chuyển đối số thứ hai của 2tới Splitvì bạn không quan tâm đến bất kỳ dấu phẩy nào khác.
— Richard

5

Điều này sẽ trả về cho bạn một chuỗi loại trừ mọi thứ sau dấu phẩy

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

Tất nhiên, điều này giả sử chuỗi của bạn thực sự có dấu phẩy với số thập phân. Đoạn mã trên sẽ không thành công nếu không. Bạn muốn kiểm tra thêm:

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

Tôi giả sử bạn đang làm việc với một chuỗi để bắt đầu. Tốt nhất, nếu bạn đang làm việc với một số để bắt đầu, chẳng hạn như float hoặc double, bạn có thể chuyển nó thành một int, sau đó làm myInt.ToString()như:

myInt = (int)double.Parse(myString)

Điều này phân tích cú pháp kép bằng cách sử dụng văn hóa hiện tại (ở Mỹ, chúng tôi sử dụng .cho các dấu thập phân). Tuy nhiên, điều này một lần nữa giả định rằng chuỗi đầu vào của bạn có thể được phân tích cú pháp.


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

Nếu giá trị ban đầu của bạn là một số thập phân thành một chuỗi, bạn sẽ cần chuyển đổi

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

Trong ví dụ này, tôi chọn Văn hóa bất biến nhưng bạn có thể sử dụng văn hóa bạn muốn.

Tôi thích sử dụng chức năng Định dạng hơn vì bạn không bao giờ biết liệu số thập phân có thể chứa 2 hoặc 3 số đứng đầu trong tương lai hay không.

Chỉnh sửa: Bạn cũng có thể sử dụng Truncateđể xóa tất cả sau dấu hoặc.

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

Chà, tôi cũng nhận được con số tương tự trong trường hợp này, cứ mê man đi.
— Kani

Chuỗi chính xác bạn sử dụng là gì và máy tính của bạn thuộc văn hóa nào?
— Patrick Desjardins

Giống như trong ví dụ: dddd, dd , trong đó d là một chữ số. Các số thập phân đứng sau , trong trường hợp này. Tôi đang chuẩn hóa một số kết quả, đang xóa . và , hoặc sử dụng . thay vì ,
— Kani

Tôi không biết liệu tôi có sử dụng string.Format để thực hiện việc này cá nhân hay không. Trong khi hoạt động, nó kết thúc quyền anh gấp đôi trước khi chuyển sang string.Format, do đó tạo ra một đối tượng bổ sung.
— Christopher Currens

Tôi phải nói rằng tôi không biết điều gì tốt hơn về mặt hiệu suất giữa việc chơi với String (chuỗi con) hay quyền anh. Tôi không nghĩ nó thực sự quan trọng nếu nó không được sử dụng nhiều. Tùy thuộc vào tình hình :)
— Patrick Desjardins

1

Sử dụng:

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

Tôi thích một phương pháp mở rộng ở đây vì hai lý do:

  1. Tôi có thể chuỗi nó với Substring. Example: f1.Substring(directorypathLength).SubstringFromEnd(1)
  2. Tốc độ.

1

Bạn có thể sử dụng LastIndexOf và Substring kết hợp để lấy tất cả các ký tự ở bên trái chỉ mục cuối cùng của dấu phẩy trong dấu chấm.

string var = var.Substring (0, var.LastIndexOf (','));


0

Bạn có thể sử dụng TrimEnd. Nó cũng hiệu quả và trông sạch sẽ.

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

4
Điều đó sẽ chỉ loại bỏ bất kỳ ký tự ',' nào ở cuối chuỗi. Vì chuỗi "123,45" kết thúc bằng các chữ số nên "123,45".TrimEnd(',')sẽ trả về "123,45".
— phoog

Remove last characters from a string if this character is... Vừa vặn với tôi. Đánh giá cao. "oppa/ ".Trim().TrimEnd('/');
— it3xl

0

Hãy thử những điều sau đây. Nó đã làm việc cho tôi:

str = str.Split(',').Last();

-3

Sử dụng lastIndexOf. Giống:

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

var là một tên biến. Nó không bao giờ được sử dụng làm tên cho một chuỗi. -1; Ngoài ra, điều này chỉ cung cấp chỉ số, vì vậy nó chỉ giải quyết một phần của vấn đề. Bạn cần loại bỏ ().
— Patrick Knott
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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.