2009-10-23 29 views
19

Tengo una propiedad decimal, comoC# serializar decimal a xml

[XmlElementAttribute(DataType = "decimal")] decimal Price

El problema es que yo quiero forzarlo a serializar siempre con precisión de 2, pero si el precio es 10.50 que serán serializados a XML como <Price>10.5</Price>.

Hay alguna manera de forzarlo (sin crear una nueva propiedad o cambiar la obtención de esta propiedad? Estoy buscando alguna forma de hacer esto enviando un patrón al XmlSerializer (o al XmlElementAttribute) o de cualquier manera inteligente para hacer esto?

Gracias

+0

Estaba lidiando con el mismo problema y encontré su pregunta, luego encontré una respuesta diferente. Echale un vistazo. –

+1

@Jim ...... y la respuesta es ¿qué es exactamente? ¿Qué tal un enlace? –

+0

@JK Creo que es el [abajo] (http://stackoverflow.com/a/2456126/255). –

Respuesta

8

Se podría añadir XmlIgnore a la propiedad decimal real e introducir un nuevo PriceAsString propiedad que devuelve, eh, el precio como cadena (en el 10,5 formato).

Por supuesto, también podría implementar IXmlSerializable y haz todo tú mismo.

Sin embargo, ninguna de estas formas realmente rocas, y que ya se ha dicho que no ibas a ir por este camino de todos modos ...

24

que estaba teniendo el problema opuesto. Mis decimales se serializaban con 4 lugares decimales, a pesar de que eran todos 4 ceros. Descubrí que si llamo al decimal.Round(value, 2), se serializa a 2 decimales. Parece que el tipo Decimal recuerda lo que redondeaste por última vez cuando se serializa.

Sospeché de la sugerencia, pero funcionó así de simple. A pesar de que el valor no necesitaba redondeo, la llamada a Ronda cambió la cantidad de decimales que apareció en la serialización.

+0

¡Agradable! Todo lo que he hecho es al establecer un valor use decimal. Redondee con la precisión deseada. ¡Esta es la respuesta * real *! – Schultz9999

+2

+1 Yup esto funciona, es un poco hacky tho –

+0

Se me solicitó un valor codificado de '0.00' y (en VB.NET) esto fue lo único que funcionó: Decimal.Round (0.00D, 2) –