代码之家  ›  专栏  ›  技术社区  ›  Vijay

在C语言中从字符串中读取数字#

  •  1
  • Vijay  · 技术社区  · 16 年前

    我想在特定于浏览器的区域性中显示结果。

    为此,我使用MSN RSS。 MSN以XML格式返回报告。我解析XML并显示结果。

    我面临什么问题?

    在显示报告时,我必须解析一个XML节点, <data>

    例如。,

    "Lo: 46°F. Hi: 67°F. Chance of precipitation: 20%"

    德德: "Niedrig: 46°F. Höchst: 67°F. Niederschlag %: 20%"

    有人能给我一个解决办法吗?

    可能是RegX或其他方法,我也可以:-)

    提前谢谢!

    6 回复  |  直到 16 年前
        1
  •  3
  •   Tor Haugen    16 年前

    你应该考虑总是使用相同的文化来获取RSS。这样,您就可以更轻松地解析内容。如果只使用数字,则不应阻止您向最终用户发送特定于区域性的内容。

    因此,如果您选择en US版本,您可以这样做:

    Regex re = new Regex(@"Lo: (\d+)°F. Hi: (\d+)°F. Chance of precipitation: (\d+)%");
    var match = re.Match(forecast);
    if (match.Success)
    {
        var groups = match.Groups;
        lo = int.Parse(groups[1].Captures[0].Value);
        hi = int.Parse(groups[2].Captures[0].Value);
        prec = int.Parse(groups[3].Captures[0].Value);
    }
    
        2
  •  2
  •   Joey Gumbo    16 年前

    如果只需要数字,可以使用正则表达式,例如:

    (\d+).*?(\d+).*?(\d+%)
    

    PowerShell中的快速测试表明,它至少对您的输入数据有效:

    PS Home:\> function test ($re) {
    >>   $a -match $re; $Matches
    >>   $b -match $re; $Matches
    >> }
    >>
    PS Home:\> $a = "Lo: 46°F. Hi: 67°F. Chance of precipitation: 20%"
    PS Home:\> $b = "Niedrig: 46°F. Höchst: 67°F. Niederschlag %: 20%"
    PS Home:\> test "(\d+).*?(\d+).*?(\d+%)"
    True
    
    Name                           Value
    ----                           -----
    3                              20%
    2                              67
    1                              46
    0                              46°F. Hi: 67°F. Chance of precipitation: 20%
    True
    3                              20%
    2                              67
    1                              46
    0                              46°F. Höchst: 67°F. Niederschlag %: 20%
    

    您可以添加其他约束,例如在每次匹配之前需要冒号:

    : (\d+).*?: (\d+).*?: (\d+%)
    

    这应该处理字符串中其他地方的伪数字。但总体而言,最好的方法实际上是从一个来源获取数据,该来源为机器读取而不是人类消费提供数据

        3
  •  1
  •   ICR    16 年前

    以下应提取两个数字和降水机会,以及使用的单位(文化相关单位)。

    (?<lo>\d+°.).*?(?<hi>\d+°.).*?(?<precipitation>\d+)
    

    (?<lo>\d+)°.*?(?<hi>\d+)°.*?(?<precipitation>\d+)
    
        4
  •  0
  •   RvdK    16 年前

    使用正则表达式(但我不知道正则表达式;)

    您还可以对句子进行forloop,并检查每个字符是否为整数。每次你遇到一次,把它放在一个字符串中。当查找整数以外的内容时,将字符串解析为int,然后瞧。这样做3次

        5
  •  0
  •   Mike Nowak    16 年前

    但是,如果您不喜欢正则表达式,如果您想从给定字符串中提取数据,请尝试以下类似方法:

    string dataUS = "Lo: 46°F. Hi: 67°F. Chance of precipitation: 20%";
    string dataDE = "Niedrig: 46°F. Höchst: 67°F. Niederschlag %: 20%";
    string[] stringValues = dataU.Split(new string[] {": "}, 4, StringSplitOptions.None);
    List<int> values = new List<int>();
    for (int i = 1; i < 4; i++)
    {
        StringBuilder sb = new StringBuilder();
        foreach (char c in stringValues[i].Trim())
        {
            if (Char.IsDigit(c))
            {
                sb.Append(c);
            }
            else
            {
                values.Add(Convert.ToInt32(sb.ToString()));
                break;
            }
        }
    }
    

    (im拆分为“:”而不是数字)

        6
  •  0
  •   Beatles1692    16 年前

    我建议使用正则表达式根据UI区域性语言逐个获取所需的值: 我的意思是你可以用正则表达式来获得低温。“(Lo | Niedrig):(\d+),一个获得高温的正则表达式 “(Hi | Hchst):(\d+)”和一个正则表达式以获得感知的机会等等。

    推荐文章