Я знаю, что все здесь уже объяснили причину возникшей проблемы, но, возможно, кто-то должен просто рассказать, почему Invariant исправляет ее.
Класс CultureInfo используется прямо или косвенно классами, которые форматируют, анализируют или манипулируют данными, относящимися к культуре, такими как String, DateTime, DateTimeOffset и числовые типы, чтобы справляться с различиями в способе написания этих разных культур. типы.
В случае десятичного типа некоторые культуры используют точку (.), В то время как другие используют запятую (,). По умолчанию, когда вы используете библиотеки преобразования, он будет использовать вашу местную культуру (то есть страну, для которой настроена ваша ОС).
Указывая Invariant, вы говорите, что ожидаете, что тысячи разделителей будут запятыми (,), а десятичный разделитель - точкой (.), Как в большинстве культур.
Большая проблема, которая иногда возникает, заключается в том, что эти культурные соглашения меняются с точки зрения ОС. Например, информация о культуре Южной Африки (ZA) использовалась как инвариантная культура. Microsoft изменила это в Windows 8, где десятичная дробь внезапно стала запятой, а разделитель тысяч - пробелом. Это привело к тому, что многие устаревшие системы, написанные на .Net, неожиданно сломались, когда кто-то перенес их на более новые операционные системы.
В конце концов, сделайте нормализацию всей информации о местной культуре инвариантной и неизменной и используйте ее в своей бизнес-логике в этом формате. Затем поместите его обратно на передний конец. То же самое относится и к DateTime, при первой возможности конвертируется в UTC и только обратно при рендеринге вывода.