2009-07-10 10 views
5

Quería dar salida a un número entero con números romanos y me encontré con this respuesta de Jesse Slicer. Es un método de extensión, pero me preguntaba acerca de tomar ventaja de ToString(string, IFormatProvider) hacer algo comoFormatProvider vs. método de extensión contra la nueva clase

int a = 10; 
string b = a.ToString("RN", provider); 
// OR 
string c = string.Format(provider, "{0:RN} blah foo", a); 

en lugar de

int a = 10; 
string b = a.ParseRomanNumeral(); 
// OR 
string c = string.Format("{0} blah foo", a.ParseRomanNumeral()); 

nunca he escrito un proveedor de formato así que no estoy seguro de la trabajo involucrado, pero esta es mi pregunta. Para algunos de conversión de formato bien definido como números romanos, habría que utilizar:

  • un proveedor de formato
  • usar un método de extensión
  • escribir una clase RomanNumeral que implementa Parse, TryParse, y ToString
  • algo más

y por qué?

¿El uso de string.Format() y cualquiera de sus métodos primos (por ejemplo, StringBuilder.AppendFormat()) afecta su respuesta? Obviamente, con los métodos de extensión no puede acceder a la conversión utilizando uno de estos métodos de formato.

Creo que una clase personalizada para implementar toda la gama sería más prudente pero también consumiría más tiempo. Ir con el proveedor de formato personalizado parece que se pondría al borde de algunas cosas de globalización existentes (si tiene alguna).

Respuesta

0

Supongo que depende de cómo va a utilizar esta funcionalidad.

IMO, método de extensión es un buen camino a seguir. No estoy seguro de cómo los usuarios de su ensamblado que trabajan con C# 1 o 2 (idioma sin soporte de los métodos de extensión) lo verán.

Los métodos de extensión en ambos sentidos serán buenos.
es decir en tipos numéricos - para convertir de número a romano y
en cadena - para convertir de romano a número (tendrá que considerar un tipo numérico que debe acomodar el valor máximo).

+0

Los métodos de extensión anulan la capacidad de utilizar String.Format, ¿correcto? –

+0

No realmente. Pero, ¿cómo funcionará el formato al convertir de cadena a números romanos en términos de código? – shahkalpesh

+0

String.Format no sería para la conversión de cadena a número (no puede). Es por eso que creo que una clase RomanNumeral cubre todos los usos de la manera más elegante. –

1

Los proveedores de formatos funcionan bien para sus propios tipos, pero son torpes al usar tipos incorporados porque debe crear una instancia del proveedor y pasarla al método de Formato, lo que elimina la ventaja del especificador de formato. Es mucho más conveniente usar un método de extensión directamente en el int.

1

Personalmente, escribo una clase de números romanos, con tryparse, parse + tostring(), con métodos de extensión para sustentarlos, por una combinación de todos los motivos anteriores (incluido su último comentario a la respuesta de shahkalpesh)

Cuestiones relacionadas