使用文化为数字添加后缀

时间:2010-09-09 09:58:47

标签: c#

我需要用各种语言写日期。 是否可以使用文化写一个像7月1日到10月3日的日期?

无法找到办法 有什么建议吗?

修改

我的意思是,如果选择的文化是英语,它应该显示 2010年10月1日 如果西班牙语应该显示西班牙语注释后缀的等效物(第一等...)

4 个答案:

答案 0 :(得分:4)

正如其他人所指出的那样,.NET Framework中没有内置任何特定于文化的序号数字格式。无论如何,在许多语言中,序数不会用于日期(例如西班牙语,今天的日期是“2010年9月9日”,而不是“2010年9月9日”)。

为什么像.NET这样的通用框架永远不可能包含文化敏感的“GetOrdinalSuffix”方法或类似方法的其他原因包括性别(法语为1er,1ère;西班牙语为1o,1a,以及在给定的语言中可能有多个表单(西班牙语为1o /1º或1a /1ª) - 您使用的表单可能取决于您在输出文本时使用的编码。

  

有什么建议吗?

我的建议是不要这样做。相反,向您的用户解释它很复杂,因为您必须研究每种支持的语言,并说服他们在没有后缀的情况下生活。还向他们解释,最好将日期格式化为他们使用的每个其他应用程序。

答案 1 :(得分:2)

好吧,如果你绝对坚持这样做,这就是采取的方法。

使用一个带有数字并吐出后缀的方法定义一些简单的接口。像这样:

interface INumberSuffixProvider
{
    string GetSuffix(int number);
}

现在,确定您要支持的语言。弄清楚他们的后缀是什么。编写一个为每种语言实现INumberSuffixProvider的类(您可能会发现编写一个基类,它提供了一个非常标准的实现,对大多数语言都有类似的功能)。

最后,创建一个工厂类,为给定的文化字符串创建INumberSuffixProvider

public class NumberSuffixProviderFactory
{
    public INumberSuffixProvider GetProvider(Language language)
    {
        switch (name)
        {
            case Language.English: return new EnglishNumberSuffixProvider();
            case Language.German: return new GermanNumberSuffixProvider();

            // etc., etc. -- this is just for illustration

            default: throw new ArgumentException("Unknown language.");
        }
    }
}

这不是最简单的解决方案,因为它需要您做一些工作。但是如果你能确定你想要支持哪种语言,至少一旦你有了基本的结构(上面只是一个想法的草图,真的),实际上使用这个代码应该很容易。

例如:

string FormatDate(DateTime date)
{
    // These might be a static members.
    var language = _currentLanguage;
    var suffixProvider = _suffixProviderFactory.GetProvider(language);

    return string.Format(
        "{0}{1} {2:MMM} {3}",
        date.Day,
        suffixProvider.GetSuffix(date.Day),
        date,
        date.Year
    );
}

答案 2 :(得分:1)

来自msdn

string dateString = "5/1/2008 8:30:52 AM";
DateTime date1 = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture);

DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString("F", new System.Globalization.CultureInfo("fr-FR")));
// Displays samedi 1 mars 2008 07:00:00

您可以找到DateTime.ToString()模式here

答案 3 :(得分:0)

用英语显示月份名称的“天数月份年份”很容易:

var dt = new DateTime(2010,9,9);
var str = dt.ToString("d MMMM yyyy", CultureInfo.InvarientCulture);

给出:

9 September 2010

custom DateTime format strings中没有任何内容可以给出“st”等后缀,所以你需要自己做(未经测试):

var dt = get the date ...
var day = dt.Day;
var dayStr = day.ToString();
switch (day % 10) {
case 1:
   dayStr += "st";
   break;
case 2:
   dayStr += "nd";
   break;
default:
   dayStr += "th";
   break;
}

var result = String.Format({0} {1:MMMM yyyy}", dayStr, dt);

NB。这假定为英语:不同的语言具有不同的后缀,因此您需要构建自己的文化代码,因为NumberFormatInfo不提供序数。维基百科在此处提供了一些信息(并注意到需要包括性别一词):http://en.wikipedia.org/wiki/Ordinal_indicator