Formato de números como cadenas con comas en lugar de decimales

Tengo el siguiente número: 4.3

Me gustaría mostrar este número como 4,3 para algunos de nuestros amigos europeos.

Tenía la impresión de que la siguiente línea haría el truco:

 string ret = string.Format("{0:0,0}", 4.3); // returns "04", not "4,3" 

¿Estoy usando la cadena incorrecta?

Yo creo que:

 string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE"), "{0:0.0}", 4.3); 

deberías hacer lo que quieras

 NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberDecimalSeparator = ","; nfi.NumberGroupSeparator = "."; double num = 4.3; string ret = num.ToString(nfi); // 4,3 

Esto depende de lo que quieras hacer. Si desea que su aplicación completa esté lista para algún otro idioma, solo use

 System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo ("de-DE"); 

Si desea tener una aplicación de lenguaje mixto (eso significa que algunas de las salidas están formateadas en un idioma y otras en otra), tiene que usar las sobrecargas de las funciones específicas de String como:

 var culture = System.Globalization.CultureInfo.GetCultureInfo("de-DE"); String.Format (culture, "{0:0.0}", 4.3); 

Se prefiere el primer método si es posible porque solo necesita una línea en su aplicación y todo será como se esperaba. En el segundo, debe agregar el parámetro de cultura a cada método de salida String en toda su aplicación.

Para una solución más general, puede establecer la cultura de la interfaz de usuario del hilo en la cultura utilizada por sus amigos europeos. Esto afectará la presentación de números, moneda, fechas, etc.

El formato del número de forma predeterminada utiliza NumberFormatInfo de CultureInfo actual, de modo que se muestra con la configuración regional en la computadora.

Por lo tanto, realmente no necesita hacer nada especial al respecto, excepto tal vez asegurarse de que se esté utilizando el CultureInfo correcto.

En cuanto a la pregunta, sí, la cadena no es válida. Un “,” denota un separador de miles, no el separador decimal. Eche un vistazo a NumberFormatInfo y a los formatos de números personalizados .

Use un CultureInfo que tenga comas en lugar de un punto decimal (francés, por ejemplo):

 string.Format(CultureInfo.GetCultureInfo("fr-FR"), "{0:0.0}", 4.3); 

Sí, está utilizando la cadena incorrecta y el problema no se puede resolver al proporcionar solo una cadena de formato.

Lo que hace su cadena de formato es formatear el número usando el patrón "0" , luego alineado con la longitud 0 .

Cuando especifica el separador decimal en una cadena de formato, siempre es un período independientemente de la cultura actual. El separador decimal en el resultado del formato, por otro lado, es siempre el utilizado por la cultura actual. Por lo tanto, para obtener una coma como separador decimal en el resultado, debe asegurarse de que la cultura utilizada para el formato sea una que use una coma como separador decimal.

Puede establecer la cultura actual para el hilo para que se use de forma predeterminada por el formato, o especificar una cultura en la llamada:

 string ret = String.Format(CultureInfo.GetCultureInfo(1053), "{0:0.0}", 4.3); 

Configuraciones de la cultura de hilo hará esta conversión automáticamente. Sin embargo, si desea formatear esto con una cadena personalizada, puede hacer lo siguiente:

 string ret = string.Format("{0:0.00}", 4.3); 

o

 string ret = (4.3f).ToString("0.00"); 

Los “.” es el especificador de formato para el punto decimal para la cultura actual. Puede encontrar más información sobre los formatos de números personalizados en: http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

Siempre puedes verificar qué carácter para el punto decimal es con:

 string decimalChar = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator; 

El marco puede manejar el formato del número si utiliza la referencia cultural correcta cuando manipula el número.

 Console.WriteLine(4.3); Console.WriteLine(4.3.ToString(CultureInfo.GetCultureInfo("fr-fr"))); Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr"); Console.WriteLine(4.3); 

Si desea hacer una visualización “única”, el segundo enfoque funcionará. Si desea mostrar todos los números correctamente, realmente debería configurar la cultura del hilo actual . De esa manera, cualquier manipulación de números manejará correctamente los separadores decimales, agrupar caracteres y cualquier otra cosa específica de la cultura.

Lo mismo ocurre con los números de análisis. Si un usuario ingresa 1,234 , ¿cómo sabe si ingresó 1.234 (la coma es el separador decimal) o 1234 (la coma es un separador de agrupación)? Aquí es donde la cultura ayuda, ya que sabe cómo mostrar los números y también se puede usar para analizarlos correctamente:

 Console.WriteLine(double.Parse("1,234")); Console.WriteLine(double.Parse("1,234", CultureInfo.GetCultureInfo("fr-fr"))); Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr"); Console.WriteLine(double.Parse("1,234")); 

Lo anterior generará 1234 (la coma es un separador decimal en mi cultura predeterminada en-us), 1.234 (la coma es un separador decimal en francés) y 1,234 (nuevamente, la coma es un separador decimal en francés, y también el hilo la cultura se establece en francés, por lo que se muestra utilizando esta cultura (de ahí la coma como separador decimal en la salida).