Формат десятичного числа для использования в XML и игнорирование культуры

Нам нужно вставить десятичные значения в XML-документ (сделанный автором XML), который отлично работает. Сначала мы использовали XmlConvert.ToString(myDecimalValue) который напечатал значение с четырьмя цифрами. Теперь мы вынуждены использовать всегда две цифры, и мы попытались изменить это, но пока не повезло.

Сначала мы отказались от использования XmlConvert потому что мы обнаружили, что не перегружаем, что позволяет нам форматировать десятичное число, чтобы мы попытались myDecimalValue.ToString("0.00") который печатает только две цифры, но заменяет . с a , что недействительно в нашем случае.

Итак, как мы можем отформатировать десятичное число, например, 25000.00m до строки, например, 25000.00?(Округление не имеет значения, потому что значения никогда не имеют более двух цифр)

РЕДАКТИРОВАТЬ

decimal m_nAmt;
public decimal Amount
{
 get
 {
 return m_nAmt;
 }
 set
 {
 if ((value < 0M) || (value > 999999999.99M))
 {
 throw new ArgumentOutOfRangeException();
 }
 if (SepaUtil.DecimalPlaces(value) > 2)
 {
 throw new ArgumentException();
 }

 m_nAmt = value;
 }
}

И где написано

// the original method
XmlConvert.ToString(m_nAmt);

Оба метода являются членами одного и того же класса;

Вот пример значения, записанного в файл Xml

<instdamt ccy="EUR">3360.0000</instdamt>
  • Важно отметить, что это часть библиотеки классов, которая охватывает части стандарта SEPA, но автор не предоставляет никакой поддержки. *

Изменить 2

Пример, когда узел записывается. Я использовал окно Immediate для получения текущего значения свойства ControlSum (System.Decimal) и значения, написанного XmlConvert. В результате XmlConvert записывает четыре десятичных XmlConvert, хотя я не могу подтвердить, что при использовании XmlConvert с десятичной переменной в LINQPad. Где одно отличие состоит в том, что эта библиотека использует.net 2.0

Мой вывод и решение

Кажется, что XmlConvert.ToString() или decimalvalue.ToString() применяет четыре знака после запятой, потому что исходное значение имеет четыре применяемых 0 которые были проигнорированы с помощью SepaUtil.DecimalPlaces(value) (поскольку 0 проигнорировано) и не отображаются внутри "Немедленное окно" VS2012. Поэтому я изменил

m_nAmt = value;

в

m_nAmt = Math.Round(value,2);

для обеспечения всегда двух знаков после запятой. Этот способ добавит отсутствующие десятичные знаки и усечет, если их будет больше.

2 ответа

Предполагая, что это действительно decimal, я предлагаю вам сначала округлить десятичное значение:

decimal rounded = Math.Round(original, 2);
string roundedText = XmlConvert.ToString(rounded);

Очевидно, вы также можете указать соответствующее поведение округления/усечения.

Хотя вы можете просто указать инвариантную культуру вместо ответа PMF, я бы рассмотрел выше, чтобы быть более четким в том, чего вы пытаетесь достичь:

  • Вы точно округлите ценность
  • Вы специально используете преобразование XML

Одна разница, однако - в моей версии выше, если исходный номер имеет только одно десятичное место (или нет), вы получите (скажем) "15,5". Если вы явно форматируете строку с инвариантной культурой, вы получите "15.50". Если вы определенно всегда хотите ровно 2 десятичных разряда (не меньше), тогда ответ PMF является более подходящим.


использование

myValue.ToString("0.00", CultureInfo.InvariantCulture);

Это всегда будет записывать значение в независимом от языка формате (в основном на английском языке). Используйте тот же аргумент при любых TryParse() Parse() или TryParse() при чтении.

Как правило, все TryParse() Parse(), TryParse() или ToString() должны иметь аргумент CultureInfo, указанный как CultureInfo.InvariantCulture или CultureInfo.CurrentCulture. Это предотвращает любые странные ошибки, которые происходят, когда язык пользователей использует другую десятичную метку, чем разработчики.

licensed under cc by-sa 3.0 with attribution.