Как сделать двойной всегда содержать. характер?

2

Я заметил, что мои двойники содержат разные символы точности в зависимости от региональных настроек.

Например:

3,47 или 3.45

Как я могу принудительно использовать double, должен всегда содержать символ точности .?

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

Итак, прочитав ваши ответы (и спасибо), вы, ребята, рекомендуете изменить свойство на строку (делая замены в строке), чтобы она сериализовалась со строковым значением (а не двойным)?

  • 1
    В вашем последнем дополнительном комментарии: не используйте замены в строке (как насчет разделителя тысяч? Или числа с плавающей запятой, оканчивающиеся на грамматическую запятую? В дальнейшем вы столкнетесь с большими трудностями, просто используйте InvariantCulture в тот момент, когда вы преобразуетесь в строку или задаете Application.CurrentCulture чтобы он вообще не беспокоился.
Теги:

5 ответов

15
Лучший ответ

Вам нужно поместить double в строку, используя Invariant Culture.

double d = 3.47;
Console.WriteLine(d.ToString(CultureInfo.InvariantCulture));
7

Вам нужно будет форматировать InvariantCulture.

Обратите внимание, что "." и "," символы форматирования интерпретируются в соответствии с настройками культуры.

  • 0
    +1. Да, точнее, код, создающий XML, должен работать под InvariantCulture.
2

Этот небольшой учебник будет ответом, который вам нужен, я ожидаю: http://www.java2s.com/Tutorial/CSharp/0440__I18N-Internationalization/Parsingnumberswithcultureinvariantparsing.htm

double.Parse(numberString, CultureInfo.InvariantCulture);
2

В самом двойнике не содержится "." или ",", только распечатка из представления. Вы можете читать пользовательские форматы здесь.

[Обновить согласно OP]
Я не знаю точно, как выглядит ваш дизайн, но, вероятно, было бы разумно создать свойство string на вашем DTO, которое выдаст форматированную строку вашего двойника, а затем пометьте ваше двойное свойство как не сериализуемое.

0

Если вам нужно сделать это для всех номеров в вашем текущем приложении, вы можете использовать следующее, чтобы установить его на уровне приложения (новые потоки наследуют этот параметр):

// use this statement to force the default:
Application.CurrentCulture = CultureInfo.InvariantCulture;
string s = myNumber.ToString();

// for one number you have to remember to use:
string s = myNumber.ToString(CultureInfo.InvariantCulture);

Примечание. По умолчанию ваше приложение, будь то ASP.NET или WinForms, будет использовать настройки культуры в системе, на которой он запущен (в ASP.NET вы можете установить культуру в глобальном масштабе в web.config).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню