¿Cómo puedo convertir los dígitos ingleses a dígitos árabes?

Tengo este código C # por ejemplo

DateTime.Now.ToString("MMMM dd, yyyy"); 

Ahora el hilo actual está cargando la cultura árabe. Entonces el resultado es como esto

 ???? 19, 2010 

Pero no quiero que el ‘2010’ y el ’19’ estén en inglés (también conocidos como dígitos latinos o árabes del oeste ) – Quiero números arábigos orientales como “2”.

Lo intenté

 DateTime.Now.ToString("MMMM dd, yyyy", CultureInfo.GetCultureInfo("ar-lb")); 

dio el mismo resultado. Entonces, ¿alguna idea?

Tu esta solución (solo haz una lista de todas las culturas en las que quieras usar estos números en la matriz de cadenas):

 private static class ArabicNumeralHelper { public static string ConvertNumerals(this string input) { if (new string[] { "ar-lb", "ar-SA" } .Contains(Thread.CurrentThread.CurrentCulture.Name)) { return input.Replace('0', '\u06f0') .Replace('1', '\u06f1') .Replace('2', '\u06f2') .Replace('3', '\u06f3') .Replace('4', '\u06f4') .Replace('5', '\u06f5') .Replace('6', '\u06f6') .Replace('7', '\u06f7') .Replace('8', '\u06f8') .Replace('9', '\u06f9'); } else return input; } } 

A continuación, utilice el método, para todas las strings que desee tener ‘números arábigos centrales’, de esta manera:

 DateTime.Now.ToString().ConvertNumerals(); 

Como prueba rápida, escribí esto para enumerar todos los cortes que no tienen “2010” en el año:

  foreach (var ci in from c in CultureInfo.GetCultures(CultureTypes.AllCultures) where !c.IsNeutralCulture let date = DateTime.Now.ToString("MMMM dd, yyyy", c) where !date.Contains("2010") orderby c.Name select new {c.Name, date}) { Console.WriteLine("{0} : {1}", ci.Name, ci.date); } 

los resultados son:

 ar-SA : ربيع الأول 05, 1431 dv-MV : ربيع الأول 06, 1431 prs-AF : ربيع الأول 06, 1431 ps-AF : ربيع الأول 06, 1431 th-TH : กุมภาพันธ์ 19, 2553 

Para convertir los números al texto árabe, parece que este proyecto “NumToArabicString” lo hará. Sin embargo, no parece que haya nada incorporado en el framework .net.

La única solución es convertir manualmente los dígitos.

Podría utilizar la matriz CurrentCulture.NumberFormat.NativeDigits lugar de proporcionar explícitamente los caracteres Unicode para admitir otros idiomas además de los dígitos árabe-indic, pero en cuanto al soporte integrado por clases relacionadas con la cultura, como DateTime , parece no haberse implementado o algo así .

Prueba esto:

 public static string ToIndicDigits(this string input) { return input.Replace('0', '\u0660') .Replace('1', '\u0661') .Replace('2', '\u0662') .Replace('3', '\u0663') .Replace('4', '\u0664') .Replace('5', '\u0665') .Replace('6', '\u0666') .Replace('7', '\u0667') .Replace('8', '\u0668') .Replace('9', '\u0669'); } } 

Puede usar la clase Windows.Globalization.NumberFormatting.NumeralSystemTranslator para traducir entre el latín y cualquiera de los sistemas numerales admitidos. Para traducir al árabe, establezca la propiedad NumeralSystem en "Arab" , luego puede llamar al método TranslateNumerals .

Alternativamente, puede usar la clase Windows.Globalization.DateTimeFormatting.DateTimeFormatter directamente.

Usamos números arábigos en inglés. Como tal, lo que está viendo es el comportamiento correcto, y el único posible.