Edwin de Koning Edwin de Koning - 1 month ago 6x
C# Question

Using Int32.ToString() without Format and IFormatProvider. Why do I get the CA1305 warning?

I have been wondering about this one for quite some time, but I cannot seem to find a definitive answer. Whenever I convert an integer to a string using the

method, and I run a code analysis, I get the following warning:

CA1305: Microsoft.Globalization : Because the
behavior of 'int.ToString()' could
vary based on the current user's
locale settings, replace this call in
'Class.Method()' with a call to
If the result of 'int.ToString(
IFormatProvider)' will be displayed to
the user, specify
'CultureInfo.CurrentCulture' as the
'IFormatProvider' parameter.
Otherwise, if the result will be
stored and accessed by software, such
as when it is persisted to disk or to
a database, specify

This is the very well-known generic CA1305 warning, which gets shown whenever you make a call to a method that has an overload that accepts an
parameter. While this is a very rightly warning in almost all cases, I can't think of anything that could go wrong when calling the default
without any format or formatprovider on an integer. So please, if anyone knows of anything that could go wrong, enlighten me. I'm guessing there must be a good reason for the

By the way, I do always make the call using the
overload, because it also seems to have a performance benefit. If anyone has any insightful comments on this, feel free to share them as well.


There are things which I would imagine could easily affect the result:

  • Whether digits are substituted (not sure if this affects ToString)
  • Whether digits are grouped (not sure if NumberFormatInfo will ever group digits in an integer just from this sort of ToString call)
  • The negative sign (this could easily be significant)

Short but complete example of how it could affect things, using the NegativeSign property:

using System;
using System.Globalization;
using System.Threading;

class Test
    static void Main()
        int x = -10;

        CultureInfo culture = Thread.CurrentThread.CurrentCulture;
        // Make a writable clone
        culture = (CultureInfo) culture.Clone();
        culture.NumberFormat.NegativeSign = "!!!";

        Thread.CurrentThread.CurrentCulture = culture;