Есть проект Xamarin.Forms
, внутри есть три приложения (iOS, Android, UWP), один общий проект с общим кодом Portable Class Library
. Внутри этого проекта есть общий файл data.xml
.
Считываю его таким образом:
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(Facility)).Assembly;
Stream stream = assembly.GetManifestResourceStream("MobilaApp.SharedFiles.data.xml");
GameLoader loader = new GameLoader(stream);
items = loader.GetFacilities();
И GameLoader.cs
:
public GameLoader(Stream stream)
{
BaseDocument = XDocument.Load(stream);
}
public List<Facility> GetFacilities()
{
List<Facility> res = new List<Facility>();
var elements = BaseDocument.Element("Facilities").Elements();
foreach(var facility in elements)
{
string name = facility.Attribute("Name").Value;
string description = facility.Attribute("Description").Value;
string type = facility.Attribute("Type").Value;
var boundariesElements = facility.Element("Boundaries").Elements(); //Key Value pairs
Dictionary<double, double> boundaries = new Dictionary<double, double>();
double key, value;
foreach(var element in boundariesElements)
{
string sKey = element.Attribute("Key").Value;
string sValue = element.Attribute("Value").Value;
if (double.TryParse(sKey, out key))
{
if (double.TryParse(sValue, out value))
{
boundaries.Add(key, value);
}
}
}
res.Add(new Facility(name, description, boundaries));
}
return res;
}
Наконец, data.xml
<?xml version="1.0" encoding="utf-8"?>
<Facilities>
<Facility Name="Google" Description="This is a standard description." Type="1">
<Boundaries>
<KeyValuePair Key="0" Value="100" />
</Boundaries>
</Facility>
<Facility Name="Facebook" Description="This description was created using my command line helper. I hope it works!" Type="0">
<Boundaries>
<KeyValuePair Key="0" Value="1.5" />
<KeyValuePair Key="10" Value="2.5" />
</Boundaries>
</Facility>
</Facilities>
Обе программы (Windows и iOS) считывают этот файл, затем обрабытавают его и выводят результат на экран. Проблема в том, что результаты получаются разные:
iOS 12.1, Iphone 7 plus
Windows 10
Спасибо @AlexanderPetrov за решение.
Проблема заключалась в том, что у разных платформ были установлены разные культуры.
Это проявлялось в методе double.TryParse()
if (double.TryParse(sKey, out key)) //Windows принимает числа формата 3.5, а iOS - нет
{
if (double.TryParse(sValue, out value))
{
boundaries.Add(key, value); //Эти строчки не выполнялись на iOS, ибо double.TryParse() возвращал false
}
}
System.Globalization.NumberStyles numberStyles = System.Globalization.NumberStyles.Any;
System.Globalization.CultureInfo cultureInfo = System.Globalization.CultureInfo.InvariantCulture;
foreach(var element in boundariesElements)
{
string sKey = element.Attribute("Key").Value;
string sValue = element.Attribute("Value").Value;
if (double.TryParse(sKey, numberStyles, cultureInfo, out key))
{
if (double.TryParse(sValue, numberStyles, cultureInfo, out value))
{
boundaries.Add(key, value);
}
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Имеется два классаВ классе Two создаем экземпляр класса One в переменную $one
Я использую CURL для отправки файлаЭто работает хорошо, когда я отправляю файл
Переписываю некий код с яваскрипта на пхп, должен работать идентично