亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用數字和千位分隔符修復格式錯誤的字符串

使用數字和千位分隔符修復格式錯誤的字符串

C#
繁花如伊 2022-06-19 09:57:30
我收到一個字符串,其中包含與數字中的字符相同的數字、空值和分隔符。也有包含逗號的數字引號。使用 C#,我想解析字符串,這樣我就有了一個很好的、管道分隔的數字系列,沒有逗號,2 個小數位。我嘗試了標準替換,刪除了某些字符串模式來清理它,但我不能滿足所有情況。我首先刪除了引號,但是當千位分隔符變成分隔符時,我得到了額外的數字。我嘗試使用Regex.Replace通配符,但由于引號中有多個帶有引號和逗號的數字,因此無法從中得到任何東西。為 Silvermind 編輯: temp = Regex.Replace(temp, "(?:\" , .*\")","($1 = . \n)");我無法控制收到的文件。我可以清理大部分數據。當字符串如下所示時,就會出現問題:703.36,751.36,"1,788.36",887.37,891.37,"1,850.37",843.37,"1,549,797.36",818.36,749.36,705.36,0.00,"18,979.70",934.37我應該尋找引號字符,找到下一個引號字符,從這兩個字符之間的所有內容中刪除逗號,然后繼續嗎?這是我要去的地方,但那里必須有更優雅的東西(是的 - 我不經常用 C# 編程 - 我是一名 DBA)。我希望看到刪除了千位分隔符,并且沒有引號。
查看完整描述

2 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

此正則表達式模式將匹配字符串中的所有單個數字:

(".*?")|(\d+(.\d+)?)

  • (".*?")匹配之類的東西 "123.45"

  • (\d+(.\d+)?)匹配諸如123.45或之類的東西123

從那里,您可以對每個匹配項進行簡單的搜索和替換,以獲得“干凈”的數字。

完整代碼:

  var s = "703.36,751.36,\"1,788.36\",887.37,891.37,\"1,850.37\",843.37,\"1,549,797.36\",818.36,749.36,705.36,0.00,\"18,979.70\",934.37";


  Regex r = new Regex("(\".*?\")|(\\d+(.\\d+)?)");


  List<double> results = new List<double>();

  foreach (Match m in r.Matches(s))

  {

    string cleanNumber = m.Value.Replace("\"", "");

    results.Add(double.Parse(cleanNumber));

  }


  Console.WriteLine(string.Join(", ", results));

輸出:


703.36, 751.36, 1788.36, 887.37, 891.37, 1850.37, 843.37, 1549797.36, 818.36, 749.36, 705.36, 0, 18979.7, 934.37


查看完整回答
反對 回復 2022-06-19
?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

使用跟蹤狀態的解析器類型的解決方案來解決這個問題會更簡單。正則表達式適用于常規文本,只要您有上下文,就很難用正則表達式解決。像這樣的東西會起作用。


internal class Program

{

    private static string testString = "703.36,751.36,\"1,788.36\",887.37,891.37,\"1,850.37\",843.37,\"1,549,797.36\",818.36,749.36,705.36,0.00,\"18,979.70\",934.37";





    private static void Main(string[] args)

    {

        bool inQuote = false;

        List<string> numbersStr = new List<string>();


        int StartPos = 0;

        StringBuilder SB = new StringBuilder();

        for(int x = 0; x < testString.Length; x++)

        {

            if(testString[x] == '"')

            {

                inQuote = !inQuote;

                continue;

            }


            if(testString[x] == ',' && !inQuote )

            {

                numbersStr.Add(SB.ToString());

                SB.Clear();

                continue; 

            }


            if(char.IsDigit(testString[x]) || testString[x] == '.')

            {

                SB.Append(testString[x]);

            }

        }

        if(SB.Length != 0)

        {

            numbersStr.Add(SB.ToString());

        }


        var nums = numbersStr.Select(x => double.Parse(x));


        foreach(var num in nums)

        {

            Console.WriteLine(num);

        }


        Console.ReadLine();

    }

}


查看完整回答
反對 回復 2022-06-19
  • 2 回答
  • 0 關注
  • 174 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號