2008-09-29 11 views
34

¿Cuál es la mejor forma de analizar un flotador en CSharp? Sé acerca de TryParse, pero lo que me pregunto particularmente es sobre puntos, comas, etc.¿La mejor manera de analizar el flotador?

Tengo 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?

+1

Dispuesto a eso, ya que parece que todo el mundo lo está haciendo. Personalmente trato de mantenerme alejado de los <3 términos de búsqueda. Creo que es algo que me atrapó desde tiempos pasados ​​cuando todas las búsquedas tenían que ser> 3 caracteres. También el signo # hace que mis sentimientos de araña hormigueen. –

Respuesta

23

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 e indicar 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 configurar el Thread.CurrentThread.CurrentUICulture al comienzo de la página.

Si su entrada proviene de una fuente interna, puede usar el InvariantCulture para analizar la cadena.

El método Parse es algo más fácil de usar, si su entrada es desde 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 me queda mejor.

3

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

5

Si desea conservar los valores (números, fecha, hora, etc.) para fines internos. Cada vez use "InvariantCulture" para formatear & valores de análisis. "InvariantCulture" es la misma en todos los equipos, 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); 
+0

cierto, pero en realidad no está relacionado con la pregunta. –

1

Pass en un CultureInfo o NumberFormatInfo que representa la cultura que desea analizar el flotador como; 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).

41

Estoy de acuerdo con la respuesta de Leppie; Para poner esto en términos de código:

string s = "123,456.789"; 
float f = float.Parse(s, CultureInfo.InvariantCulture); 
5

siempre se puede utilizar la sobrecarga de Parse que incluye la cultura de usar?

por ejemplo:

Double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting 

Si usted tiene control sobre todos sus datos, debe utilizar "CultureInfo.InvariantCulture" en todo su código.

0

Trate de evitar la flotación. En su lugar, utilice TryParse, ya que funciona mucho mejor pero realiza el mismo trabajo. esto también se aplica al doble, DateTime, etc ...

(algunos tipos también ofrecen TryParseExact la cual también hace aún mejor!)

+1

¿TryParse realmente funciona más rápido incluso cuando todos los datos son válidos? Esperaría que tuvieran el mismo rendimiento en el caso de "éxito", pero por no ser más rápido con TryParse que con Parse debido al costo de lanzar excepciones. –

+0

Y, una vez más, ¿qué pasa si TryParse devuelve falso? ¿Vas a lanzar una excepción? En ese caso, float.Parse es más eficiente que TryParse. – Sklivvz

+0

si las cadenas que analiza son en su mayoría flotantes válidas, tryparse es definitivamente más rápido. si tiene muchas cadenas diferentes, tal vez el análisis es la mejor opción, pero cuando obtiene muchas cadenas (docenas de miles) que son todas (en el 99% de los casos) flotantes válidos en la representación de cadenas, use tryparse. –

0

La fuente es una entrada desde un sitio web. No puedo confiar en que sea válido. Así que fui con TryParse como se mencionó anteriormente. Pero no puedo entender cómo darle la CurrentCulture.

Además, esto me da la cultura del servidor que está ejecutando actualmente en, pero ya que es la World Wide Web, el usuario puede ser de cualquier parte ...

-1

Dado que usted no sabe la web del usuario de cultura, puedes 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.

+0

Si va a marcar la respuesta aceptada, al menos explique por qué marcándolo ... –

+0

Esta respuesta fue marcada antes de ser aceptada. En realidad, estoy un poco sorprendido de que esto haya sido aceptado, ya que alguien más sugirió mirar la propiedad HttpRequest.UserLanguages. Creo que mi respuesta debería estar en el segundo lugar. –

+0

Oh, ahora ha sido marcado por segunda vez después de ser aceptado. Estoy de acuerdo con esa sugerencia ahora, quien lo marcó después de la aceptación debería al menos explicar por qué. –

0

se puede saber 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 CurrentUICulture, pero UICulture se utiliza de forma ResourceMeanager aplicaciones multilanguages. para formatear el número, debe considerar CurrentCulture.

Espero que esto te ayude

Cuestiones relacionadas