Mi aplicación trata porcentajes mucho. Generalmente, estos se almacenan en la base de datos en su forma escrita en lugar de decimal (el 50% se almacenaría como 50 en lugar de 0.5). También existe el requisito de que los porcentajes estén formateados de forma consistente en toda la aplicación.Creando un tipo de porcentaje en C#
Para este fin he estado considerando crear una estructura llamada porcentaje que encapsula este comportamiento. Supongo que su firma sería algo como esto:
public struct Percentage
{
public static Percentage FromWrittenValue();
public static Percentage FromDecimalValue();
public decimal WrittenValue { get; set; }
public decimal DecimalValue { get; set; }
}
¿Es esto algo razonable de hacer? Verdaderamente encapsularía alguna lógica que se repite muchas veces, pero es lógico que peopel pueda entender. Supongo que necesito hacer que este tipo se comporte como un número normal tanto como sea posible, pero desconfío de crear conversiones implícitas a partir de un decimal en caso de que confundan más a las personas.
¿Alguna sugerencia de cómo implementar esta clase? o razones convincentes para no hacerlo.
Aprecio que la lógica debe ser proporcionada por otras clases. Pero en mi opinión todavía tiene mucho valor tener una clase de porcentaje que usa un método de ToString predeterminado que da una cadena de porcentaje atractiva. Especialmente porque esto necesita mostrarse en múltiples capas de presentación. (Una mezcla de Asp.Net, Winforms e informes en pdf). –
ToString(), como se hace en otras clases .NET, puede delegar todo el trabajo al IFormatProvider y ICustomFormatter. Consulte DateTime.ToString para ver un ejemplo. –
Por supuesto, las personas que siempre escriben un código perfecto nunca tienen que preocuparse por cuestiones tales como la expresividad semántica. Nunca volverán a mirar su código perfecto preguntándose qué demonios está pasando. - Si desea un motivo más específico, un tipo para Porcentaje podría ser extremadamente útil, siempre que lo haga una clase que encapsule un número decimal entre 0 y 1 inclusive. Esto se aplica muy bien a las aplicaciones de probabilidad.Usaría este tipo cada vez que tuviera que modelar un número en un rango delimitado, como la salida de un control deslizante en la interfaz de usuario o ponderaciones en una red neuronal. –