繁体   English   中英

至1日、2日、3日、4日(月日)

[英]To 1st, 2nd, 3rd, 4th (Month days)

我写了一个扩展 function 来确定一个月的日期/数字是第 1 天/第 31 天、第 2 天/第 22 天、第 3 天还是第 4 天......第 30 天。

我想知道是否有更好/更短或更优雅的方式我可以编写它? 我的 function:

/// <summary>
/// To 1st, 2nd, 3rd, 4th (Month days)
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static string To1st2nd3rd4th( this double n )
{
    // nFirst
    if ( new double[] { 1, 21, 31 }.Contains( n ) )
    {
        return $"{n}st";
    }

    // nSecond
    if ( new double[] { 2, 22 }.Contains( n ) )
    {
        return $"{n}nd";
    }

    // nThird
    if ( n == 3 )
    {
        return $"{n}rd";
    }

    //n-th/ n > 3
    if ( n > 3 )
    {
        return $"{n}th";
    }

    return n.ToString();
}

您的解决方案几乎没有问题。

首先,为什么这一天(因为它是一个日期)必须是double 所以我会在那里使用一个int

其次,您的if语句可以是if-else 您必须添加一个案例,因为它是负数或零。

但这存在不适用于33等数字的问题(当然,没有一个月的第 33 天,但 function 应该是自给自足的)。

我宁愿使用Humanizer库,它可以做到这一点以及更多。

您可以获得NuGet package,一旦完成,就很简单:

Console.WriteLine("{0} ==> {1}", 1, 1.Ordinalize());
Console.WriteLine("{0} ==> {1}", 21, 21.Ordinalize());
Console.WriteLine("{0} ==> {1}", 31, 31.Ordinalize());
Console.WriteLine("{0} ==> {1}", 33, 33.Ordinalize());
Console.WriteLine("{0} ==> {1}", 2, 22.Ordinalize());
Console.WriteLine("{0} ==> {1}", 3, 3.Ordinalize());
Console.WriteLine("{0} ==> {1}", 4, 4.Ordinalize());
Console.WriteLine("{0} ==> {1}", 55, 55.Ordinalize());
Console.WriteLine("{0} ==> {1}", 1237, 1237.Ordinalize());
Console.WriteLine("{0} ==> {1}", 0, 0.Ordinalize());

Output

1 ==> 第一

21 ==> 21 日

31 ==> 31 日

33 ==> 33

2 ==> 22

3 ==> 第三

4 ==> 第四

55 ==> 55th

1237 ==> 1237th

0 ==> 第 0 个

  private string NumberSuffix(double n)
    {
        var below100 = n % 10;
        var above100 = n % 100;

        if (below100 == 1 && above100 != 11)
        {
            return n + "st";
        }
        if (below100 == 2 && above100 != 12)
        {
            return n + "nd";
        }
        if (below100 == 3 && above100 != 13)
        {
            return n + "rd";
        }
        return n + "th";
    }

我认为这将作为一般方法为您工作:

        static void Main(string[] args)
    {
        Console.WriteLine(String.Join(" ", Enumerable.Range(0, 24).Select(NumberSuffix)));
        Console.WriteLine(String.Join(" ", Enumerable.Range(250, 24).Select(NumberSuffix)));
        Console.WriteLine(String.Join(" ", Enumerable.Range(10001, 24).Select(NumberSuffix)));

        Console.ReadKey();
    }

    public static string NumberSuffix2(int n)
    {
        //                           0     1     2     3     4     5     6     7     8     9      10    11    12
        string[] nth = new string[] {"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "th", "th"};

        int n2 = Math.Abs(n);

        return n + nth[(n2 % 100) % (n2 % 100 > 13 ? 10 : 13)];
    }

Output 是:

0日 1日 2日 3日 4日 5日 6日 7日 8日 9日 10日 11日 12日 13日 14日 15日 16日 17日 18日 19日 20日 21日 22日 23日

第250位 251位 252位 253位 254位 255位 256位 257位 258位 259位 260位 261位 262位 263位 264位 265位 266位 267位 268位 269位 270位 271位 272位 273位

0001st 10002nd 10003rd 10004th 10005th 10006th 10007th 10008th 10009th 10010th 10011th 10012th 10013th 10014th 10015th 10016th 10017th 10018th 10019th 10020th 10021st 10022nd 10023rd 10024th

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM