2009-10-13 16 views

Respuesta

28

pienso:

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

debe hacer lo que quiera.

+3

también se ocupará de miles, que también se hacen diferentes. – dove

+3

Pero tiene la desventaja de que debe insertar manualmente la información de cultivo en TODOS los campos ToString, String.Format, Number.Parse y similar en su código. – Foxfire

+0

Ayuda para un caso específico, pero no permite especificar el punto decimal. –

2

El formato de número utiliza por defecto el NumberFormatInfo del CultureInfo actual, de modo que se muestre usando la configuración regional en la computadora.

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

En cuanto a la pregunta, sí, la cadena no es válida. Un "," denota un separador de mil, no el separador de decimales. Eche un vistazo al NumberFormatInfo y al custom number formats.

3

Para una solución más general, puede set the thread's UI culture a la cultura utilizada por sus amigos europeos. Esto afectará a la presentación de los números, moneda, fechas, etc.

1

Utilice un CultureInfo que tiene coma en lugar de punto decimal (por ejemplo francés):

string.Format(CultureInfo.GetCultureInfo("fr-FR"), "{0:0.0}", 4.3); 
30
NumberFormatInfo nfi = new NumberFormatInfo(); 
nfi.NumberDecimalSeparator = ","; 
nfi.NumberGroupSeparator = "."; 

double num = 4.3; 
string ret = num.ToString(nfi); // 4,3 
+1

@James: excepto que es bastante inútil ya que el soporte cultural está integrado en .NET. Es mejor hacer esto de una manera compatible en lugar de reinventarlo. –

+2

@Mats: ¿Y qué sucede si decides elegir un objeto europeo 'CultureInfo' arbitrario (por ejemplo," de-DE "o" fr-FR ") y esa cultura se ha personalizado para usar un separador decimal diferente? Sé que es un escenario poco probable, pero podría suceder. Al usar mi código, siempre obtendrá un ',' como separador decimal, independientemente de cualquier personalización. – LukeH

+0

Pero no desea obtener un ',' siempre, desea formatear cadenas de acuerdo con la configuración regional del usuario (incluida su configuración personalizada). – Groo

9

Esto depende de lo que quiere hacer. Si usted desea hacer su aplicación completa lista para alguna otra salida de la lengua sólo tiene que utilizar

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

Si usted quiere tener una aplicación de lenguaje mixto (que significa que algunos de los productos tienen el formato de un idioma otros de otra) que tiene utilizar las sobrecargas de las funciones de cadenas específicas 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, ya que sólo necesita una sola línea en su aplicación y todo va a ser como se esperaba. En el segundo, debe agregar el parámetro de cultivo a cada método de salida String en toda su aplicación.

+0

Esa es una gran respuesta. ¿Sabes si esto es configurable a través de un archivo de configuración? – Greg

+0

@Greg *** sección de globalización *** en ASP.NET, no en WinForms, aplicaciones de consola, creo. – Kiquenet

1

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

Lo que hace su cadena de formato es formatear el número usando el patrón "0", luego alineado a 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 formateo, 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 formateo es una que usa una coma como separador decimal.

Puede configurar la cultura actual para el hilo para que se utiliza 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); 
0

Configuración de la cultura hilo va a hacer esta conversión automáticamente. Sin embargo, si desea dar formato a 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"); 

El "" es el especificador de formato para el punto decimal para la cultura actual. Más información para los formatos de número personalizados se encuentran en: http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

Siempre se puede ver que el carácter de punto decimal es con:

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

número formateado puede ser manejado por usted por el marco, si se utiliza la correcta culture al manipular 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 "única vez", el segundo enfoque funcionará. Si desea mostrar cada número correctamente, realmente debería establecer el current thread's culture. De esta forma, cualquier manipulación de números manejará separadores decimales, agrupando caracteres y cualquier otra cosa cultural específica correctamente.

Lo mismo ocurre con los números de análisis. Si un usuario ingresa 1,234, ¿cómo sabe si ha ingresado 1.234 (la coma es el separador decimal) o 1234 (la coma es un separador de agrupación)? Aquí es donde la cultura ayuda a cabo, ya que sabe cómo mostrar los números y también puede ser utilizado para analizar 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")); 

La voluntad por encima de la salida 1234 (la coma es un separador decimal en mi es-cultura por defecto), 1.234 (la coma es un separador decimal en francés) y 1,234 (de nuevo, la coma es un separador decimal en francés, y también la cultura del hilo está configurada en francés, por lo que se muestra usando esta cultura; de ahí la coma como separador decimal en la salida).

Cuestiones relacionadas