xml Convert.ToDouble работает неправильно - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть проект, который читает некоторые данные из файла xml Метод Convert.ToDouble работает неправильно. он конвертирует 0,05 как 5. есть идеи решить эту проблему?

это мой метод ReadDataFromXml:

public static List<double> XmldenTabanDegerleriniOku(string ID)
{

    string ayarDir = System.Environment.CurrentDirectory + "\\Ayarlar";
    string Dosya = ayarDir + "\\YuzeyBoyutlari.xml";
    XmlDocument doc = new XmlDocument();
    doc.Load(Dosya);

    XmlNodeList holList = doc.GetElementsByTagName("HOL");
    List<double> tabanDegerleri = new List<double>();
    foreach (XmlNode node in holList)
    {
        XmlElement holElement = (XmlElement)node;

        if (node.Attributes["ID"].Value == ID) { 
            double uzunluk =Convert.ToDouble(holElement.GetElementsByTagName("uzunluk")[0].InnerText.Replace('.',','));
            double genislik =Convert.ToDouble(holElement.GetElementsByTagName("genislik")[0].InnerText.Replace('.',','));
            double cizgilerArasiMesafe = Convert.ToDouble(holElement.GetElementsByTagName("cizgilerArasiMesafe")[0].InnerText.Replace('.', ','));
            tabanDegerleri.Add(uzunluk);
            tabanDegerleri.Add(genislik);
            tabanDegerleri.Add(cizgilerArasiMesafe);
            break;
        }


    }
    return tabanDegerleri;
}

Ответы [ 5 ]

8 голосов
/ 21 сентября 2011

Не используйте Convert.ToDouble, затем: используйте XmlConvert.ToDouble. Я считаю, что эффективно используется инвариантная культура (поскольку XML-документы, передающие данные, не должны быть специфичными для данной культуры).

РЕДАКТИРОВАТЬ: я не заметил, что вы вручную заменили '.' с ',' - поэтому, когда вы говорите, что «он конвертирует 0,05 как 5», вы действительно имеете в виду «он конвертирует 0,05 как 5». Вам следует использовать XmlConvert и , чтобы самим не связываться с данными.

4 голосов
/ 21 сентября 2011

проблема

Вы заменяете . на , перед конвертацией. Это означает, что когда вы получаете 0.05, вы конвертируете его в 0,05. Это преобразование будет вести себя в соответствии с вашей локалью. Например, в США равно 5.

Решение

Посмотрите на ответ @ JonSkeet и используйте XmlConvert.ToDouble, который не зависит от культуры (он использует стандарты XML для форматирования данных). И, конечно же, отбросьте строковые замены.

2 голосов
/ 21 сентября 2011

Вы должны использовать правильный CultureInfo вместо замены точек на запятую.

Вы можете сделать это, используя эту подпись метода Convert.ToDouble.Что-то вроде:

double uzunluk =Convert.ToDouble(holElement.GetElementsByTagName("uzunluk")[0].InnerText, CultureInfo.CurrentCulture);

Если у вас все еще есть проблема с точками и комами, это означает, что культура вашего файла XML не соответствует текущей культуре (то есть культуре машины, выполняющей строкукода), например, в вашей установке Windows заданы запятые в качестве десятичных разделителей (в данном случае кажется, что CurrentCulture - это турецкая культура, а в вашем xml - другая, например, культура США).В этом случае вам нужно вызвать Convert, используя фактическую культуру вашего xml и понять, где он был сгенерирован.

Если в качестве десятичных разделителей используются точки, вы можете попробовать получить общую инвариантную культуру (CultureInfo.InvariantCulture), который действительно использует точки, или может быть более конкретным.(см. GetCultureInfo ).

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

Двойное преобразование работает, если вы преобразуете значение перед заменой десятичной точки на запятую? Я думаю, у вас есть проблема с локалью.

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

Я заметил, что вы делаете какую-то замену текста от . до ,.

Означает ли это, что вы находитесь в культуре, где вместо запятой используется десятичная запятая?В этом случае «0,05» равно 5. Если вы хотите дробь, строка должна быть «0,05».

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