95 / 87 / 61
Регистрация: 21.04.2014
Сообщений: 1,251
1

На разных машинах код работает по разному

08.11.2018, 11:40. Показов 1823. Ответов 10
Метки нет (Все метки)

Здравствуйте.
Есть вот такой фрагмент кода, который должен из строки делать число:
C#
1
2
3
4
double dRes;
if ( double.TryParse ( tb1.Text.Replace ('.', ','), out dRes ) )
            {
}
В качестве разделителя всегда будет приходить точка, поэтому использую Replace.
И у меня он работает. На пример если на входе строка "0.003", то получается соответствующее число. Но при запуске на другом компьютере получается просто 3. Уже поставил логировние в код и увидел, что на другом компьютере после Replace получается строка "0,003", но сразу же после TryParse переменная dRes становится равна трём. Никаких других манипуляций с переменной не происходит.
Почему так может быть?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2018, 11:40
Ответы с готовыми решениями:

Макрос автосохранения работает по-разному на разных машинах
Всем доброе время суток.Написал макрос автосохранения определенной excel книги. На одном компе...

Плохо работающий код на разных машинах
Доброго времени суток, только взялся за изучение этого всего, С# знаю не очень, потому что изучал...

Один код на разных машинах выдает разные результат
Работаю в Clion, стандарт С++11. Если запускаю следующий код на windows то получаю true, на linux...

Приложение по разному работает на разных пк
Всем доброго времени суток, нужна ваша помощь. Написал программу в которой одна из функций по...

10
598 / 482 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
08.11.2018, 11:43 2
FaceHoof, стоит почитать о культуре
1
Эксперт .NET
9330 / 6693 / 1081
Регистрация: 21.01.2016
Сообщений: 25,227
08.11.2018, 11:44 3
Лучший ответ Сообщение было отмечено FaceHoof как решение

Решение

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

В документации этот момент обсасывается.
3
95 / 87 / 61
Регистрация: 21.04.2014
Сообщений: 1,251
08.11.2018, 11:49  [ТС] 4
Usaga, а как сделать универсальный вариант? Или мне каждый раз проверять культуру и делать две ветви кода?
0
Эксперт .NET
9330 / 6693 / 1081
Регистрация: 21.01.2016
Сообщений: 25,227
08.11.2018, 11:49 5
FaceHoof, перво-наперво, сходите по ссылке и почитайте.
0
907 / 792 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
08.11.2018, 11:50 6
Цитата Сообщение от FaceHoof Посмотреть сообщение
Но при запуске на другом компьютере получается просто 3.
Цитата Сообщение от FaceHoof Посмотреть сообщение
Почему так может быть?
очень вряд ли, но посмотри на том компе разделитель тысячных ибо в таком варианте похоже на то что запятая там как разделитель тысячных, это единственный вариант при котором из 0,003 может получится 3
0
598 / 482 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
08.11.2018, 11:52 7
Лучший ответ Сообщение было отмечено FaceHoof как решение

Решение

Цитата Сообщение от FaceHoof Посмотреть сообщение
Usaga, а как сделать универсальный вариант? Или мне каждый раз проверять культуру и делать две ветви кода?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public static double ParseToDouble(string value)
        {
            double result = Double.NaN;
 
            value = value.Trim();
 
            if (!double.TryParse(value, NumberStyles.Any, CultureInfo.GetCultureInfo("ru-RU"), out result))
            {
                if (!double.TryParse(value, NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out result))
                {
                    return Double.NaN;
                }
            }
 
            return result;
        }
Добавлено через 34 секунды
Это решение для 2х культур.
1
Эксперт .NET
15460 / 11720 / 3079
Регистрация: 17.09.2011
Сообщений: 19,609
08.11.2018, 12:24 8
Цитата Сообщение от FaceHoof Посмотреть сообщение
а как сделать универсальный вариант?
А он нужен?
Почему на одних системах у вас числа с запятыми, а на других — с точками?
Смотрите прежде всего на источник: если данные читаются из внешнего источника (файла, например), то используйте в коде всегда ту культуру, которая используется в файле. Ну или при считывании из файла учитывайте формат, а дальше пользуйте как хотите.
Если данные вводятся пользователем в интерфейс, то здесь можно либо установить ограничение на формат и учитывать его в коде, либо везде парсить в текущей культуре.

В общем, лучше изначально определить момент, где происходят разногласия в используемом формате и исправить код там, чем придумывать варианты на все возможные случаи жизни.
0
Эксперт .NET
9330 / 6693 / 1081
Регистрация: 21.01.2016
Сообщений: 25,227
08.11.2018, 12:59 9
FaceHoof, перво-наперво, сходите по ссылке и почитайте.
Цитата Сообщение от FaceHoof Посмотреть сообщение
В качестве разделителя всегда будет приходить точка
Вам не нужны никакие варианты. Разделитель, с ваших слов, всегда один. Значит и культура для разбора строки тоже должна быть одна.
0
95 / 87 / 61
Регистрация: 21.04.2014
Сообщений: 1,251
08.11.2018, 14:19  [ТС] 10
Цитата Сообщение от Usaga Посмотреть сообщение
Значит и культура для разбора строки тоже должна быть одна.
А её ведь можно просто задать руками, вот так?
C#
1
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo ( "ru-RU" );
Подводные камни есть?
0
Эксперт .NET
15460 / 11720 / 3079
Регистрация: 17.09.2011
Сообщений: 19,609
08.11.2018, 15:42 11
Цитата Сообщение от FaceHoof Посмотреть сообщение
Подводные камни есть?
Есть.

Ну и плюс все, что связано с форматированием в этом потоке, будет проводиться с учетом установленной культуры.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2018, 15:42

По-разному работает на разных телефонах
Делаю программу на Android Studio. И вот такая проблема, что на моём телефоне часть программы не...

PHP-код выполняется по разному на разных хостах
Есть php-код, который получает от клиента на с++ post-запрос и отправляет ему миди файл: <?php...

Компьютер работает по разному в разных квартирах
Я знаю, что тема странная, но попробую описать свою проблему. Мой пк: Процессор: i7-8700 Кулер:...

Ssd работает по разному на разных материнках?
всем хаюшки преобрел ssd SanDisk Ultra II на 120 до этого стоял Kingston v300 на 120 по тестам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.