[英]How to parse a month name (string) to an integer for comparison in C#?
我需要能夠比較數組中的一些月份名稱。
如果有一些直接的方式,那就太好了:
Month.toInt("January") > Month.toInt("May")
我的谷歌搜索似乎表明唯一的方法是編寫自己的方法,但這似乎是一個足夠普遍的問題,我認為它已經在 .Net 中實現了,以前有人這樣做過嗎?
DateTime.ParseExact(monthName, "MMMM", CultureInfo.CurrentCulture ).Month
雖然,出於您的目的,您最好創建一個Dictionary<string, int>
將月份的名稱映射到其值。
你可以這樣做:
Convert.ToDate(month + " 01, 1900").Month
如果您使用幾個人建議的DateTime.ParseExact()
-方法,您應該仔細考慮當應用程序在非英語環境中運行時您希望發生什么!
在丹麥, ParseExact("Januar", ...)
和ParseExact("January", ...)
哪一個應該工作,哪一個應該失敗?
這將是CultureInfo.CurrentCulture
和CultureInfo.InvariantCulture
之間的區別。
一個簡單的解決方案是創建一個帶有名稱和值的字典。 然后使用 Contains() 可以找到正確的值。
Dictionary<string, string> months = new Dictionary<string, string>()
{
{ "january", "01"},
{ "february", "02"},
{ "march", "03"},
{ "april", "04"},
{ "may", "05"},
{ "june", "06"},
{ "july", "07"},
{ "august", "08"},
{ "september", "09"},
{ "october", "10"},
{ "november", "11"},
{ "december", "12"},
};
foreach (var month in months)
{
if (StringThatContainsMonth.ToLower().Contains(month.Key))
{
string thisMonth = month.Value;
}
}
您可以使用 DateTime.Parse 方法獲取 DateTime 對象,然后檢查其 Month 屬性。 做這樣的事情:
int month = DateTime.Parse("1." + monthName + " 2008").Month;
訣竅是建立一個有效的日期來創建一個 DateTime 對象。
您可以使用月份的枚舉:
public enum Month
{
January,
February,
// (...)
December,
}
public Month ToInt(Month Input)
{
return (int)Enum.Parse(typeof(Month), Input, true));
}
不過,我不是 100% 確定 enum.Parse() 的語法。
您不必創建 DateTime 實例來執行此操作。 就這么簡單:
public static class Month
{
public static int ToInt(this string month)
{
return Array.IndexOf(
CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
month.ToLower(CultureInfo.CurrentCulture))
+ 1;
}
}
我在da-DK
文化上運行,所以這個單元測試通過了:
[Theory]
[InlineData("Januar", 1)]
[InlineData("Februar", 2)]
[InlineData("Marts", 3)]
[InlineData("April", 4)]
[InlineData("Maj", 5)]
[InlineData("Juni", 6)]
[InlineData("Juli", 7)]
[InlineData("August", 8)]
[InlineData("September", 9)]
[InlineData("Oktober", 10)]
[InlineData("November", 11)]
[InlineData("December", 12)]
public void Test(string monthName, int expected)
{
var actual = monthName.ToInt();
Assert.Equal(expected, actual);
}
我將把它作為練習留給讀者來創建一個重載,您可以在其中傳遞顯式 CultureInfo。
在提出問題七年后回答這個問題,可以使用內置方法進行比較:
Month.toInt("January") > Month.toInt("May")
變成
Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
t => t.Equals("January", StringComparison.CurrentCultureIgnoreCase)) >
Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
t => t.Equals("May", StringComparison.CurrentCultureIgnoreCase))
為簡單起見,可以將其重構為擴展方法。 以下是 LINQPad 示例(因此調用Dump()
方法):
void Main()
{
("January".GetMonthIndex() > "May".GetMonthIndex()).Dump();
("January".GetMonthIndex() == "january".GetMonthIndex()).Dump();
("January".GetMonthIndex() < "May".GetMonthIndex()).Dump();
}
public static class Extension {
public static int GetMonthIndex(this string month) {
return Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
t => t.Equals(month, StringComparison.CurrentCultureIgnoreCase));
}
}
有輸出:
False
True
True
我將其翻譯成西班牙語版本的 C# 代碼,問候:
public string ObtenerNumeroMes(string NombreMes){
string NumeroMes;
switch(NombreMes) {
case ("ENERO") :
NumeroMes = "01";
return NumeroMes;
case ("FEBRERO") :
NumeroMes = "02";
return NumeroMes;
case ("MARZO") :
NumeroMes = "03";
return NumeroMes;
case ("ABRIL") :
NumeroMes = "04";
return NumeroMes;
case ("MAYO") :
NumeroMes = "05";
return NumeroMes;
case ("JUNIO") :
NumeroMes = "06";
return NumeroMes;
case ("JULIO") :
NumeroMes = "07";
return NumeroMes;
case ("AGOSTO") :
NumeroMes = "08";
return NumeroMes;
case ("SEPTIEMBRE") :
NumeroMes = "09";
return NumeroMes;
case ("OCTUBRE") :
NumeroMes = "10";
return NumeroMes;
case ("NOVIEMBRE") :
NumeroMes = "11";
return NumeroMes;
case ("DICIEMBRE") :
NumeroMes = "12";
return NumeroMes;
default:
Console.WriteLine("Error");
return "ERROR";
}
}
如果您使用的是 c# 3.0(或更高版本),您可以使用擴展程序
Public Function returnMonthNumber(ByVal monthName As String) As Integer
Select Case monthName.ToLower
Case Is = "january"
Return 1
Case Is = "february"
Return 2
Case Is = "march"
Return 3
Case Is = "april"
Return 4
Case Is = "may"
Return 5
Case Is = "june"
Return 6
Case Is = "july"
Return 7
Case Is = "august"
Return 8
Case Is = "september"
Return 9
Case Is = "october"
Return 10
Case Is = "november"
Return 11
Case Is = "december"
Return 12
Case Else
Return 0
End Select
End Function
警告代碼為 Beta 版。
我所做的是使用 SimpleDateFormat 創建格式字符串,並將文本解析為日期,然后從中檢索月份。 代碼如下:
int year = 2012 \\or any other year
String monthName = "January" \\or any other month
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy");
int monthNumber = format.parse("01-" + monthName + "-" + year).getMonth();
此代碼可幫助您...
using System.Globalization;
....
string FullMonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.UtcNow.Month);
GetMonthName 方法 - 它返回字符串...
如果您想將月份作為整數,則只需使用 -
DateTime dt= DateTime.UtcNow;
int month= dt.Month;
希望對你有幫助!!!
謝謝!!!
int selectedValue = 0;
switch (curentMonth)
{
case "January":
selectedValue = 1;
break;
case "February":
selectedValue = 2;
break;
}
if (selectedValue != 0)
{
/* var list= db.model_name.Where(x => x.column== selectedValue);
return list; */
}
return Ok(selectedValue);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.