Saltar al contenido

String.Format vs ToString y usando InvariantCulture

Nuestro grupo especializado pasados varios días de investigación y de recopilar de datos, hemos dado con la solución, esperamos que te sea de utilidad para tu plan.

Solución:

En realidad prefiero una tercera forma:

Console.WriteLine("0:N", val / 1085);

Console.WriteLine puede hacer el String.Format para usted.

Console.WriteLine no le permite suministrar una cultura. Si eso es lo que quieres, aún tendrás que usar String.Format. Como en:

String.Format(CultureInfo.InvariantCulture, "0:N", 123456789);

No recomiendo usar eso porque los usuarios internacionales tendrán problemas para leerlo. A mi 123,456,789.00 se ve extraño

Para formato + cultura prefiero:

 .ToString("####0.00",CultureInfo.InvariantCulture)

o

.ToString("N",CultureInfo.InvariantCulture)

Encontré una forma invariable y genérica de resolver eso de la siguiente manera:

Sintaxis:

.ToStringInvariant(format)
.ToStringInvariant() 

Técnicamente, es un método de extensión genérico, definido de la siguiente manera:

public static class Extensions

    private static IFormatProvider inv 
                   = System.Globalization.CultureInfo.InvariantCulture.NumberFormat;

    public static string ToStringInvariant(this T obj, string format=null)
    
        return (format == null) ? System.FormattableString.Invariant($"obj") 
                                : String.Format(inv, $"0:format", obj);
    

El uso es simple, solo use .ToStringInvariant() en vez de .ToString(). La ventaja es que funciona para cualquier tipo de datos.

Opcionalmente, también puede pasar un formato, como por ejemplo .ToStringInvariant("N")tal y como estás acostumbrado con .ToString("N"). Tenga en cuenta que, en ese caso, el método de extensión usa String.Format internamente.

Puede ver la diferencia si tiene una cultura diferente para el formato de número, como en Alemania tenemos una coma en lugar de un punto decimal. Eso significa que en una PC con configuración cultural alemana:

void Main()

    var val = 2456.5;
    Console.WriteLine((val/1085).ToString("N"));
    Console.WriteLine((val/1085).ToStringInvariant("N"));
    Console.WriteLine((val/1085).ToStringInvariant("0.000"));
    Console.WriteLine((val/1085).ToStringInvariant());

saldría:

2,26

2.26
2.264
2.26405529953917

lo cual es correcto, porque .ToString utiliza la cultura actual (configuración alemana), y .ToStringInvariant siempre usa la referencia cultural invariable, que es el formato de número en inglés, independientemente de la configuración de Windows.

Nota: Para formato de fecha, He proporcionado un método de extensión diferente, que puede encontrar aquí.


Más información: Método FormattableString.Invariant(FormattableString)

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *