UnityФорумПрограммирование

Проблема с преобразоанием string во float

#0
11:06, 20 янв 2024

Всем привет!

Опять возникла эта идиотская проблема с преобразованием типов... :facepalm:

В общем, читаю файл, где у меня текст с YAML-разметкой, и оттуда
беру текстовые переменные, которые надо преобразовать во float и сохранить в базе данных.

Всё стандартно:

float delaymin = float.Parse (matchefloat[0].Value);

преобразование категорически не работает...
(в который раз уже эта херня, но как решал ранее не помню:) )
даже когда для теста упростил до абсурда:

string str = "6.5";
float delaymin = float.Parse(str);

Unity в обоих случаях пишет ерунду:

FormatException: Input string was not in a correct format.
System.Number.ParseSingle (System.String value, System.Globalization.NumberStyles options, System.Globalization.NumberFormatInfo numfmt) (at <695d1cc93cca45069c528c15c9fdd749>:0)
System.Single.Parse (System.String s, System.Globalization.NumberStyles style, System.Globalization.NumberFormatInfo info) (at <695d1cc93cca45069c528c15c9fdd749>:0)
System.Single.Parse (System.String s) (at <695d1cc93cca45069c528c15c9fdd749>:0)
SpeechEditor.LoadYAML () (at Assets/Editor/SpeechEditor/SpeechEditor.cs:862)
SpeechEditor.OnGUI () (at Assets/Editor/SpeechEditor/SpeechEditor.cs:159)

Компилятор, разумеется, ни ошибок, ни каких-либо проблем не видит.

Подскажите в чём может быть проблема.
Заранее спасибо!

#1
(Правка: 11:15) 11:12, 20 янв 2024

MSA2
> Подскажите в чём может быть проблема.
Сепаратор может быть как ".", так и "," - зависит от региональных параметров.
Надо указывать FormatProvider явно

MSA2
>Unity в обоих случаях пишет ерунду:
Ну и это, первый же ответ в гугле по запросу -
float.parse FormatException: Input string was not in a correct format.

#2
11:18, 20 янв 2024

andrey.mesheryakov
Сепаратор может быть как ".", так и "," - зависит от региональных параметров.
Надо указывать FormatProvider явно

Андрей, нечеловеческое спасибо!))
Заменил точку на запятую и всё ок!
Понимал же, что это нечто очевидное, но температура
под 38 не позволяет нормально соображать)

Ещё раз спасибо!

#3
11:19, 20 янв 2024

andrey.mesheryakov
Ну и это, первый же ответ в гугле по запросу -
float.parse FormatException: Input string was not in a correct format.

Ну да, написано, что неверный формат. С цифрами напутать сложно, остаётся точка..)

#4
11:45, 20 янв 2024

MSA2
> Заменил точку на запятую и всё ок!
Так делать неправильно же! Смотри - ты вот заменил точку на запятую и у тебя все заработало. А у кого-то другого, кто будет запускать твою программу будут другие региональные настройки - и у него не будет парсится.
Надо мало того, что бы во всех местах были одинаковые сепараторы, так и явно указывать FormatProvider

#5
12:03, 20 янв 2024

andrey.mesheryakov
Так делать неправильно же! Смотри - ты вот заменил точку на запятую и у тебя все заработало. А у кого-то другого, кто будет запускать твою программу будут другие региональные настройки - и у него не будет парсится. Надо мало того, что бы во всех местах были одинаковые сепараторы, так и явно  указывать FormatProvider

В моём случае дополнительных усилий не требуется:

SpeechEditor.LoadYAML () (at Assets/Editor/SpeechEditor/SpeechEditor.cs:862)

- это у меня скрипт, который в режиме радактора конвертирут файлы с диалогами персонажей во внутренний json-формат. Решил отказаться от кастомного редактора диалогов внутри Unity в пользу текстового формата. С большими объёмами текстов так будет проще работать. А в Unity останется лишь импортировать свежую версию с диалогами, а он там внутри всё как надо раскидает.

Если бы преобразование string'ов осуществлялись в игре, то, конечно, скрипты необходимо было бы дорабатывать.

#6
14:16, 21 янв 2024

Ты не понимаешь сути пустошей, не надо заменять точку на запятую, просто укажи, что флоат будет парситься, игнорируя культурные настройки для текущей машины:

using System.Globalization;
//...
float delaymin = float.Parse (matchefloat[0].Value, CultureInfo.InvariantCulture);
#7
12:13, 22 янв 2024

RyKrys
Ты не понимаешь сути пустошей, не надо заменять точку на запятую, просто укажи, что флоат будет парситься, игнорируя культурные настройки для текущей машины:

Вчера мне нужно было быстрое и какое угодно решение.))

Сегодня подключил указанную вами библиотеку и всё ок.
Почитаю там ещё кое-какие детали в документации.

Большое спасибо за подсказки!!!

UnityФорумПрограммирование