Все простые типы с методами Parse
и ToString
имеют перегрузки, которые принимают аргумент IFormatProvider
. Здесь вы можете использовать экземпляр CultureInfo
(или NumberFormatInfo
/ DateTimeFormatInfo
), который предоставляет информацию о такой специфической для культуры информации, как знак десятичного разделителя и разделитель тысяч.
По умолчанию int.Parse
, DateTime.ToString
и т. д. перегрузки используют Thread.CurrentCulture
для определения этой информации, которая может быть разной на разных рабочих станциях в зависимости от региональных настроек.
Отсюда следуют эмпирические правила:
- Когда хранит числа с плавающей запятой или значения даты и времени в виде строки в базе данных (или в текстовых файлах, как в вашем случае) всегда используйте конкретную культуру (предпочтительно
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, потому что в английских настройках запятая интерпретируется как разделитель тысяч.