[英]How to extract decimal number from string in C#
string sentence = "X10 cats, Y20 dogs, 40 fish and 1 programmer.";
string[] digits = Regex.Split (sentence, @"\D+");
對於此代碼,我在數字數組中獲取這些值
10,20,40,1
string sentence = "X10.4 cats, Y20.5 dogs, 40 fish and 1 programmer.";
string[] digits = Regex.Split (sentence, @"\D+");
對於此代碼,我在數字數組中獲取這些值
10、4、20、5、40、1
但我想得到像
10.4,20.5,40,1 作為十進制數。 我怎樣才能做到這一點?
對@Michael 的解決方案的小改進:
// NOTES: about the LINQ:
// .Where() == filters the IEnumerable (which the array is)
// (c=>...) is the lambda for dealing with each element of the array
// where c is an array element.
// .Trim() == trims all blank spaces at the start and end of the string
var doubleArray = Regex.Split(sentence, @"[^0-9\.]+")
.Where(c => c != "." && c.Trim() != "");
返回:
10.4
20.5
40
1
原來的解決方案正在返回
[empty line here]
10.4
20.5
40
1
.
十進制/浮點數提取正則表達式可能會有所不同,具體取決於是否使用千位分隔符以及使用的千位分隔符、表示小數分隔符的符號、是否還想匹配指數、是否匹配正號或負號、是否使用匹配可能省略前導0
數字,無論是否提取以小數分隔符結尾的數字。
Matching Floating Point Numbers with a Regular Expression 中提供了一個通用的正則表達式來匹配最常見的十進制數類型:
[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?
我只將捕獲組更改為非捕獲組(添加?:
after (
)。它匹配
如果您需要使其更加通用,如果小數點分隔符可以是點或逗號,請替換\\.
帶有字符類(或括號表達式) [.,]
:
[-+]?[0-9]*[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?
^^^^
注意上面的表達式同時匹配 integer 和 floats 。 要僅匹配浮點數/十進制數,請通過刪除第二個?
在\\.
之后 (演示):
[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)?
^
如果您不想匹配沒有前導零的浮點數(如.5
),則必須使用第一個數字匹配模式(通過添加+
量詞,以匹配 1 次或多次出現的數字):
[-+]?[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?
^
請參閱此演示。 現在,它匹配更少的樣本:
現在,如果您不想在<digits>.<digits>
內匹配<digits>.<digits>.<digits>.<digits>
怎么辦? 如何將它們作為整詞匹配? 使用環視:
[-+]?(?<!\d\.)\b[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.\d)
這里有一個演示:
現在,那些有千位分隔符的浮點數怎么樣,比如12 123 456.23
或34,345,767.678
? 您可以在第一個[0-9]+
之后添加(?:[,\\s][0-9]+)*
以匹配零個或多個逗號或空格序列,后跟 1+ 數字:
[-+]?(?<![0-9]\.)\b[0-9]+(?:[,\s][0-9]+)*\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.[0-9])
請參閱正則表達式演示:
用\\.
交換逗號\\.
如果您需要使用逗號作為小數點分隔符,使用句點作為千位分隔符。
現在,如何在 C# 中使用這些模式?
var results = Regex.Matches(input, @"<PATTERN_HERE>")
.Cast<Match>()
.Select(m => m.Value)
.ToList();
嘗試
Regex.Split (sentence, @"[^0-9\.]+")
您需要在正則表達式中允許小數位。 請嘗試以下操作:
\d+(\.\d+)?
這將匹配數字而不是數字以外的所有內容,但迭代匹配以構建數組應該很簡單。
需要記住的是,您是否還應該尋找負號、逗號等。
檢查大多數編程語言的語法詞法分析器以獲取小數的正則表達式。 將該正則表達式與字符串匹配,找到所有匹配項。
如果你有 Linq:
stringArray.Select(s=>decimal.Parse(s));
foreach
也可以。 您可能需要檢查每個string
實際上是一個數字( .Parse
不會拋出異常)。
以下歸功於@code4life。 我添加的只是一個 for 循環,用於在返回之前解析整數/小數。
public string[] ExtractNumbersFromString(string input)
{
input = input.Replace(",", string.Empty);
var numbers = Regex.Split(input, @"[^0-9\.]+").Where(c => !String.IsNullOrEmpty(c) && c != ".").ToArray();
for (int i = 0; i < numbers.Length; i++)
numbers[i] = decimal.Parse(numbers[i]).ToString();
return numbers;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.