Câu trả lời:
Có nhiều cách, nhưng điều này nên làm (mặc dù không biết nó hoạt động như thế nào với các chuỗi thực sự lớn):
private static string GetNumbers(string input)
{
return new string(input.Where(c => char.IsDigit(c)).ToArray());
}
IsDigitthay vì IsNumber: "Phương pháp này [ IsNumber] xác định xem a Charcó thuộc bất kỳ danh mục Unicode số nào hay không. Ngoài việc bao gồm các chữ số, các số còn bao gồm các ký tự, phân số, chỉ số dưới, ký tự trên, chữ số La Mã, tử số tiền tệ và số được bao quanh. Phương pháp này tương phản với IsDigitphương pháp xác định xem a có phải Charlà một chữ số cơ số 10 hay không. " msdn.microsoft.com/en-us/library/yk2b3t2y.aspx
input.Where(c => char.IsDigit(c) || char.IsWhiteSpace(c))
return new string(input.Where(char.IsDigit).ToArray());. Tôi chỉ làm cho nó dễ đọc hơn
Cảm thấy rất phù hợp với một biểu thức chính quy.
var s = "40,595 p.a.";
var stripped = Regex.Replace(s, "[^0-9]", "");
"[^0-9]"có thể được thay thế bằng @"\D"nhưng tôi thích tính dễ đọc của [^0-9].
Một phương pháp mở rộng sẽ là một cách tiếp cận tốt hơn:
public static string GetNumbers(this string text)
{
text = text ?? string.Empty;
return new string(text.Where(p => char.IsDigit(p)).ToArray());
}
if (text == null) return string.Empty;hơn text = text ?? string.Empty;. Bằng cách này, chúng tôi không làm giảm hiệu suất.
Sử dụng một biểu thức chính quy chỉ nắm bắt 0-9 và loại bỏ phần còn lại. Tuy nhiên, một biểu thức chính quy là một hoạt động sẽ tốn rất nhiều chi phí trong lần đầu tiên. Hoặc làm điều gì đó như thế này:
var sb = new StringBuilder();
var goodChars = "0123456789".ToCharArray();
var input = "40,595";
foreach(var c in input)
{
if(goodChars.IndexOf(c) >= 0)
sb.Append(c);
}
var output = sb.ToString();
Tôi nghĩ rằng một cái gì đó như vậy, tôi chưa biên soạn ..
LINQ, như Fredrik đã nói, cũng là một lựa chọn
Một lựa chọn khác ...
private static string RemoveNonNumberDigitsAndCharacters(string text)
{
var numericChars = "0123456789,.".ToCharArray();
return new String(text.Where(c => numericChars.Any(n => n == c)).ToArray());
}
À, bạn biết những chữ số là gì: 0123456789 phải không? Duyệt chuỗi ký tự của bạn theo từng ký tự; nếu ký tự là một chữ số thì gắn nó vào cuối chuỗi tạm thời, nếu không thì bỏ qua. Có thể có các phương thức trợ giúp khác cho chuỗi C # nhưng đây là một phương pháp chung hoạt động ở mọi nơi.
Đây là mã sử dụng Biểu thức chính quy:
string str = "40,595 p.a.";
StringBuilder convert = new StringBuilder();
string pattern = @"\d+";
Regex regex = new Regex(pattern);
MatchCollection matches = regex.Matches(str);
foreach (Match match in matches)
{
convert.Append(match.Groups[0].ToString());
}
int value = Convert.ToInt32(convert.ToString());
Câu trả lời được chấp nhận là tuyệt vời, tuy nhiên nó không tính đến giá trị NULL, do đó làm cho nó không sử dụng được trong hầu hết các trường hợp.
Điều này đã thúc đẩy tôi sử dụng các phương pháp trợ giúp này. Câu đầu tiên trả lời OP, trong khi những câu khác có thể hữu ích cho những người muốn thực hiện điều ngược lại:
/// <summary>
/// Strips out non-numeric characters in string, returning only digits
/// ref.: /programming/3977497/stripping-out-non-numeric-characters-in-string
/// </summary>
/// <param name="input">the input string</param>
/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
/// <returns>the input string numeric part: for example, if input is "XYZ1234A5U6" it will return "123456"</returns>
public static string GetNumbers(string input, bool throwExceptionIfNull = false)
{
return (input == null && !throwExceptionIfNull)
? input
: new string(input.Where(c => char.IsDigit(c)).ToArray());
}
/// <summary>
/// Strips out numeric and special characters in string, returning only letters
/// </summary>
/// <param name="input">the input string</param>
/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
/// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZAU"</returns>
public static string GetLetters(string input, bool throwExceptionIfNull = false)
{
return (input == null && !throwExceptionIfNull)
? input
: new string(input.Where(c => char.IsLetter(c)).ToArray());
}
/// <summary>
/// Strips out any non-numeric/non-digit character in string, returning only letters and numbers
/// </summary>
/// <param name="input">the input string</param>
/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
/// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZ1234A5U6"</returns>
public static string GetLettersAndNumbers(string input, bool throwExceptionIfNull = false)
{
return (input == null && !throwExceptionIfNull)
? input
: new string(input.Where(c => char.IsLetterOrDigit(c)).ToArray());
}
Để biết thêm thông tin, hãy đọc bài đăng này trên blog của tôi.
public static string RemoveNonNumeric(string value) => Regex.Replace(value, "[^0-9]", "");
var output = new string(input.Where(char.IsNumber).ToArray());