70

以下を変換するために.NETに欠落しているメソッドまたはフォーマット文字列があるかどうか疑問に思っています。

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

このリンクには、独自の関数を作成するための基本原則の悪い例がありますが、不足している組み込みの容量があるかどうかについてはもっと興味があります。

解決

スコット・ハンゼルマンの答えは、質問に直接答えるため、受け入れられたものです。

ただし、解決策については、このすばらしい回答を参照してください。

4

11 に答える 11

87

思ったよりずっとシンプルな機能です。このための.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;
}
于 2008-09-16T03:57:08.873 に答える
78

シンプル、クリーン、クイック

    private static string GetOrdinalSuffix(int num)
    {
        string number = num.ToString();
        if (number.EndsWith("11")) return "th";
        if (number.EndsWith("12")) return "th";
        if (number.EndsWith("13")) return "th";
        if (number.EndsWith("1")) return "st";
        if (number.EndsWith("2")) return "nd";
        if (number.EndsWith("3")) return "rd";
        return "th";
    }

またはさらに良いことに、拡張メソッドとして

public static class IntegerExtensions
{
    public static string DisplayWithSuffix(this int num)
    {
        string number = num.ToString();
        if (number.EndsWith("11")) return number + "th";
        if (number.EndsWith("12")) return number + "th";
        if (number.EndsWith("13")) return number + "th";
        if (number.EndsWith("1")) return number + "st";
        if (number.EndsWith("2")) return number + "nd";
        if (number.EndsWith("3")) return number + "rd";
        return number + "th";
    }
}

今、あなたはただ電話することができます

int a = 1;
a.DisplayWithSuffix(); 

または同じくらい直接的でさえ

1.DisplayWithSuffix();
于 2013-10-23T22:37:59.273 に答える
59

いいえ、.NET基本クラスライブラリには組み込みの機能はありません。

于 2008-09-16T03:56:07.880 に答える
55

@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);
}
于 2008-09-16T04:11:42.770 に答える
13

これについてはすでに説明しましたが、リンクする方法がわかりません。コードスニピットは次のとおりです。

    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未満の場合は、このキーワードを削除してください

[編集]:それが間違っていたことを指摘してくれてありがとう、それはあなたがコードをコピー/貼り付けするために得るものです:)

于 2008-09-16T03:58:09.310 に答える
9

Microsoft SQL Server 関数のバージョンは次のとおりです。

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
于 2009-03-04T15:51:21.900 に答える
2

これがOPの質問に対する答えではないことはわかっていますが、このスレッドからSQL Server関数を持ち上げると便利だとわかったので、Delphi(Pascal)に相当するものを次に示します。

function OrdinalNumberSuffix(const ANumber: integer): string;
begin
  Result := IntToStr(ANumber);
  if(((Abs(ANumber) div 10) mod 10) = 1) then // Tens = 1
    Result := Result + 'th'
  else
    case(Abs(ANumber) mod 10) of
      1: Result := Result + 'st';
      2: Result := Result + 'nd';
      3: Result := Result + 'rd';
      else
        Result := Result + 'th';
    end;
end;

...、-1st、0th は意味がありますか?

于 2012-02-15T08:53:44.003 に答える
-3
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;
于 2008-12-22T14:07:40.157 に答える
-6

序数の接尾辞を取得するのは難しいと思います...基本的には、スイッチを使用して数値をテストし、接尾辞を追加する関数を作成する必要があります。

言語がこれを内部的に提供する理由はありません。特に、ロケール固有の場合はそうです。

書くコードの量に関しては、そのリンクよりも少しうまくいくことができますが、このための関数をコーディングする必要があります...

于 2008-09-16T03:59:19.540 に答える