C#で日付形式について言及するにはどうすればよいですか。
2010 年 11 月 1 日の場合、次のように表示されます: 1st November
2010 年 11 月 30 日の場合、次のように表示されます: 11 月 30 日
任意の日付形式を使用するか、1 -> 'st'、2-> 'nd' 3-> 'rd'、任意の日付 no -> 'th' を返すカスタム関数を作成できますか。
C#で日付形式について言及するにはどうすればよいですか。
2010 年 11 月 1 日の場合、次のように表示されます: 1st November
2010 年 11 月 30 日の場合、次のように表示されます: 11 月 30 日
任意の日付形式を使用するか、1 -> 'st'、2-> 'nd' 3-> 'rd'、任意の日付 no -> 'th' を返すカスタム関数を作成できますか。
次のコードは、整数から序数を生成するその回答に基づいています。
public static string ToOrdinal(int number)
{
switch(number % 100)
{
case 11:
case 12:
case 13:
return number.ToString() + "th";
}
switch(number % 10)
{
case 1:
return number.ToString() + "st";
case 2:
return number.ToString() + "nd";
case 3:
return number.ToString() + "rd";
default:
return number.ToString() + "th";
}
}
出力文字列を生成するよりも:
public static string GenerateDateString(DateTime value)
{
return string.Format(
"{0} {1:MMMM}",
ToOrdinal(value.Day),
value);
}
このようなものはうまくいくはずです...
using System;
using System.Text;
namespace Program {
class Demo {
static string[] extensions =
// 0 1 2 3 4 5 6 7 8 9
{ "th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th",
// 10 11 12 13 14 15 16 17 18 19
"th", "th", "th", "th", "th", "th", "th", "tn", "th", "th",
// 20 21 22 23 24 25 26 27 28 29
"th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th",
// 30 31
"th", "st" };
public static void Main() {
String strTestDate = "02-11-2007";
DateTime coverdate = DateTime.ParseExact(strTestDate, "dd-MM-yyyy", null);
string s = coverdate.ToString(" MMMM yyyy");
string t = string.Format("{0}{1}",coverdate.Day,extensions[coverdate.Day]);
string result = t + s;
}
}
}
したがって、ここに拡張メソッドを使用した完全なソリューションがあります。C# 3.0 以降で動作します。主にNikhil の作品の盗作:
public static class DateTimeExtensions
{
static string[] extensions = // 0 1 2 3 4 5 6 7 8 9
{ "th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th",
// 10 11 12 13 14 15 16 17 18 19
"th", "th", "th", "th", "th", "th", "th", "tn", "th", "th",
// 20 21 22 23 24 25 26 27 28 29
"th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th",
// 30 31
"th", "st"
};
public static string ToSpecialString(this DateTime dt)
{
string s = dt.ToString(" MMMM yyyy");
string t = string.Format("{0}{1}", dt.Day, extensions[dt.Day]);
return t + s;
}
}
このようにテスト/使用:
Console.WriteLine(DateTime.Now.ToSpecialString());
Console.WriteLine(new DateTime(1990, 11, 12).ToSpecialString());
Console.WriteLine(new DateTime(1990, 1, 1).ToSpecialString());
Console.WriteLine(new DateTime(1990, 1, 2).ToSpecialString());
Console.WriteLine(new DateTime(1990, 1, 3).ToSpecialString());
Console.WriteLine(new DateTime(1990, 1, 4).ToSpecialString());
Console.WriteLine(new DateTime(1990, 12, 15).ToSpecialString());
Console.WriteLine(new DateTime(1990, 8, 19).ToSpecialString());
Console.WriteLine(new DateTime(1990, 9, 22).ToSpecialString());
Console.ReadKey();
お役に立てば幸いです。
日付を1日または30日として表示するデータタイムルーチンはないと確信しています。
私は最近、そのようなコードをゼロから書きました。あなたも同じことをする必要があると思います。
コードは手元にありませんが、各数値の文字 ("th"、"st"、"nd"、"rd"、"th" など) を含む文字列配列を作成しました。次に、10 に対して mod を実行し、残りを配列のインデックスとして使用します。その文字列を番号に追加するだけです。
正規表現を使用して、日と月を抽出できます。次に、すべての月の名前を配列に格納し、.startsWithを使用して適切な月の名前を取得します。case
「st」、「nd」、「rd」、または「th」が必要かどうかを確認するには、単純なものを使用できます。
私はJSL vscontrolの文字列の例のブログをたどりましたが、最後にバグがあり、行の先頭にある日番号を連結するのを忘れていたので、
return strNum + ordinal + str;
ではありません!
return ordinal + str;