簡體   English   中英

如何從C#中的字符串中提取十進制數

[英]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]+)?
            ^

現在, 34不匹配: 在此處輸入圖片說明 匹配。

如果您不想匹配沒有前導零的浮點數(如.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.2334,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM