Как исправить представление данных, чтобы правильно отображать двойные значения? - PullRequest
0 голосов
/ 04 октября 2019

Итак, я живу в Венгрии, и я делаю приложение Windows Form в C #, и я использую двойное значение в моем datagridview, и мне это показывает отлично (напр. 3,4). Но я делаю эту программу в другую страну, Испанию. И моему другу в Испании запятая не отображается в datagridview. Так что для него это показывает 34.

У кого-нибудь есть идеи, что я должен включить в свой код, чтобы показывать запятые в "каждой стране"?

Ожидаемый выход 3,4 будет 3,4, но фактический выход составляет 34. (в Испании)

if (File.Exists("files/returned.txt"))
        {
            string[] allLines = File.ReadAllLines("files/returned.txt");
            int n = int.Parse(allLines[0]);
            int dgvCount = 0;
            dgv2.RowCount = 0;
            dgv2.RowCount = n;

            for(int i = 1;i<n+1;i++)
            {
                string[] splitt = allLines[i].Split('\t');
                DateTime a = DateTime.Parse(dt_from.Value.ToShortDateString());
                DateTime b = DateTime.Parse(dt_to.Value.ToShortDateString());

                DateTime c = DateTime.Parse(splitt[2]);

                if(tb_returned_sn.Text != "")
                {
                    if (splitt[1].StartsWith(tb_returned_sn.Text) && DateTime.Compare(a, c) <= 0 && DateTime.Compare(b, c) >= 0)
                    {
                        for (int j = 0; j < 12; j++)
                        {
                            dgv2.Rows[dgvCount].Cells[j].Value = splitt[j];
                        }
                        dgvCount++;
                    }
                }
                else
                {
                    if(DateTime.Compare(a, c) <= 0 && DateTime.Compare(b, c) >= 0)
                    {
                        for (int j = 0; j < 12; j++)
                        {
                            dgv2.Rows[dgvCount].Cells[j].Value = splitt[j];
                        }
                        dgvCount++;
                    }
                }
            }
            dgv2.RowCount = dgvCount;
            if(dgvCount == 0)
            {
                MessageBox.Show("NOT FOUND");
                bt_excel.Enabled = false;
            }
            else
            {
                bt_excel.Enabled = true;
            }
        }
        else
        {
            MessageBox.Show("The equipments' database does not exist!");
        }
        tb_returned_sn.Focus();

1 Ответ

1 голос
/ 04 октября 2019

Все простые типы с методами Parse и ToString имеют перегрузки, которые принимают аргумент IFormatProvider. Здесь вы можете использовать экземпляр CultureInfo (или NumberFormatInfo / DateTimeFormatInfo), который предоставляет информацию о такой специфической для культуры информации, как знак десятичного разделителя и разделитель тысяч.

По умолчанию int.Parse, DateTime.ToString и т. д. перегрузки используют Thread.CurrentCulture для определения этой информации, которая может быть разной на разных рабочих станциях в зависимости от региональных настроек.

Отсюда следуют эмпирические правила:

  1. Когда хранит числа с плавающей запятой или значения даты и времени в виде строки в базе данных (или в текстовых файлах, как в вашем случае) всегда используйте конкретную культуру (предпочтительноCultureInfo.InvariantCulture), поэтому, когда ваша «база данных» анализируется на разных компьютерах с разными региональными настройками, вы всегда будете получать согласованные результаты. Например:
// of course, it must be also stored with invariant culture
int n = int.Parse(allLines[0], CultureInfo.InvariantCulture);
Для отображения значений в пользовательском интерфейсе вы можете использовать текущие региональные настройки. Но вместо использования перегрузок ToString по умолчанию все равно предпочтительнее указать культуру, чтобы прояснить намерение. Например:
myDateTime.ToString("d", CultureInfo.CurrentCulture); // d for short date format

Что касается 3,4 против 34:

Хотя и венгерский, и испанский (по крайней мере, в Испании) используют запятую какдесятичный знак, региональные настройки должны быть другими (английскими?) на компьютере, который анализирует 3,4 как 34, потому что в английских настройках запятая интерпретируется как разделитель тысяч.

...