c# - convertir - ¿La mejor forma de analizar float?
convertir string a float c# (10)
¿Cuál es la mejor forma de analizar una carroza en CSharp? Sé acerca de TryParse, pero lo que más me pregunto es sobre puntos, comas, etc.
Estoy teniendo problemas con mi sitio web. En mi servidor de desarrollo, el '','' es para decimales, el ''.'' para separador En el servidor de prod, sin embargo, es al revés. ¿Cómo puedo capturar esto mejor?
Como no conoce la cultura del usuario de la web, puede hacer algunas conjeturas. TryParse con una cultura que utiliza, para separadores y. para decimal, Y TryParse con una cultura que usa. para separadores y, para decimal. Si ambos tienen éxito pero dan respuestas diferentes, entonces tendrá que preguntarle al usuario cuál fue su intención. De lo contrario, puede continuar normalmente, dados sus dos resultados iguales o un resultado utilizable o sin resultado utilizable.
Depende de dónde proviene la entrada.
Si su entrada proviene del usuario, debe usar CultureInfo que el usuario / página está usando ( Thread.CurrentThread.CurrentUICulture ).
Puede obtener una indicación de la cultura del usuario mirando la propiedad HttpRequest.UserLanguages . (No es correcto al 100%, pero creo que es una muy buena primera suposición) Con esa información, puede establecer Thread.CurrentThread.CurrentUICulture al comienzo de la página.
Si su entrada proviene de una fuente interna, puede usar InvariantCulture para analizar la cadena.
El método Parse es algo más fácil de usar, si su entrada proviene de una fuente controlada. Es decir, ya ha validado la cadena. Parse arroja una excepción (lenta) si falla.
Si la entrada no está controlada, (desde el usuario u otra fuente de Internet) el TryParse ve mejor para mí.
Estoy de acuerdo con la respuesta de Leppie; para poner eso en términos de código:
string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);
La fuente es una entrada de un sitio web. No puedo confiar en que sea válido. Así que fui con TryParse como se mencionó anteriormente. Pero no puedo descifrar cómo darle la CurrentCulture.
Además, esto me daría la cultura del servidor en el que se está ejecutando actualmente, pero dado que es la red mundial, el usuario puede ser de cualquier lugar ...
Pase un CultureInfo o NumberFormatInfo que represente la cultura que desea analizar como flotante; esto controla qué caracteres se usan para decimales, separadores de grupo, etc.
Por ejemplo, para garantizar que el ''.'' el carácter se trató como el indicador decimal que se puede pasar en CultureInfo.InvariantCulture (este suele ser muy útil en aplicaciones de servidor donde se tiende a querer que las cosas sean las mismas independientemente de la cultura del entorno).
Si desea valores persistentes (números, fecha, hora, etc.) para fines internos. Siempre use "InvariantCulture" para formatear y analizar valores. "InvariantCulture" es el mismo en cada computadora, en cada sistema operativo con la cultura / idioma / etc de cualquier usuario ...
string strFloat = (15.789f).ToString( System.Globalization.CultureInfo.InvariantInfo );
float numFloat = float.Parse( System.Globalization.CultureInfo.InvariantInfo, strFloat );
string strNow = DateTime.Now.ToString( System.Globalization.CultureInfo.InvariantInfo );
DateTime now = DateTime.Parse( System.Globalization.CultureInfo.InvariantInfo, strNow );
Trate de evitar float.Parse, use TryParse en cambio, ya que funciona mucho mejor, pero hace el mismo trabajo. esto también se aplica al doble, DateTime, etc ...
(algunos tipos también ofrecen TryParseExact que también funciona aún mejor)
Use una cultura neutral (o una que conozca) al analizar con Try / Parse.
siempre puedes usar la sobrecarga de Parse que incluye la cultura para usar?
por ejemplo:
Double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting
Si tiene control sobre todos sus datos, debe usar "CultureInfo.InvariantCulture" en todo su código.
usted puede conocer la Cuklture actual de su servidor con una simple declaración:
System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;
Tenga en cuenta que hay una propiedad Id. De CurrentUICulture, pero UICulture se utiliza desde las aplicaciones de varios idiomas de ResourceMeanager. para formatear el número, debe considerar CurrentCulture.
Espero que esto ayude