Pregunta

¿Cuál es la mejor manera de analizar un flotador en CSharp? Sé sobre TryParse, pero lo que más me pregunto son puntos, comas, etc.

Tengo problemas con mi sitio web. En mi servidor dev, el ',' es para decimales, el '.' para separador En el servidor prod, sin embargo, es al revés. ¿Cómo puedo capturar esto mejor?

¿Fue útil?

Solución

Depende de dónde provenga la entrada.

Si sus comentarios provienen del usuario, debe utilizar la información de cultura que usa el usuario / página ( Thread.CurrentThread.CurrentUICulture ).

Puede obtener una indicación de la cultura del usuario, mirando el propiedad HttpRequest.UserLanguages ??. (No es correcto al 100%, pero creo que es una buena primera aproximación) Con esa información, puede configurar 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 lanza una excepción (lenta) si falla.

Si la entrada no está controlada (del usuario u otra fuente de Internet), el TryParse me parece mejor.

Otros consejos

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);

Siempre puede usar la sobrecarga de Parse que incluye el cultura a utilizar?

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 tu código.

Si desea valores persistentes (números, fecha, hora, etc.) para fines internos. Siempre use " InvariantCulture " para formatear & amp; análisis de valores. " Cultura Invariante " es igual en todas las computadoras, todos los sistemas operativos 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);

Use una cultura neutral (o una que sepa) al analizar con Try / Parse.

Pase un CultureInfo o NumberFormatInfo que representa la cultura en la que desea analizar el flotador como ; esto controla qué caracteres se usan para decimales, separadores de grupo, etc.

Por ejemplo, para asegurarse de que el '.' el carácter se trató como el indicador decimal que podría pasar en CultureInfo.InvariantCulture (este suele ser muy útil en aplicaciones de servidor donde tiende a querer que las cosas sean iguales independientemente de la cultura del entorno).

Intente evitar float.Parse, use TryParse en su lugar ya que se desempeña 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 se desempeña aún mejor)

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ó antes. Pero no puedo entender cómo darle la cultura actual.

Además, esto me daría la cultura del servidor en el que se está ejecutando actualmente, pero como es de Internet, el usuario puede ser desde cualquier lugar ...

puede conocer Cuklture actual de su servidor con una simple declaración:

System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;

Tenga en cuenta que existe una propiedad CurrentUICulture, pero UICulture se utiliza desde las aplicaciones multilenguaje de ResourceMeanager. para el formateo de números, debes considerar CurrentCulture.

Espero que esto te ayude

Como no conoces la cultura del usuario de la web, puedes hacer algunas conjeturas. TryParse con una cultura que utiliza, para separadores y. Para decimal, AND TryParse con una cultura que usa. para separadores y, para decimal. Si ambos tienen éxito pero dan diferentes respuestas, entonces tendrá que preguntar al usuario cuál fue su intención. De lo contrario, puede proceder normalmente, dados sus dos resultados iguales o un resultado utilizable o ningún resultado utilizable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top