2017-01-30 15 views
4

мне нужно форматировать номер, основанный на культуре, но все у меня есть, Accept-Language из запроса HTTP, который представляет собой два-буквенный код, как fr (для французского)Могу ли я создать новую CultureInfo из двухсимвольного кода языка?

ли это достаточно, чтобы создать CultureInfo который может обрабатывать числа?

+2

Что произошло, когда вы попробовали? – Chris

ответ

3

Да, вы можете. Следующий код:

var ci = new CultureInfo("fr"); 
Console.WriteLine(13.45.ToString(ci)); 

выходы «13,45», в котором используется французский разделитель десятичных знаков.

The CultureInfo documentation говорит:

нейтральная культура определяется только два-буквенный код в нижнем регистре языка. Например, fr указывает нейтральную культуру для французов, а de указывает на нейтральную культуру для немецкого языка.

+1

Обратите внимание, что 'ci.CultureTypes' будет иметь флаг' NeutralCultures' в этом случае. Эквивалентно ['ci.IsNeutralCulture'] (https://msdn.microsoft.com/en-us/library/7tkwe67b.aspx) дает' true'. Это не рекомендуется. Лучше использовать что-то вроде 'new CultureInfo (« fr-CA »)', где вы даете как язык, так и страну, соответствующую флагу 'SpecificCultures'. –

+0

@JeppeStigNielsen: Вы порекомендовали бы просто выбрать произвольную страну, а не делать выше? Каковы его недостатки - нейтральная культура по сравнению с выбором страны для этого? – Chris

+1

'var ci = CultureInfo.CreateSpecificCulture (« fr »)' выбирает для вас определенную культуру. В этом примере он выбирает '' fr-FR'', то есть _French (Франция) _. Однако я не эксперт. –

2

Это комментарий, чтобы проиллюстрировать разницу между neutral cultures and specific cultures:

var language = "fr"; 

var c1 = new CultureInfo(language); 
Console.WriteLine(c1.EnglishName);    // "French" 
Console.WriteLine(c1.IsNeutralCulture);   // "True" 
Console.WriteLine((3.14m).ToString("C", c1)); // "3,14 €" 

var c2 = CultureInfo.CreateSpecificCulture(language); 
Console.WriteLine(c2.EnglishName);    // "French (France)" 
Console.WriteLine(c2.IsNeutralCulture);   // "False" 
Console.WriteLine((3.14m).ToString("C", c2)); // "3,14 €" 

var languageAndCountry = "fr-CA"; 

var c3 = new CultureInfo(languageAndCountry); 
Console.WriteLine(c3.EnglishName);    // "French (Canada)" 
Console.WriteLine(c3.IsNeutralCulture);   // "False" 
Console.WriteLine((3.14m).ToString("C", c3)); // "3,14 $" 

В заключение, если у вас есть только язык, вы не можете получить все. Вы можете либо получить нейтральную культуру, либо «каноническую» специфическую культуру, где выбрана какая-то «типичная» страна.

Если у вас есть язык и страна, как в "fr-CA", все будет лучше.


В моей системе, следующие конкретные культуры с "fr" существуют:

FR-029, FR-BE, FR-BF, FR-BI, FR-BJ, FR-BL, FR -CA, fr-CD, fr-CF, fr-CG, fr-CH, fr-CI, fr-CM, fr-DJ, fr-DZ, fr-FR, fr-GA, fr-GF, fr-GN , fr-GP, fr-GQ, fr-HT, fr-KM, fr-LU, fr-MA, fr-MC, fr-MF, fr-MG, fr-ML, fr-MQ, fr-MR, fr -MU, fr-NC, fr-NE, fr-PF, fr-PM, fr-RE, fr-RW, fr-SC, fr-SN, fr-SY, fr-TD, fr-TG, fr-TN , fr-VU, fr-WF, fr-YT

(найдено с string.Join(", ", CultureInfo.GetCultures(CultureTypes.SpecificCultures).Where(x => x.TwoLetterISOLanguageName == "fr")))