Чтение чисел из строки в C # - PullRequest
       40

Чтение чисел из строки в C #

1 голос
/ 21 сентября 2009

Что я хочу?

Я хочу отображать информацию о погоде на своей странице. Я хочу отобразить результат в определенной культуре браузера.

Что я делаю?

Я использую MSN RSS для этой цели. MSN возвращает отчет в формате XML. Я анализирую XML и отображаю результаты.

С какой проблемой я сталкиваюсь?

При отображении отчета мне нужно проанализировать узел XML, <data>, в котором будут разные значения в разных культурах.

Например,

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

de-DE: "Niedrig: 46°F. Höchst: 67°F. Niederschlag %: 20%"

Я хочу читать только низкие, высокие и вероятность выпадения осадков. я хочу читать 46, 67 и 20%.

Может кто-нибудь, пожалуйста, дайте мне решение для этого?

Может быть RegX или какой-то другой способ тоже мне подходит: -)

Заранее спасибо!

Ответы [ 6 ]

3 голосов
/ 21 сентября 2009

Вы должны рассмотреть возможность всегда получать 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 голосов
/ 21 сентября 2009

Если вам нужны только цифры, вы можете использовать регулярное выражение, например следующее:

(\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+%)

Это должно касаться ложных чисел в других местах строки. Но в целом наилучшим способом было бы получить данные из источника, который предоставляет данные для машинного чтения, а не для потребления человеком

1 голос
/ 21 сентября 2009

Далее следует извлечь два числа и вероятность осадков, а также используемые единицы (для культурно-зависимых единиц).

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

Если вы не хотите извлекать юниты, тогда вы можете использовать

(?<lo>\d+)°.*?(?<hi>\d+)°.*?(?<precipitation>\d+)
0 голосов
/ 21 сентября 2009

Я предлагаю использовать Regex, чтобы получить значения, которые вы хотите, в соответствии с языком культуры пользовательского интерфейса, одно за другим: Я имею в виду, вы можете иметь регулярное выражение, чтобы получить временный Lo. "(Lo | Niedrig): (\ d +)", регулярное выражение для получения Hi temp "(Hi | Höchst): (\ d +)" и регулярное выражение, чтобы получить шанс на восприятие и так далее. Во всех приведенных выше примерах вы можете получить число из второго элемента матча.

0 голосов
/ 21 сентября 2009

Довольно странно, что вы не получаете XML со значениями в разных узлах, что было бы для меня более логично (если бы вы могли выбрать, какие значения использовать для разных локалей).

Но, если вы хотите извлечь данные из заданных строк, попробуйте это или что-то похожее, если вы не являетесь поклонником RegEx:

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;
        }
    }
}

(я делю на ":" вместо цифр)

0 голосов
/ 21 сентября 2009

используйте регулярное выражение (но я не знаю формулу регулярного выражения;))

Вы также можете сделать forloop над предложением и проверить каждый символ, если это целое число. Каждый раз, когда вы сталкиваетесь один раз, поместите его в строку. при нахождении чего-то другого, кроме целого числа, разберите строку на int и вуаля. Сделайте это 3 раза

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...