使用C#在字符串中查找整数并将其除以

时间:2016-03-02 14:36:34

标签: c#

我试图找到我在C#中阅读的.txt中的整数并将它们分开,但我尝试过的所有东西都没有用。有小费吗? 这个txt的值如下:

  • 这是.txt文件中的字符串
  • queue1 6000
  • queue2 54888
  • queue3 1

但他们每秒都会改变

  • 预期产出
  • queue1 0.6
  • queue2 5.4
  • queue3 0.0001

int value;
string text = System.IO.File.ReadAllText(@"N:\doc\mytext.txt");
if (int.TryParse(text, out value))
        {
           value/10000;
        }
Console.ForegroundColor = ConsoleColor.Red;
        System.Console.WriteLine(text);

感谢

3 个答案:

答案 0 :(得分:1)

您的代码需要执行以下操作:

  1. 阅读输入
  2. 在输入中找到目标值
  3. 将目标值转换为所需的结果值
  4. 使用结果值
  5. 替换输入字符串中的目标值
  6. 输出结果
  7. 对于这个答案,我假设您对第1步和第5步的实施感到满意,因此我将只讨论第2,3和4步。

    第2步:找到目标值

    要在输入中查找目标值,您必须先定义它们的内容。根据您的问题和后续评论,您的输入字符串如下所示,目标值以粗体显示:

      

    queue1 6000 ,queue2 54888 ,queue3 1

    这些是整数值,它们作为离散词嵌入文本中。

    找到它们的最简单方法是使用正则表达式。让你的案件变得棘手的一件事是你的文本中嵌入了你不想要的数字(例如在“queue1”中)。幸运的是,.NET regular expressions有一些快捷方式,可以很容易地编写必要的表达式:

    var re = new Regex(@"\b\d+\b");
    

    \ b 匹配字边界
    \ d 匹配任何十进制数字
    + 匹配前面一个或多个字符

    因此,这个正则表达式将匹配不同的整数,如“6000”,同时忽略其他单词中嵌入的数字,如“queue1”。

    第3步 - 转换为所需结果

    此步骤有几个子步骤

    • 将字符串解析为数字
    • 计算所需的结果编号
    • 格式化所需的结果编号

    要将字符串解析为数字,您使用int.TryParse,这是一种方法。由于正则表达式只能找到有效的整数,我们可以使用Parse方法。

    您的计算除以10000,并且您希望结果为浮点数。如果使用10000作为文字,结果将是一个整数,因此您需要做一些事情以确保结果是浮点数。一种简单的方法是使用10000.0作为您的文字,如下所示:

    int value = 6000;
    var result = value / 10000.0; // typeof(result) == double
    

    格式化输出有多种选择。最简单的出发点是使用ToString方法。默认行为通常足够好,但如果要指定格式,可以使用the variant that takes a format string

    因此,解析,计算和格式化的结果代码如下:

    (Int64.Parse(value) / 10000.0).ToString()
    

    第4步:替换输入中的目标值

    由于正则表达式对于查找事物很有用,因此它们也可用于替换事物。在您的情况下,替换需要一些可能不由直接正则表达式处理的逻辑(即,步骤2)。 .NET正则表达式Replace方法仅为此方案提供overload with a MatchEvaluator parameter

    正则表达式找到的每个匹配都将传递给匹配评估程序,该评估程序负责返回要用作替换的字符串。为简单起见,您可以使用lambda表达式来提供匹配评估程序。

    所以,当你把它们放在一起时,你会得到这样的东西:

    string text = @"queue1 6000, queue2 54888, queue3 1";
    var re = new Regex(@"\b\d+\b");
    string output = re.Replace(text, m => (Int64.Parse(m.Value) / 10000.0).ToString());
    // output == "queue1 0.6, queue2 5.4888, queue3 0.0001"
    

答案 1 :(得分:0)

您可以使用正则表达式:

Regex.Matches(text, @"(?<=^|\s)[0-9]+(?=$|\s)").Cast<Match>().Select(m => int.Parse(m.Value));

首先,选择字符串中与整数相似的所有部分,然后将生成的字符串转换为整数。

(?=$|\s)零宽度前瞻性断言。它会在匹配结束时检查是否有空格或字符串结尾。

(?<=^|\s)是一个零宽度正向背后断言。它会在匹配开始时检查是否有空格或字符串的开头。

您可以找到关于here的文档。

这些是必要的,因此匹配不包括空格。如果它们是,那么如果只用一个空格分隔,你只能得到两个整数中的一个。

答案 2 :(得分:0)

您可以使用Regular expressions获取字符串中的所有数字。该字符串可以是您从System.IO.File.ReadAlltext获得的文件的内容(例如)。

您可以使用"[0-9]+"获取所有整数,或"[0-9]+(.[0-9]+)?"获取整数和浮点数。

var pattern = "[0-9]" // or "[0-9]+(.[0-9]+)?"
int[] integers = System.Text.RegularExpressions.Regex.Matches(text, pattern).Cast<Match>().Select(m => int.Parse(m.Value)).ToArray();
// for floats
//float[] floats = System.Text.RegularExpressions.Regex.Matches(text, pattern).Cast<Match>().Select(m => float.Parse(m.Value)).ToArray();

在正则表达式中,您可以定义一个模式,然后在字符串中搜索回答该模式的标记。如果我们需要搜索整数,那么我们可以使用"[0-9]+"模式。此模式将搜索0-9(包括)与至少一个字符(一个数字 - &#39; +&#39;确保)之间的所有标记。
如果我们需要搜索浮点数,那么我们需要使用由整数模式("[0-9]+(.[0-9]+)?")组成的"[0-9]+"以及可选浮点("(.[0-9]+)?")。 &#39;?&#39; sign表示此令牌可以存在零次或一次。

您可以找到有关正则表达式和模式here

的更多信息