Как перечислить все названия месяцев, например, для комбо?
в данный момент я создаю DateTime
для каждого месяца и форматирования его, чтобы включить только месяц.
Есть ли другой или лучший способ сделать это?
12 ответов:
можно использовать
DateTimeFormatInfo
чтобы получить эту информацию:// Will return January string name = DateTimeFormatInfo.CurrentInfo.GetMonthName(1);
или, чтобы получить все имена:
string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames;
вы также можете создать новый
DateTimeFormatInfo
на основеCultureInfo
СDateTimeFormatInfo.GetInstance
или вы можете использовать текущую культуруCultureInfo.DateTimeFormat
собственность.имейте в виду, что календари в .Net поддерживают до 13 месяцев, таким образом, вы получите дополнительную пустую строку в конце для календарей только с 12 месяцами (например найдено в en-US или fr например).
этот метод позволит вам применить список пар ключевых значений месяцев к их аналогам int. Мы генерируем его с помощью одной строки, используя перечислимые диапазоны и LINQ. Ура, код LINQ-гольф!
var months = Enumerable.Range(1, 12).Select(i => new { I = i, M = DateTimeFormatInfo.CurrentInfo.GetMonthName(i) });
чтобы применить его к выпадающему списку ASP:
// <asp:DropDownList runat="server" ID="ddlMonths" /> ddlMonths.DataSource = months; ddlMonths.DataTextField = "M"; ddlMonths.DataValueField = "I"; ddlMonths.DataBind();
вы можете использовать следующее, чтобы вернуть массив строк, содержащих имена месяцев
System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
они определяются как массив в пространствах имен глобализации.
using System.Globalization; for (int i = 0; i < 12; i++) { Console.WriteLine(CultureInfo.CurrentUICulture.DateTimeFormat.MonthNames[i]); }
попробуйте перечислить названия месяцев:
for( int i = 1; i <= 12; i++ ){ combo.Items.Add(CultureInfo.CurrentCulture.DateTimeFormat.MonthNames[i]); }
это в системе.Пространство имен глобализации.
надеюсь, что это поможет!
вы можете получить список локализованных месяцев с
Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthNames
и инвариантные месяцев сDateTimeFormatInfo.InvariantInfo.MonthNames
.string[] localizedMonths = Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthNames; string[] invariantMonths = DateTimeFormatInfo.InvariantInfo.MonthNames; for( int month = 0; month < 12; month++ ) { ListItem monthListItem = new ListItem( localizedMonths[month], invariantMonths[month] ); monthsDropDown.Items.Add( monthListItem ); }
там может быть какая-то проблема с количеством месяцев в году в зависимости от типа календаря, но я только что предположил 12 месяцев в этом примере.
public IEnumerable<SelectListItem> Months { get { return Enumerable.Range(1, 12).Select(x => new SelectListItem { Value = x.ToString(), Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(x) }); } }
способ получения динамическая культура конкретный список имен месяцев в C# С LINQ.
ComboBoxName.ItemsSource= System.Globalization.CultureInfo. CurrentCulture.DateTimeFormat.MonthNames. TakeWhile(m => m != String.Empty).ToList();
или
в этом примере анонимный объект создается со свойством Month и MonthName
var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames .TakeWhile(m => m != String.Empty) .Select((m,i) => new { Month = i+1, MonthName = m }) .ToList();
PS: мы используем метод TakeWhile, потому что массив MonthNames содержит пустой 13-й месяц.
немного LINQ только потому, что он красиво лаконичен:
var monthOptions = DateTimeFormatInfo.CurrentInfo.MonthNames .Where(p=>!string.IsNullOrEmpty(p)) .Select((item, index) => new { Id = index + 1, Name = item });
вам нужно предложение Where, потому что календарь возвращает имя 13-го месяца (пустое на английском языке).
индекс возвращает индекс в пределах IEnumerable, поэтому вам нужно +1 для фактического индекса месяца.
List<string> mnt = new List<string>(); int monthCount = Convert.ToInt32(cbYear.Text) == DateTime.Now.Year ? DateTime.Now.Month : 12; for (int i = 0; i < monthCount; i++) { mnt.Add(CultureInfo.CurrentUICulture.DateTimeFormat.MonthNames[i]); } cbMonth.DataSource = mnt;
string[] monthNames = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames; foreach (string m in monthNames) // writing out { Console.WriteLine(m); }
выход:
January February March April May June July August September October November December
обновление: Обратите внимание, что для разных языков и культур выходные данные могут быть не на английском языке. Хотя раньше я этого не проверял.
только для нас английский:
string[] monthNames = (new System.Globalization.CultureInfo("en-US")).DateTimeFormat.MonthNames;
вот хороший пример для заполнения выпадающего списка с месяцами для формы кредитной карты:
Dim currentCulture As CultureInfo = CultureInfo.CurrentUICulture Dim monthName, monthNumber As String For x As Integer = 0 To 11 monthNumber = (x + 1).ToString("D2") monthName = currentCulture.DateTimeFormat.MonthNames(x) Dim month As New ListItem(String.Format("{0} - {1}", monthNumber, monthName), x.ToString("D2")) ddl_expirymonth.Items.Add(month) Next
создает следующее локализованное на текущий язык, например:
01 - January 02 - February etc.