Проблема с системой счисления каждого региона - PullRequest
2 голосов
/ 05 мая 2020

Я разрабатываю проект в Unity, в котором я использую файлы .CSV для сбора данных, которые будут использоваться в проекте. Важным фактом является то, что я разрабатываю проект с регионом операционной системы (ОС) на испанском языке sh (Испания, международный).

Я использую этот файл .CSV для перечисления действий, которые я хочу, чтобы мои персонажи выполнять в игре, например перемещаться из текущей позиции в точку A или оставаться на месте в течение X секунд. В .CSV я сохраняю данные в виде строки, но когда я добавляю их в проект, они мне нужны как float:

  • MOVE: float Velocity, float Position.x, float Position.y, float Position.z
  • WAIT: float Time

Любое из этих действий привязано к объекту, который получает действие и он работает отлично.

Проблема возникла, когда я отправил сборку в Steam для проверки проекта, и они уведомили меня, что они не могут двигаться дальше, потому что персонажи не двигались (игра работала, но ничего не двигалось) .

После многих тестов я обнаружил проблему. Оказывается, если ОС, в которой выполняется сборка проекта, находится в регионе, отличном от Spani sh (Испания, международный), например, в Engli sh (Великобритания), игра запускается, но ничего не меняется во времени. Первоначально программировал я.

Эта проблема возникает из-за того, что в каждом регионе своя десятичная система, например, в Испании точки используются для обозначения единиц измерения, а запятые - для обозначения десятичных знаков («1,234,24») и в Англии наоборот («1,234,24»), поэтому, если я заявляю, что мой персонаж будет ждать (WAIT) в течение «0,2» секунды (Испания), в ОС с регионом Engli sh (Великобритания), он будет "20" секунд, потому что он интерпретирует запятые как разделители единиц. То же самое происходит с действиями MOVE.

Чтобы не менять регион моей ОС, я заменил запятые на точки в .CSV, чтобы переместить проблему в свой регион и провести необходимые тесты. Таким образом, я мог доказать, что если я поставлю «3.00» (что будет 3 секунды), моя ОС интерпретирует это как 3 минуты.

Мой вопрос: как я могу решить эту проблему, чтобы таймеры работали как Я хочу, независимо от того, в каком регионе работает ОС?

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

Есть ли способ настроить проект так, чтобы он всегда использовал определенную c систему счисления независимо от ОС? Я имею в виду, чтобы понимать запятую как десятичную дробь и использовать ее для этой цели независимо от региона.

Я пробовал System.Globalization.CultureInfo, но ничего не получил (или не понял полностью).

Есть ли способ создать ручной парсер, работающий в любом регионе?

Большое спасибо.

Ответы [ 2 ]

4 голосов
/ 05 мая 2020

Вы начали по правильному пути, глядя на System.Globalization. Вам просто нужно использовать инвариантную культуру - Что означает CultureInfo.InvariantCulture? - вы можете указать, чтобы использовать это при преобразовании в строки и при синтаксическом разборе строк до требуемого типа, например:

using System.Globalization;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var ci = CultureInfo.InvariantCulture;

            double x = 0.123;
            using(var sw=new StreamWriter("someFile"))
            {
                sw.Write(x.ToString(ci));
            }

            using (var sr=new StreamReader("someFile"))
            {
                string line = sr.ReadLine();
                x = double.Parse(line, ci);
            }
        }
    }
}
1 голос
/ 05 мая 2020

Я думаю, это строковый вопрос. И у меня есть следующие основные c правила для строк:

  1. Не сохраняйте, не извлекайте и не передавайте значение в виде строки, если вы можете этого избежать. Строка обработки является вторым худшим типом данных. Хуже только необработанный двоичный файл. С CSV вы должны использовать их, но правильная БД - даже в prcoess - не должна иметь таких ограничений.
  2. Если вам нужно использовать строки для хранения, получения или передачи, убедитесь, что вы выбрали фиксированную культуру и строковая кодировка на всех конечных точках. . NET по умолчанию будет пытаться получить правильные настройки из windows, но вы не хотите этого делать. Одна фиксированная установка - это цель. Вы действительно не хотите добавлять проблемы с культурой или кодировкой к обработке строк.
  3. Самые продвинутые классы для хранения данных - такие как REST или XML Handlers - уже решают обе проблемы за вас. Они даже могут заняться парсингом за вас. Поэтому вам следует предпочесть их старым файлам .CSV
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...