2011-06-04 16 views
15

Quiero convertir un valor numérico a una cadena, mostrando los dígitos específicos de la cultura. Por ejemplo, el idioma dari utilizado en Afganistán (nombre cultural "prs-AF") usa Eastern-Arabic numerals en lugar del Arabic numerals utilizado en la mayoría de las culturas occidentales (0,1,2,3,4,5,6,7,8,9).¿Cómo puedo mostrar los dígitos nativos específicos de la cultura en lugar de los números arábigos?

Al examinar la clase CultureInfo integrado en el marco, que enumera los dígitos correctos nativos (captura de pantalla tomadas de la producción en LINQPad):

linqpad output

CultureInfo.CreateSpecificCulture("prs-AF").NumberFormat.NativeDigits 

Sin embargo, cuando se trata de convertir un número de una cadena para que aparezca en esa cultura, no estoy recibiendo los dígitos nativos:

linqpad output

var number = 123.5; 
var culture = CultureInfo.CreateSpecificCulture("prs-AF"); 
Thread.CurrentThread.CurrentUICulture = culture; 
Thread.CurrentThread.CurrentCulture = culture; 
var text = number.ToString(culture); 
Console.WriteLine(text); 

¿Alguien me puede decir cómo mostrar los dígitos nativos?

+1

¿Usted ha visto este post: http://stackoverflow.com/questions/3055195/string-format-not-converting-integers -correctamente en árabe/4781769 # 4781769? –

+0

'Thread.CurrentThread.CurrentCulture = New CultureInfo (" prs-AF ");' ?? –

+0

@Paul - Intenté usar la respuesta sugerida en esa publicación, pero no funcionó. Si miras mi captura de pantalla de arriba, puedes ver que el 'DigitSubstitution' por defecto para la cultura" prs-AF "es' NativeNational'. –

Respuesta

11

Sustitución de dígitos es algo que ocurre cuando se muestra texto que contiene dígitos.

No se supone que cambie la representación de cadena de un número, como ha visto.

El número 123.5 está formateado como la cadena 123.5 sin importar la sustitución de dígitos. Sin embargo, muestra con los glifos apropiados si Thread.CurrentThread.CurrentCulture se establece en consecuencia y si el motor de presentación admite la sustitución de dígitos. (WPF no soporta)

+0

+1 y verde-marcado. Configurar Thread.CurrentThread.CurrentCulture hace que la sustitución de dígitos funcione. Y aunque WPF lo admite, GDI + no, por lo que no se mostró correctamente en LINQPad (ver las capturas de pantalla en la pregunta). –

+0

+1 Gran respuesta. No sabía que hay una localización incluso en cadenas justo antes de que se muestren. – oleschri

2

Miré NativeDigits propety y el campo subyacente en Reflector y no parece ser utilizado por nada cuando se trata de formatear (aunque el análisis Used by en Reflector no se garantiza que esté 100% lleno). Entonces, es posible que estos valores estén allí solo como referencia o algo así.

Puede usar su propia implementación IFormatProvider utilizando la salida de cadena de ToString(culture) y reemplazando manualmente todos los dígitos por los valores correspondientes de la matriz NativeDigits. Aunque me temo que no es la respuesta que estaba buscando ...

+3

También usé Reflector y descubrí que el formateo tiene lugar en el método FormatDouble de la clase System.Number interna. Este método está marcado con 'extern', por eso Reflector no pudo analizar su implementación. – StanislawSwierc

1

Tal vez lo que necesita es la siguiente:

var number = 123.5; 
var culture = CultureInfo.CreateSpecificCulture("prs-AF"); 
var text = String.Format(culture, "{0}", number); 
Console.WriteLine(text); 
+0

Seis años después, esto solo escribe "123,5", que es el mismo problema que el OP intentaba solucionar. La pregunta es cómo escribir esto en los dígitos nativos. –

Cuestiones relacionadas