2012-08-28 11 views
8

Al haber creado un tipo de número propio (en realidad DoubleDouble), deseo implementar la interfaz IFormattable. Así que de alguna manera debo analizar la cadena de formato.Soportar ToString (formato de cadena) con tipo de número personalizado

public string ToString(string format, IFormatProvider formatProvider) { 
    // formatting string according to format and using formatprovider? 
    return formattedString; 
} 

El usuario de la clase debe ser capaz de utilizarlo como un reemplazo para double (o cualquier otro formato de número).

String.Format("{0:0.##}", (DoubleDouble)123.4567); 

Mi pregunta es, ¿alguien sabe un buen tutorial sobre esto o puede darme algunas pistas? ¿Cómo apoyar la localización en este proceso?

Cómo analizar la cadena de formato? ¿Existen algunos métodos para ayudar en esta tarea o tengo que hacerlo todo "a mano" con regexp y tal?

Realmente busqué ayuda pero no pude encontrar ninguna, si encuentra algo en otro idioma (C, C++) que pueda ayudar, por favor hábleme al respecto.

+1

Comenzaría con cadenas estándar antes de pasar a la variedad personalizada. ¿Qué pasa con la localización? http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx – Jodrell

+0

Lo encontré bastante útil - http://codebetter.com/davidhayden/2006/03/12/open-closed-principle-iformattable- iformatprovider-icustomformatter/ –

+0

Ya tengo un método ToString que devuelve una notación científica. El problema que estoy enfrentando es cómo analizar una cadena de formato y devolver un número correspondiente. El enlace dado solo usa modificadores muy básicos. –

Respuesta

0

¿Cómo apoyar la localización en este proceso?

algo como lo siguiente:

public string ToString(string format, IFormatProvider formatProvider) 
{ 
    CultureInfo culture = formatProvider as CultureInfo; 
    if (culture != null) 
    { 
    // Now you can do things like 
    // culture.NumberFormat.NumberDecimalSeparator, etc. 
    } 
} 

Cómo analizar la cadena de formato? ¿Hay algunos métodos para ayudar en esta tarea o tengo que hacerlo todo "a mano" con regexp y tal?

No existe una API pública en .NET Framework que lo haga por usted. Si nos fijamos en el source para la implementación de tipos numéricos primitivos de .NET de IFormattable, todos ellos eventualmente llaman a métodos externos, por lo que no proporcionan información. Probablemente necesites usar algo como RegEx para analizar la cadena de formato. Luego puede dividir por la mayor potencia de 10 para averiguar cuál será el primer dígito de la salida, restarlo, luego repetir para las potencias menores de 10 hasta que haya generado todos los dígitos.

0

Tal vez esto le puede ayudar:

var my = DoFormat(123.0) 

public static string DoFormat(double myNumber) 
{ 

    var s = string.Format("{0:0.00}", myNumber); 

    if (s.EndsWith("00")) 
    { 
     return ((int)myNumber).ToString(); 
    } 
    else 
    { 
     return s; 
    } 
} 
1

MSDN tiene una nice example de una clase Temperature que implementa la interfaz IFormattable con su propio formato personalizado.

Creo que ya lo sabes; de todos modos, hoy he aprendido que si la clase DoubleDouble implementa la interfaz IFormattable a continuación:

String.Format("{0:0.##}", (DoubleDouble)123.4567); 

... llamaría a la implementación de la clase DoubleDoubleToString(...) con el formato específico "0.##" como primer parámetro, que sospecho es cercano a lo usted quiere. Sin embargo, todavía tiene que analizar esa parte del formato.

Me atrevo a adivinar que gran parte del análisis de formato está incrustado profundamente en los binarios de la biblioteca .Net altamente optimizados, por lo que no obtendrá ningún método virtual de análisis personalizado para ayudar.

+0

Ok, me acabo de dar cuenta de que el comentario de Nate a la pregunta anterior ya tiene enlaces a un gran tutorial. Mi último párrafo es lo único nuevo aquí. – wardies

0

Había escrito una función de formato de número de JavaScript hace unos años que imitaba la mayor parte de la manera .NET de analizar cadenas de formato. Puede serle de ayuda escribir una versión de C#. Por lo menos, puede darte un punto de partida.

https://github.com/flamewave/jquery-ui-numeric/blob/master/jquery-ui-numeric.js

Vaya todo el camino hasta la parte inferior de la función $ .formatNumber.

Nota: Ya no mantengo esta función a favor del uso de la biblioteca Globalize, que también puede darle una idea de cómo analizar cadenas de formato.

Cuestiones relacionadas