C# 文化信息

在本文中,我们展示了如何使用CultureInfo在C#中全球化应用程序。

全球化是设计应用程序的过程,它可以被全球用户使用(针对多种文化)。本地化是过程根据特定文化定制应用程序。

文化类型

中性文化是一种与语言相关但与国家或地区无关的文化。特定文化是与语言和国家或地区相关的文化。例如,fr是中立法国文化的名称,而fr-FR是法国法国文化的名称。

Invariantculture是文化不敏感的;它与英语有关(出于历史原因),但与任何国家/地区无关。我们通过在调用CultureInfo实例化方法时使用空字符串(“”)按名称指定不变文化。

CultureInfo.InvariantCulture还检索不变文化的实例。不变区域性用于以不依赖于任何语言或区域性的方式存储来自各种区域性的字符串。例如,我们可以在保留日期和时间时使用不变文化。

C#文化信息

CultureInfo提供有关特定文化的信息。这些信息包括文化名称、书写系统、使用的日历、字符串的排序顺序以及日期和数字的格式。

using System.Globalization;

CultureInfoSystem.Globalization命名空间的一部分。

C#当前文化

CultureInfo.DefaultThreadCurrentCulture属性获取或设置当前应用程序域中线程的默认文化。

using System.Globalization;

double val = 1235.56;

Console.WriteLine($"Current culture: {CultureInfo.CurrentCulture.Name}");
Console.WriteLine(val);

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");

Console.WriteLine($"Current culture: {CultureInfo.CurrentCulture.Name}");
Console.WriteLine(val);

该示例以两种文化打印一个值。

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");

我们将默认文化设置为de-DE

$ dotnet run
Current culture: en-US
1235.56
Current culture: de-DE
1235,56

这两个值有不同的小数分隔符。

C#列出文化

CultureInfo.GetCultures获取按指定文化类型参数过滤的支持文化列表。

using System.Globalization;

Console.OutputEncoding = System.Text.Encoding.UTF8;

Console.WriteLine("{0,-15}{0,-5}{0,-45}{0,-40}", "Culture", "ISO",
    "Display name", "English Name");

foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
    Console.Write("{0,-15}", ci.Name);
    Console.Write("{0,-5}", ci.TwoLetterISOLanguageName);
    Console.Write("{0,-45}", ci.DisplayName);
    Console.WriteLine("{0,-40}", ci.EnglishName);
}

该示例列出了所有已安装的.NET区域性。

Console.OutputEncoding = System.Text.Encoding.UTF8;

为了能够显示文化的各种显示名称,我们将输出编码设置为UTF8。此外,终端必须具有能够显示所有这些语言的字体。

使用CultureTypes.SpecificCultures过滤器参数,我们可以获得所有特定文化。使用CultureTypes.NeutralCultures,我们可以获得所有中性文化。

using System.Globalization;
using static System.Globalization.CultureTypes;

Console.WriteLine($".NET version: {Environment.Version}");

CultureInfo[] specificCultures = CultureInfo.GetCultures(SpecificCultures);
Console.WriteLine($"{specificCultures.Length} specific cultures in .NET");

CultureInfo[] neutralCultures = CultureInfo.GetCultures(NeutralCultures);
Console.WriteLine($"{neutralCultures.Length} neutral cultures in .NET");

该示例打印.NET中特定和中性区域性的数量。

$ dotnet run
.NET version: 6.0.4
547 specific cultures in .NET
240 neutral cultures in .NET

C#不变文化

不变文化是独立于文化的。我们在保存文化信息(例如日期)时使用它。以与文化无关的方式保存日期使我们能够在以后轻松解析值。

using System.Globalization;

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");

DateTime[] dates = {
    new DateTime(2019, 10, 9),
    new DateTime(2020, 1, 2)
};

using var sw = new StreamWriter(@"dates.dat");
sw.Write(String.Format(CultureInfo.InvariantCulture,
    "{0:d}|{1:d}", dates[0], dates[1]));

该示例使用CultureInfo.InvariantCulture格式写入两个日期。

sw.Write(String.Format(CultureInfo.InvariantCulture,
    "{0:d}|{1:d}", dates[0], dates[1]));

我们将CultureInfo.InvariantCulture传递给String.Format方法。

$ cat dates.dat
10/09/2019|01/02/2020

这是文件内容。

using System.Globalization;

using var sr = new StreamReader("dates.dat");
string contents = sr.ReadToEnd();
string[] dateStrings = contents.Split('|');

Console.WriteLine($"Current Culture: {CultureInfo.CurrentCulture.Name}");

foreach (var dateStr in dateStrings)
{
    DateTime dateVal;
    if (DateTime.TryParse(dateStr, CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out dateVal))
    {
        Console.WriteLine("The date is {0:D}", dateVal);
    }
    else
    {
        Console.WriteLine("ERROR: Unable to parse {0}", dateStr);
    }
}

Console.WriteLine();

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("sk-SK");
Console.WriteLine($"Current Culture: {CultureInfo.CurrentCulture.Name}");

foreach (var dateStr in dateStrings)
{
    DateTime dateVal;
    if (DateTime.TryParse(dateStr, CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out dateVal))
    {
        Console.WriteLine("Dátum je {0:D}", dateVal);
    }
    else
    {
        Console.WriteLine("ERROR: Unable to parse {0}", dateStr);
    }
}

在示例中,我们恢复数据并以两种不同的文化显示日期。

if (DateTime.TryParse(dateStr, CultureInfo.InvariantCulture,
                      DateTimeStyles.None, out dateVal))
{ 
...

我们将CultureInfo.InvariantCulture作为TryParse方法的第二个参数传递。

$ dotnet run
Current Culture: en-US
The date is Wednesday, October 9, 2019
The date is Thursday, January 2, 2020

Current Culture: sk-SK
Dátum je streda 9. októbra 2019
Dátum je štvrtok 2. januára 2020

C#CultureInfo排序

对字符串进行排序是特定于文化的。为语言设置正确的文化将进行正确的排序。

using System.Globalization;

Console.OutputEncoding = System.Text.Encoding.UTF8;
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("sk-SK");

var words = new List<string> { "čaj", "auto", "drevo", "cibuľa",
        "čučoriedka", "banán", "čerešňa", "červený", "čierny", "cesnak" };

words.Sort();

foreach (var word in words)
{
    Console.WriteLine(word);
}

该示例包含一个斯洛伐克语单词列表。设置正确的文化将根据斯洛伐克语的规则对单词进行排序。

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("sk-SK");

我们设置了斯洛伐克文化。

var words = new List<string> { "čaj", "auto", "drevo", "cibuľa", 
        "čučoriedka", "banán", "čerešňa", "červený", "čierny", "cesnak" };

我们有一个斯洛伐克语单词列表。

words.Sort();

我们对单词进行排序。Sort方法在对数据进行排序时将文化考虑在内。

$ dotnet run
auto
banán 
cesnak
cibuľa
čaj
čerešňa
červený
čierny
čučoriedka
drevo

在斯洛伐克语中,Ä字母在c字母之后。英文排序不会对这两个字母产生影响。

C#CultureInfo小数分隔符

不同文化使用小数点(以色列、日本、英国)或逗号(斯洛伐克、法国、德国)作为小数点分隔符。波斯语使用正斜杠(/)。

using System.Globalization;

Console.OutputEncoding = System.Text.Encoding.UTF8;

decimal val = 1278.112m;

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("sk-SK");
Console.WriteLine($"{val}");

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
Console.WriteLine($"{val}");

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("fa-IR");
Console.WriteLine($"{val}");

该示例以三种不同的文化打印十进制值。

$ dotnet run
1278,112
1278.112
1278Ù«112

C#CultureInfo千位分隔符

不同的文化使用不同的方式用分隔符对数字进行分组,以便于阅读。

using System.Globalization;

Console.OutputEncoding = System.Text.Encoding.UTF8;

int val = 12_156_320;

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("sk-SK");
Console.WriteLine($"{val:N}");

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
Console.WriteLine($"{val:N}");

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-CH");
Console.WriteLine($"{val:N}");

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("hi-IN");
Console.WriteLine($"{val:N}");

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("es-ES");
Console.WriteLine($"{val:N}");

该示例在五种不同的文化中打印一个整数值。

$ dotnet run
12 156 320,000
12,156,320.000
12’156’320.000
1,21,56,320.000
12.156.320,000

C#CultureInfo货币

不同文化使用不同的货币符号。该符号可以添加到货币值之前或附加到货币值。

using System.Globalization;

Console.OutputEncoding = System.Text.Encoding.UTF8;

decimal val = 12_156_320.54m;

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("sk-SK");
Console.WriteLine($"{val:c}");

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("ff-NG");
Console.WriteLine($"{val:c}");

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("fil-PH");
Console.WriteLine($"{val:c}");

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("zh-CN");
Console.WriteLine($"{val:c}");

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
Console.WriteLine($"{val:c}");

该示例以五种文化打印货币值。

$ dotnet run
12 156 320,54 €
12 156 320,54 NGN
₱12,156,320.54
Â¥12,156,320.54
$12,156,320.54

C#CultureInfo一周的第一天

文化中一周的第一天是星期日、星期一或星期六。

using System.Globalization;

var enUs = new CultureInfo("en-US");

var firstDay = enUs.DateTimeFormat.FirstDayOfWeek.ToString();
var name = enUs.DisplayName;
Console.WriteLine($"First day of the week in {name}: {firstDay}");

var skSk = new CultureInfo("sk-Sk");

var name2 = skSk.DisplayName;
var firstDay2 = skSk.DateTimeFormat.FirstDayOfWeek.ToString();
Console.WriteLine($"First day of the week in {name2}:: {firstDay2}");

var faIr = new CultureInfo("fa-IR");

var name3 = faIr.DisplayName;
var firstDay3 = faIr.DateTimeFormat.FirstDayOfWeek.ToString();
Console.WriteLine($"First day of the week in {name3}:: {firstDay3}");

该示例以三种文化打印一周的第一天。

$ dotnet run
First day of the week in English (United States): Sunday
First day of the week in Slovak (Slovakia):: Monday
First day of the week in Persian (Iran):: Saturday

C#CultureInfo第一周

在文化中定义一年的第一周有不同的规则,包括新年的第一天或一周的前四天或更多天。

using System.Globalization;

var enUs = new CultureInfo("en-US");

var weekRule = enUs.DateTimeFormat.CalendarWeekRule.ToString();
Console.WriteLine($"First calendar week starts with: {weekRule}");

var skSk = new CultureInfo("sk-Sk");

var weekRule2 = skSk.DateTimeFormat.CalendarWeekRule.ToString();
Console.WriteLine($"First calendar week starts with: {weekRule2}");

该示例打印两种文化的第一周规则。

$ dotnet run
First calendar week in English (United States) starts with: FirstDay
First calendar week in Slovak (Slovakia) starts with: FirstFourDayWeek

C#CultureInfo日名称

CultureInfo.DateTimeFormat.DayNames获取一个数组,其中包含星期几的文化特定全名。

using System.Globalization;

Console.OutputEncoding = System.Text.Encoding.UTF8;

var enUs = new CultureInfo("en-US");

foreach (var dayName in enUs.DateTimeFormat.DayNames)
{
    Console.WriteLine(dayName);
}

Console.WriteLine("***************************");

var skSk = new CultureInfo("sk-SK");

foreach (var dayName in skSk.DateTimeFormat.DayNames)
{
    Console.WriteLine(dayName);
}

该示例打印了en-USsk-SK文化中的日期名称。

$ dotnet run
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
***************************
nedeľa
pondelok
utorok
streda
Å¡tvrtok
piatok
sobota

C#CultureInfo月份名称

通过CultureInfo.DateTimeFormat.MonthNames属性,我们可以获得月份的文化特定全名数组。同样,我们使用CultureInfo.DateTimeFormat.AbbreviatedMonthNames获取特定于文化的月份缩写名称。

using System.Globalization;

Console.OutputEncoding = System.Text.Encoding.UTF8;

var huHu = new CultureInfo("hu-HU");
var name = huHu.NativeName;

Console.WriteLine($"{name}: Hónap nevek");

foreach (var monthName in huHu.DateTimeFormat.MonthNames)
{
    Console.WriteLine(monthName);
}

Console.WriteLine("**********************");

foreach (var abbMonthName in huHu.DateTimeFormat.AbbreviatedMonthNames)
{
    Console.WriteLine(abbMonthName);
}

该示例以匈牙利语打印月份名称。我们打印完整和缩写的月份名称。

$ dotnet run
magyar (Magyarország): Hónap nevek
január
február
március
április
május
június
július
augusztus
szeptember
október
november
december

**********************
jan.
febr.
márc.
ápr.
máj.
jún.
júl.
aug.
szept.
okt.
nov.
dec.

C#CultureInfo日期时间格式

不同文化使用不同的日期时间格式。

using System.Globalization;

var now = DateTime.Now;

var skSk = new CultureInfo("sk-SK");
CultureInfo.DefaultThreadCurrentCulture = skSk;

Console.WriteLine(skSk.DateTimeFormat.FullDateTimePattern);
Console.WriteLine(now.ToString(skSk.DateTimeFormat.FullDateTimePattern));

Console.WriteLine();

Console.WriteLine(skSk.DateTimeFormat.LongDatePattern);
Console.WriteLine(now.ToString(skSk.DateTimeFormat.LongDatePattern));

Console.WriteLine();

Console.WriteLine(skSk.DateTimeFormat.ShortTimePattern);
Console.WriteLine(now.ToString(skSk.DateTimeFormat.ShortTimePattern));

该示例以不同的格式打印今天在斯洛伐克文化中的日期。

$ dotnet run
dddd d. MMMM yyyy H:mm:ss
pondelok 10. októbra 2022 11:07:36

dddd d. MMMM yyyy
pondelok 10. októbra 2022

H:mm
11:07

在本文中,我们使用了C#CultureInfo,它用于全球化C#应用程序。

列出所有C#教程。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏