C # анализировать значение из строки - PullRequest
0 голосов
/ 08 апреля 2011

Я хотел бы проанализировать строковое значение следующим образом:

.02234 
-.23455 
-1.23345 
2. 
.3 

но я получаю исключение FormatException

 for (int i = 1; i < 7; i++)
 {
     var item =  Double.Parse(reader.ReadLine(44).Substring(8 * i, 8));
     richTextBox1.Text += item.ToString() + "\n";  
 }

enter image description here

проблема в том, что я должен преобразовать эти числа, такие как "0.2" или "-.0541", в удвоение или любой тип значения для работы с ним !!!

Ответы [ 5 ]

1 голос
/ 08 апреля 2011

Поскольку вы сделали комментарий, что , является десятичным разделителем в вашей локали, есть лучший вариант, чем выполнить замену строки от . до ,;скажите методу Double.Parse() использовать другой числовой формат.

См. документ MSDN для Parse (String s) .Особо обратите внимание на следующее:

Параметр s интерпретируется с использованием информации о форматировании в объекте NumberFormatInfo, который инициализируется для текущей культуры потоков . Длябольше информации, см. CurrentInfo.Чтобы проанализировать строку с использованием информации о форматировании какой-либо другой культуры, вызовите метод Double.Parse (String, IFormatProvider) или Double.Parse (String, NumberStyles, IFormatProvider).

Предполагая текущую культуру потокаиспользует числовой формат, который считает , десятичным разделителем (например, Франция / Франция fr-FR), вы должны передать IFormatProvider методу Parse(), который определяет . в качестве десятичного разделителя.Удобно, что культура «без культуры в частности», CultureInfo.InvariantCulture, делает именно это.

Таким образом, этот код должен успешно проанализировать:

for (int i = 1; i < 7; i++)
{
    // Assume the substring of ReadLine() contains "-.23455", for example
    var item = Double.Parse(reader.ReadLine(44).Substring(8 * i, 8), CultureInfo.InvariantCulture);
    richTextBox1.Text += item.ToString() + "\n";  
}
1 голос
/ 08 апреля 2011

Вы передаете строку, которая не является двойной, что-то вроде 1.a или 1. .3 (1 строка, представляющая 2 числа)

Вы можете использовать Double.TryParse(), и она не будет выбрасыватьисключение, но верните true / false, если оно прошло успешно или нет.Это может сделать поток легче.

0 голосов
/ 08 апреля 2011

Я просто нахожу решение проблемы (замените точку запятой):

    public Double[] GridValues(int fromline) 
    {
        Double[] values = new Double[7];
        for (int i = 1; i < 7; i++)
        {
            string input = ReadLine(fromline).Substring(8 * i, 8).Replace(".", ",");
            values[i-1] = double.Parse(input);
        }

        return values;
    }
0 голосов
/ 08 апреля 2011

Используйте Double.TryParse () и проверьте, было ли значение успешно проанализировано в вашей локальной переменной следующим образом:

for (int i = 1; i < 7; i++)
{
    double value = 0;
    string input = reader.ReadLine(44).Substring(8 * i, 8);

    if (Double.TryParse(input, out value))
    {
        richTextBox1.Text += value.ToString() + "\n";  
    }
    else
    {
        richTextBox1.Text = "Invalid double entered.";
    }
}
0 голосов
/ 08 апреля 2011
reader.ReadLine(44).Substring(8 * i, 8).ToString()

Вам не понадобится .ToString (). Убедитесь, что это действительно возвращает искомое значение.

Исключением формата является throw, потому что значение, которое он пытается проанализировать, недопустимо! Мое первое предположение - то, что аргумент, который вы передаете, на самом деле не является двойным.

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

 for (int i = 1; i < 7; i++)
 {
     string textNum = reader.ReadLine(44).Substring(8 * i, 8);
     // add a breakpoint on the next line, then look at textNum. I bet it's not what you hoped.
     double item =  double.Parse(textNum);
     richTextBox1.Text += string.Format("{0}\n", item);  
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...