当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在.NET中是否有一种简单的方法可以获得数字的"st","nd","rd"和"th"结尾?》经验,为你挑选了6个好方法。

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

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

这个链接有一个很好的例子,说明了编写自己的函数所涉及的基本原理,但是如果我缺少内置容量,我会更好奇.

斯科特汉塞尔曼的回答是公认的,因为它直接回答了这个问题.

但是,对于解决方案,请看这个很好的答案.



1> nickf..:

这是一个比你想象的要简单得多的功能.虽然可能已经存在.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;
}


@MichaelStum:实际上在德国你不能只添加"ter".考虑"Heute ist der 1te Januar"(今天是1月1日).或者"Klicken Sie den 5ten Button"(单击第5个按钮).仅举两个例子中的两个.每次使用时都必须考虑适当的Flexion(engl.inflection).
本地化意味着您必须为每种语言创建单独的函数.在德语中,你可以添加"ter",但"1ter""2ter""3ter"看起来非常糟糕,即使它在语法上是正确的.在法语中,它有点好,但是对于每种语言都没有通用的方式.

2> Shahzad Qure..:

简单,干净,快捷

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

或者更好,作为一种扩展方法

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

现在你可以打电话了

int a = 1;
a.DisplayWithSuffix(); 

甚至像直接一样

1.DisplayWithSuffix();


您可能想将num.ToString()放入变量中。不知道有人会简单,干净或很快地说出这个答案。

3> Scott Hansel..:

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


这是一个迟到的评论,但有没有计划将此功能添加到.NET BCL格式日期?

4> Scott Dorman..:

@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);
}



5> mjallday..:

这已经被覆盖但我不确定如何链接到它.这是代码snippit:

    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,请删除this关键字

[编辑]:感谢您指出它不正确,这就是您获得的复制/粘贴代码:)


我喜欢你如何声明变量而从不使用它.
不行.1011%10 == 1. 1011st不正确.

6> redcalx..:

这是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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有