Строка из ввода не преобразуется (ошибка формата) - PullRequest
2 голосов
/ 21 июня 2019

ВАЖНОЕ РЕДАКТИРОВАНИЕ !!!!!!!(Я также отредактировал код)


Я обнаружил, что когда я делаю string[] pos = value.Split(','); и другие, это делает правильную вещь, но вот сделка

ВUnity, десятичные дроби в строке представлены ,, поэтому, когда я делаю string[] pos = value.Split(',');, он разделяется на первые 3 запятые, которые он находит, и если вы проверяете Пример данных , я только что изменил, и вы разделяете дляпервые 3 запятые, вы будете иметь Фактические результаты

Мне также удалось исправить шкалу

Исходное сообщение:

I 'Я пытаюсь найти единство, и я следовал этому руководству , чтобы создать хорошую систему сохранения / загрузки (обратите внимание, что я удалил строку value = value.Replace(" ","");, потому что она не нужна):

// Note: value is guaranteed to be a string of numbers in the format: "(1,2,3)"
public Vector3 StringToVector(string value)
{
     value = value.Trim('(', ')');
     value = value.Replace(" ","");
     string[] pos = value.Split(',');
     return new Vector3(float.Parse(pos[0]), float.Parse(pos[1]), float.Parse(pos[2]));
}

Я думаю, что здесь есть ошибка, потому что, если я использую упомянутую функцию в этой другой функции, ось X работает нормально, две другие (Y и Z) * ​​1029 * не :

public virtual void Load(string[] values)
{        
    // in in the variable values[] i have in these positions:
    // values[0] objectname, values[1] (x,y,z) position, values[2] (x,y,z) scale
    transform.localPosition = SaveGameManager.Instance.StringToVector(values[1]);
    transform.localScale = SaveGameManager.Instance.StringToVector(values[2]);
}

Пример данных

string position = "(190,0, 2,5, 180,0)";
string scale = "(5, 5, 5)";

Ожидаемые результаты
- позиция: <190, 2.5, 180>
- сcale: <5, 5, 5>

Фактические результаты
- позиция: <190,0 0,0 2,0>
- шкала: <5, 5, 5>

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

В единстве десятичные дроби в строке представлены как ,

Это верно только в том случае, если ваш компьютер использует локаль, где это правда.Unity использует float.ToString() в Vector3.ToString() и float.ToString() в соответствии с настройками вашего ПК.

Попробуйте поместить Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false); в функцию «Пробудиться» любого объекта в вашей сцене, чтобы заставить локаль и точку США использовать десятичный разделитель.

РЕДАКТИРОВАТЬ: Если вы хотите продолжать использовать запятые в качестве десятичных разделителей, это должно работать:

string[] numbers = value
    .Replace("(", "")
    .Replace(")", "")
    .Replace(", ", "/")
    .Split('/');

Vector3 v = new Vector3(float.Parse(numbers[0]), float.Parse(numbers[1]), float.Parse(numbers[2]));
0 голосов
/ 22 июня 2019

Я обнаружил 99% решение.

value = value.Trim('(', ')');
value = value.Replace(" ","");
string[] pos = value.Split(',');
return new Vector3(float.Parse(pos[0]), float.Parse(pos[1]), float.Parse(pos[2]));

Добавьте этот код сразу после value = value.Replace(" ","");

pos[0] = pos[0] + ',' + pos[1];
pos[2] = pos[2] + ',' + pos[3];
pos[4] = pos[4] + ',' + pos[5];

и заменитель return new Vector3(float.Parse(pos[0]), float.Parse(pos[1]), float.Parse(pos[2]));

с return new Vector3(float.Parse(pos[0]), float.Parse(pos[2]), float.Parse(pos[4]));

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

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