Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In C# what is the difference between ToUpper() and ToUpperInvariant()?

In C#, what is the difference between ToUpper() and ToUpperInvariant()?

Can you give an example where the results might be different?

like image 526
Lill Lansey Avatar asked Aug 23 '10 17:08

Lill Lansey


2 Answers

ToUpper uses the current culture. ToUpperInvariant uses the invariant culture.

The canonical example is Turkey, where the upper case of "i" isn't "I".

Sample code showing the difference:

using System; using System.Drawing; using System.Globalization; using System.Threading; using System.Windows.Forms;  public class Test {     [STAThread]     static void Main()     {         string invariant = "iii".ToUpperInvariant();         CultureInfo turkey = new CultureInfo("tr-TR");         Thread.CurrentThread.CurrentCulture = turkey;         string cultured = "iii".ToUpper();          Font bigFont = new Font("Arial", 40);         Form f = new Form {             Controls = {                 new Label { Text = invariant, Location = new Point(20, 20),                             Font = bigFont, AutoSize = true},                 new Label { Text = cultured, Location = new Point(20, 100),                             Font = bigFont, AutoSize = true }             }         };                 Application.Run(f);     } } 

For more on Turkish, see this Turkey Test blog post.

I wouldn't be surprised to hear that there are various other capitalization issues around elided characters etc. This is just one example I know off the top of my head... partly because it bit me years ago in Java, where I was upper-casing a string and comparing it with "MAIL". That didn't work so well in Turkey...

like image 109
Jon Skeet Avatar answered Sep 19 '22 12:09

Jon Skeet


Jon's answer is perfect. I just wanted to add that ToUpperInvariant is the same as calling ToUpper(CultureInfo.InvariantCulture).

That makes Jon's example a little simpler:

using System; using System.Drawing; using System.Globalization; using System.Threading; using System.Windows.Forms;  public class Test {     [STAThread]     static void Main()     {         string invariant = "iii".ToUpper(CultureInfo.InvariantCulture);         string cultured = "iii".ToUpper(new CultureInfo("tr-TR"));          Application.Run(new Form {             Font = new Font("Times New Roman", 40),             Controls = {                  new Label { Text = invariant, Location = new Point(20, 20), AutoSize = true },                  new Label { Text = cultured, Location = new Point(20, 100), AutoSize = true },              }         });     } } 

I also used New Times Roman because it's a cooler font.

I also set the Form's Font property instead of the two Label controls because the Font property is inherited.

And I reduced a few other lines just because I like compact (example, not production) code.

I really had nothing better to do at the moment.

like image 27
Tergiver Avatar answered Sep 23 '22 12:09

Tergiver