Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для lynx98
2 / 2 / 0
Регистрация: 06.02.2020
Сообщений: 46

Некорректная работа программы при другом языке системы

28.07.2020, 20:22. Показов 2107. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Написал программу на С++/CLI Win Form.

Первый скриншот работа программы на родном языке системы (английский) это корректный вывод.
Второй скриншот после переключения на немецкий язык.

Скажите, пожалуйста, по какой причине это происходит? И происходит ли это по той причине что язык в системе переключил или потому что он именно немецкий?
Миниатюры
Некорректная работа программы при другом языке системы  
Изображения
 
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.07.2020, 20:22
Ответы с готовыми решениями:

Некорректная работа программы,при вводе отрицательного числа
Здравствуйте.Есть некий // { int c; char array; printf( "Vvod: " ); scanf( "%d", &c ); printf(...

Некорректная работа программы при использовании динамического массива
доброго времени суток, уважаемые форумчане, я ранее создавал тему с названием удаление динамического массива, но мне нужно кое-что другое....

Некорректная работа программы при запуске через ярлык
Помогите мне пожалуйста, уважаемые форумчане! У меня есть некая программа, которая хранит свои настройки в текстовом файле. Открываю я...

11
Эксперт .NET
 Аватар для Rius
13235 / 7730 / 1681
Регистрация: 25.05.2015
Сообщений: 23,551
Записей в блоге: 14
28.07.2020, 20:25
Проверьте разделители дробной части и тысяч.

Добавлено через 1 минуту
Точка это первое в английской локали, и второе в германской.
1
 Аватар для lynx98
2 / 2 / 0
Регистрация: 06.02.2020
Сообщений: 46
28.07.2020, 20:53  [ТС]
Rius, можете, пожалуйста, подробнее объяснить. Я не понял ваш пост, особенно второе предложение.

У меня использована datagrid и я там через CellStyle задал округление "N3" как "выводить до трёх знаков после запятой". И я не понимаю причём здесь точка.

Добавлено через 6 минут
Rius,

У меня double число присваивается к Value.

И после этого я делаю визуальное округление числа вот такой строчкой

C++
1
dataGridView3->Columns[i]->DefaultCellStyle->Format = "N3";
И я не понял ваше предложение про точки если честно.

Добавлено через 5 минут
Изменил язык системы на английский, проблема ушла, но появилась другая теперь программа не заполняет таблицу до конца. Это просто ужасно.

Добавлено через 5 минут
То есть на русский изменил. На английском всё нормально.
0
Эксперт .NET
 Аватар для Rius
13235 / 7730 / 1681
Регистрация: 25.05.2015
Сообщений: 23,551
Записей в блоге: 14
28.07.2020, 20:59
Во все ячейки запишите число 0.01 (одна сотая).
Безо всяких вычислений, просто захардкодить.
Покажите скриншоты в английской и германской локали.
1
 Аватар для lynx98
2 / 2 / 0
Регистрация: 06.02.2020
Сообщений: 46
28.07.2020, 21:14  [ТС]
Прямо во всех не получится т.к. там у каждого столбца свои рассчёты и они взаимосвязаны друг с другом я вам одну строку сделал. Никаких измнений нет. Написал в немецкой системе, скомпилировал, запустил. Потом перешёл на английскую и тоже самое.

Хотя нет, есть в немецком запята, в англ точка. И что мне делать с этим, Rius? Нужно чтобы программа работала корректно на системах обоих языков...
Изображения
  
0
Эксперт .NET
 Аватар для Rius
13235 / 7730 / 1681
Регистрация: 25.05.2015
Сообщений: 23,551
Записей в блоге: 14
28.07.2020, 21:28
Видите, выглядит одинаково.
У вас же в первом посте различаются значительно:
en: 0.002 (1.6e-3)
de: 1.600,000 (1.6e+3)
Это значит, что значения где-то вычисляются на основе данных, полученных без учёта локали.

А локали такие:
  • немецкий
    • разделитель тысяч - пробел или точка
    • разделитель дроби - запятая
  • английский
    • разделитель тысяч - пробел или запятая
    • разделитель дроби - точка

Добавлено через 57 секунд
Цитата Сообщение от lynx98 Посмотреть сообщение
Нужно чтобы программа работала корректно
Сначала надо чётко определить критерии корректности. Затем по ним написать юнит-тесты для ваших формул. С учётом особенностей локалей, приведённых выше.
0
 Аватар для lynx98
2 / 2 / 0
Регистрация: 06.02.2020
Сообщений: 46
28.07.2020, 21:49  [ТС]
Да там данные уже вычисленные. Изначально программа получает ввод пользователя или загруженные из файла числа и далее обсчитывает их.

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

Добавлено через 13 минут
Rius, я понял. Вся проблема в функции format ot defaultcellstyle. Просто она форматирует по разному. Посоветуйте, пожалуйста, что-нибудь последний раз и я отстану от вас. Как сделать так чтобы и форматирование было красивое и от локали это не зависело?
0
Эксперт .NET
 Аватар для Rius
13235 / 7730 / 1681
Регистрация: 25.05.2015
Сообщений: 23,551
Записей в блоге: 14
28.07.2020, 21:50
Лучший ответ Сообщение было отмечено lynx98 как решение

Решение

Под ваши значения так сходу не подберу данные.
Попробуйте пошагово пройти в VS:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Globalization;
 
namespace ConsoleApp1 {
    internal class Program {
        private static void Main(string[] args) {
            /*
             * en: 0.002
             * de: 1.600,000
             *
             * немецкий
             * разделитель тысяч - пробел или точка
             * разделитель дроби - запятая
             *
             * английский
             * разделитель тысяч - пробел или запятая
             * разделитель дроби - точка
             */
 
            var strA = "0.0016";
            var strB = "1.000";
 
            CultureInfo.CurrentCulture = new CultureInfo("en-US");
            var a = double.Parse(strA);
            var b = double.Parse(strB);
            Console.WriteLine("{0:G}", a * b);
 
            CultureInfo.CurrentCulture = new CultureInfo("de-DE");
            a = double.Parse(strA);
            b = double.Parse(strB);
            Console.WriteLine("{0:G}", a * b);
 
            CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
            a = double.Parse(strA);
            b = double.Parse(strB);
            Console.WriteLine("{0:G}", a * b);
        }
    }
}
Повторяю, как делать правильно - зависит от критериев правильности.
В данных, читаемых только программой - надо использовать нейтральную культуру (CultureInfo.InvariantCulture).
А вот в читаемых человеком - думайте. Немец может неправильно прочитать число, написанное англичанином.
1
 Аватар для lynx98
2 / 2 / 0
Регистрация: 06.02.2020
Сообщений: 46
28.07.2020, 21:55  [ТС]
Rius, спасибо большое вам за помощь. Извините что так долго доставал вас, я понял проблему. Перевод промежуточных реузльтатов в строку при рассчёте.
0
Эксперт .NET
 Аватар для Rius
13235 / 7730 / 1681
Регистрация: 25.05.2015
Сообщений: 23,551
Записей в блоге: 14
28.07.2020, 21:55
Цитата Сообщение от lynx98 Посмотреть сообщение
форматирование было красивое и от локали это не зависело?
>>>>>>>
Цитата Сообщение от Rius Посмотреть сообщение
Немец может неправильно прочитать число, написанное англичанином.
Вы не торопитесь ли с единым форматированием для разных языков?
0
 Аватар для lynx98
2 / 2 / 0
Регистрация: 06.02.2020
Сообщений: 46
28.07.2020, 22:04  [ТС]
Rius да я новичок ещё даже что такое форматирование толком не понимал до этого треда. Я понял ошибку, моя программа промежуточные результаты которые должен видеть пользователь переводила в строку, а потом обратно в double и так вычисляла. Но суть в том что допустим в как вы писали вначале в англе точка имеет код 1, а немецком код 1 имеет запятая и поэтому получается такое.

Вывод нужно отделять вычисления от данных которые видит пользователь. Я уже исправляю. Спасибо вам большое.
0
 Аватар для lynx98
2 / 2 / 0
Регистрация: 06.02.2020
Сообщений: 46
29.07.2020, 06:24  [ТС]
Rius, ещё раз хочу вас поблагодарить. Дошли до меня наконец ваши слова полностью. Сейчас на википедии прочитал что в штатах и других англоязычных странах дробный разделитель точка, а в европе запятая. Моя программа получала ввод из save файла(чтобы не вбивать данные в таблицу каждый раз заново) и в англоязычной версии там точка была, а в немецкой он эту точку за делитель тысяч принял и такие огромные результаты получались.

Я в немецкой в вводных данных заменил точку на запятую и всё заработало. Остаётся только сделать так чтобы программа обрабатывала точку и запятую в соотвествии с текущей локалью.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.07.2020, 06:24
Помогаю со студенческими работами здесь

Некорректная работа программы при добавлении столбца в двумерный массив
Проблемма в том что когда добавляю строку все прекрастно работает... А вот со столбцом -- работает но не корректно... Подскажите что не...

Некорректная работа программы при встраивании ComboBox в ячейку StringGrid
Здравствуйте. Реализовал встраивание ComboBox в ячейку StringGrid через событие onMouseUp. Реализовано как-то так: procedure...

Регулярное выражение и некорректная работа программы при использовании .split()
Вот код минимальный код работы программы с комментариями: private final Pattern PatternTimeTable =...

Автоматическая генерация кода программы на основе программы на другом языке программирования
Где может приминяться?Зачем она нужна? И как её примерно делать, не имею представления, спасибо

Решение системы уравнений методом простых итераций с параметром при написании программы на языке Visual Basic
Здравствуйте, уважаемые программисты! Прошу помощи с заданием, необходимо решить систему уравнений методом простых итераций с параметром с...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru