2012-04-26 3 views
0

XmlSerializer를 사용하여 xml 문자열로 소수점이 포함 된 C# 개체를 직렬화합니다.C# XML serialization 및 Decimal 값

AnObject.ADecimalValue 

정확도가 다음과 같이 명시 적으로 반올림 한 경우에도 매우 다양하다는 것을 알았습니다. 일부 값은 지점 뒤에 4 개의 값이 출력됩니다. 12564.39는 직렬화 코드는 아래와 같다 출력

AnObject.ADecimalValue = decimal.Round(AnObject.ADecimalValue, 2);

12564.3900으로 얻는다.

XmlSerializer serializer = new XmlSerializer(typeof(AnObject)); 

    using (StringWriter writer = new StringWriter()) 
    { 
     serializer.Serialize(writer, source); 

     string result = writer.ToString(); 

     return result; 
    } 

어떻게 두 값이

+0

문자열로 지정하십시오. –

답변

1

내가 부동 소수점 숫자를 반올림이 도움을 줄 수 있다고 생각하지 않습니다 소수점 출력 밖으로 보장 할 수 있습니다. serializer는 자체 규칙에 따라 숫자를 문자열로 변환합니다. 당신이 할 수있는 최선의 방법은 새로운 문자열 프로퍼티를 도입하고 그 안에 숫자를 포맷하고 원래의 숫자 대신 그것을 직렬화하는 것입니다. Can you specify format for XmlSerialization of a datetime?

1

당신이 당신의 객체에는 직렬화하는 방법을 재정의 IXmlSerializable을 구현할 수 : 주제, 유사한 문제에

더?

문서 here 및 구현 방법에 대한 좋은 분석 here.

그렇다면 비슷한 문제가있는 사람이 here 게시물을 게시합니다. 십진수를 올바르게 반올림하여 제대로 작동하는지 확인할 수 있습니다. 그렇지 않으면 문자열로 작성할 수 있습니다.

0

다음은 비슷한 문제를 해결 한 방법이며 완벽하게 작동합니다. 내 경우

private decimal price; 

    [XmlElement(DataType="decimal")] 
    public string Price 
    { 
     get { return price.ToString("c"); } 
     set { price = Convert.ToDecimal(value); } 
    } 

, 나는 통화로 변환,하지만 당신은 ("0.00")이 제로로 진수 할 수있는 XML 요소를 변환 price.ToString를 사용할 수 있습니다.

+0

'DataType = "decimal"인수를 추가하면 "decimal은 XmlElementAttribute.DataType 속성에 유효하지 않은 값입니다. decimal은 System.String으로 변환 될 수 없습니다"라는 메시지와 함께 Runtime InvalidOperationException이 발생합니다. (메시지가 현지화되었으며 영어로 다시 번역되었으므로 조금 다를 수 있음). –