.NET中是否有一种简单的方法来获取数字的" st"," nd"," rd"和" th"结尾?

时间:2020-03-05 18:55:06  来源:igfitidea点击:

我想知道.NET中是否缺少转换以下内容的方法或者格式字符串:

1 to 1st
   2 to 2nd
   3 to 3rd
   4 to 4th
  11 to 11th
 101 to 101st
 111 to 111th

该链接提供了编写自己的函数所涉及的基本原理的错误示例,但是如果我缺少内置功能,我会更加好奇。

解决方案

Scott Hanselman的答案是被接受的,因为它直接回答了问题。

但是,对于解决方案,请参见此好答案。

解决方案

回答

不,.NET基类库中没有内置功能。

回答

这个功能比我们想象的要简单得多。尽管为此可能已经存在一个.NET函数,但是以下函数(用PHP编写)可以完成此工作。移植起来应该不难。

function ordinal($num) {
    $ones = $num % 10;
    $tens = floor($num / 10) % 10;
    if ($tens == 1) {
        $suff = "th";
    } else {
        switch ($ones) {
            case 1 : $suff = "st"; break;
            case 2 : $suff = "nd"; break;
            case 3 : $suff = "rd"; break;
            default : $suff = "th";
        }
    }
    return $num . $suff;
}

回答

已经讨论过了,但是我不确定如何链接到它。这是代码片段:

public static string Ordinal(this int number)
    {
        var ones = number % 10;
        var tens = Math.Floor (number / 10f) % 10;
        if (tens == 1)
        {
            return number + "th";
        }

        switch (ones)
        {
            case 1: return number + "st";
            case 2: return number + "nd";
            case 3: return number + "rd";
            default: return number + "th";
        }
    }

仅供参考:这是一种扩展方法。如果.NET版本低于3.5,则删除此关键字

[编辑]:感谢我们指出这是不正确的,这就是复制/粘贴代码得到的结果:)

回答

我认为很难获得序数后缀...我们基本上必须编写一个函数,该函数使用开关来测试数字并添加后缀。

语言没有理由在内部提供此功能,尤其是在特定于区域设置的情况下。

在编写代码量方面,我们可以比该链接做得更好,但是我们必须为此编写一个函数...

回答

@nickf:这是C#中的PHP函数:

public static string Ordinal(int number)
{
    string suffix = String.Empty;

    int ones = number % 10;
    int tens = (int)Math.Floor(number / 10M) % 10;

    if (tens == 1)
    {
        suffix = "th";
    }
    else
    {
        switch (ones)
        {
            case 1:
                suffix = "st";
                break;

            case 2:
                suffix = "nd";
                break;

            case 3:
                suffix = "rd";
                break;

            default:
                suffix = "th";
                break;
        }
    }
    return String.Format("{0}{1}", number, suffix);
}

回答

else if (choice=='q')
{
    qtr++;

    switch (qtr)
    {
        case(2): strcpy(qtrs,"nd");break;
        case(3):
        {
           strcpy(qtrs,"rd");
           cout<<"End of First Half!!!";
           cout<<" hteam "<<"["<<hteam<<"] "<<hs;
           cout<<" vteam "<<" ["<<vteam;
           cout<<"] ";
           cout<<vs;dwn=1;yd=10;

           if (beginp=='H') team='V';
           else             team='H';
           break;
       }
       case(4): strcpy(qtrs,"th");break;

回答

这是Microsoft SQL Server Function版本:

CREATE FUNCTION [Internal].[GetNumberAsOrdinalString]
(
    @num int
)
RETURNS nvarchar(max)
AS
BEGIN

    DECLARE @Suffix nvarchar(2);
    DECLARE @Ones int;  
    DECLARE @Tens int;

    SET @Ones = @num % 10;
    SET @Tens = FLOOR(@num / 10) % 10;

    IF @Tens = 1
    BEGIN
        SET @Suffix = 'th';
    END
    ELSE
    BEGIN

    SET @Suffix = 
        CASE @Ones
            WHEN 1 THEN 'st'
            WHEN 2 THEN 'nd'
            WHEN 3 THEN 'rd'
            ELSE 'th'
        END
    END

    RETURN CONVERT(nvarchar(max), @num) + @Suffix;
END