.netcultureuiculture

What is the difference between Culture and UICulture?


Could someone give me a bit more information on the difference between Culture and UICulture within the .NET framework? What they do and when to use what?


Solution

  • Culture affects how culture-dependent data (dates, currencies, numbers and so on) is presented. Here are a few examples:

    var date = new DateTime(2000, 1, 2);
    var number = 12345.6789;
    
    Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
    Console.WriteLine(date); // 02.01.2000 00:00:00
    Console.WriteLine(number.ToString("C")); // 12.345,68 €
    
    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-CA");
    Console.WriteLine(date); // 2000-01-02 00:00:00
    Console.WriteLine(number.ToString("C")); // 12 345,68 $
    
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    Console.WriteLine(date); // 1/2/2000 12:00:00 AM
    Console.WriteLine(number.ToString("C")); // $12,345.68
    

    Culture also affects parsing of user input in the same way:

    const string numberString = "12.345,68";
    decimal money;
    
    Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
    money = decimal.Parse(numberString); // OK!
    
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    money = decimal.Parse(numberString); // FormatException is thrown, TryParse would return false
    

    Beware of cases where the parsing succeeds but the result is not what you would expect it to be.

    const string numberString = "12.345";
    decimal money;
    
    Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
    money = decimal.Parse(numberString); // 12345
    
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    money = decimal.Parse(numberString); // 12.345, where the . is a decimal point
    

    UICulture affects which resource file (Resources.lang.resx) is going to be loaded to by your application.

    So to load German resources (presumably localized text) you would set UICulture to the German culture and to display German formatting (without any impact on which resources are loaded) you would set Culture.