Es Int32.toString () ¿específico de la cultura?


Estoy ejecutando una versión beta de ReSharper, y me está dando advertencias para el siguiente código:

int id;
// ...
DoSomethingWith(id.ToString());

La advertencia está en la llamada id.ToString(), y me dice "Especifique una cultura en la conversión de cadenas explícitamente". Entiendo la advertencia, y sé cómo arreglarla just simplemente cambie el código a la id.ToString(CultureInfo.InvariantCulture) mucho más difícil de manejar.

Pero mi pregunta es: ¿ es eso necesario? Quiero decir, obviamente es importante especificar la cultura cuando estás usando tipos como DateTime (diferentes culturas tienen diferentes formatos de fecha) y Double (diferentes caracteres utilizados para el punto decimal). Pero Int32.ToString(), al menos en las culturas en-US e invariant, no agrega ningún formato en absoluto. Sin comas, sin decimales, sin signos de dólar, nada. Entonces, ¿qué habría que variar según la cultura?

¿Hay algunas culturas que en realidad agregan algún tipo de formato cuando llamas a Int32.ToString() sin parámetros? O es esto un error en la versión beta de ReSharper, y esta advertencia realmente no es aplicable a Int32 (en cuyo caso voy a presentar un informe de error ReSharper)?

Author: Kiley Naro, 2011-12-13

6 answers

El Sistema Operativo permite cambiar el signo negativo para los números.

Control panel -> 
   Language and regional settings -> 
         Additional settings -> 
             Negative sign

Entonces, la cultura actual podría haber anulado el signo negativo. En este caso, debe respetar la configuración regional, esta es la razón de la advertencia. También puede cambiar el signo negativo programáticamente:

    CultureInfo culture = Thread.CurrentThread.CurrentCulture;
    // Make a writable clone
    culture = (CultureInfo) culture.Clone();
    culture.NumberFormat.NegativeSign = "!";
 58
Author: Daniel Peñalba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-13 16:31:44

Según lo probado en una muestra aleatoria de ints, los 352 cultivos instalados con Windows (CultureTypes.InstalledWin32Cultures) dan resultados idénticos.

Daniel tiene razón al notar que una cultura personalizada podría usar un prefijo diferente para los números negativos, pero dudo que alguien haya usado esta característica excepto por accidente.

Supongo que los desarrolladores de.NET lo hicieron para ser consistentes con float y otros tipos. ¿Qué más esperaban?

> int.MaxValue.ToString(CultureInfo.AncientRome)
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM....
 19
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-27 20:16:34

Sí. Depende de la cultura actual. De la MSDN docs :

El valor devuelto se formatea con el especificador de formato numérico general ("G") y el objeto NumberFormatInfo para la cultura actual.

Énfasis mío

Resharper lo más probable es que quiera que sea explícito sobre qué cultura tiene la intención de usar. Dado que omitirlo se basa en el comportamiento que puede cambiar cuando se ejecuta en diferentes máquinas.

 3
Author: Jeff Mercado,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-13 16:23:27

Es raro; hubiera esperado 50.toString (CultureInfo.CreateSpecificCulture ("ar-AE")) para devolver" ٥٠", pero no lo hace.

Acabo de buscar esto, y el problema parece ser que NumberFormatInfo.DigitSubstitution no está realmente implementado

La propiedad DigitSubstitution está reservada para uso futuro. Actualmente, no se utiliza en operaciones de análisis o formateo para el objeto NumberFormatInfo actual.

Así que, aunque hay un Sistema de enumeración.Globalización.DigitShapes, en realidad no está implementado en el bit NumberFormatInfo de IFormatProvider.

 2
Author: Richard Gadsden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-22 10:30:32

Habría dicho que no, pero al comprobar MSDN Int32.toString() hay esto:

El valor devuelto se formatea con el especificador de formato numérico general ("G") y el objeto NumberFormatInfo para la cultura actual.

Así que hay una sorpresa.

La pregunta debería ser ¿por qué el Resharper actual no sugiere esto?

 0
Author: ChrisBD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-13 16:27:44

Porque los enteros pueden ser tan altos como 2,147,483,647.

En algunos países, usarían decimales o un espacio en lugar de las comas.

 -3
Author: devlord,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-02 20:56:05