2010-09-09 5 views
0

J'ai besoin d'écrire des dates dans différentes langues. Est-il possible d'écrire une date du 1er juillet au 3 octobre en utilisant les cultures?Ajouter un suffixe à un nombre en utilisant les cultures

Impossible de le faire Des suggestions?

EDIT

Ce que je veux dire est que si la culture choisie est l'anglais, il devrait montrer 1er Octobre 2010 si l'espagnol devrait montrer l'équivalent pour le suffixe de note espagnole (1er etc ...)

+0

pourquoi -1, si vous donnez un moins s'il vous plaît ajouter un commentaire pourquoi – Ivo

+0

Que feriez-vous si un tel suffixe n'existe pas dans certaines langues? Et si c'est parfois un préfixe? Ou un mot séparé? (btw, je n'ai pas -1) – jalf

Répondre

2

Eh bien, si vous insistez absolument pour le faire, voici l'approche Je prendrais.

Définir une interface simple avec une méthode qui prend un nombre et crache un suffixe.Comme ceci:

interface INumberSuffixProvider 
{ 
    string GetSuffix(int number); 
} 

Maintenant, identifier les langues que vous souhaitez soutenir. Déterminez quels sont leurs suffixes. Ecrire une classe qui implémente INumberSuffixProvider pour chacun de ces langages (il peut être utile d'écrire une classe de base qui fournit une implémentation standard assez similaire à la plupart des langages).

Enfin, créer une classe d'usine pour créer une INumberSuffixProvider pour une chaîne de culture donnée:

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."); 
     } 
    } 
} 

Ce n'est pas la solution la plus simple, car elle nécessite un peu de travail de votre part. Mais si vous pouvez déterminer quelles langues vous voulez soutenir, au moins une fois que vous avez la structure de base en place (ce qui est juste une esquisse d'une idée, vraiment), mettre ce code à utiliser devrait être assez facile.

Par exemple:

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 
    ); 
} 
+0

Merci.Shame le cadre ne fournit pas une telle fonctionnalité.it à nous. merci pour une réponse très claire et une suggestion – user9969

1

De 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 

Vous pouvez trouver des modèles DateTime.ToString() here.

+0

Merci pour votre réponse, mais ce n'est pas ce que je cherche J'ai besoin d'afficher le 1er Juillet 2008 - 2e Août 2010 etc indépendamment de la Culture – user9969

+1

@ devnet247 - Vous devriez essayer d'écrire vos questions plus clairement alors, et explique réellement ce que vous voulez. C'est ce que j'aurais interprété comme demandant aussi. –

+0

@ devnet247: Je vous suggère de reformuler votre question, parce que vous ne savez pas très bien ce que c'est: vous parlez de 'langues' et de 'cultures' et maintenant vous dites que c'est indépendamment de la culture. Avez-vous des problèmes pour les afficher ou pour trouver les intervalles à afficher? – Rox

0

Affichage « jour numéro année mois nom » avec le nom du mois en anglais est assez facile:

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

donne:

9 September 2010 

Mais il n'y a rien à custom DateTime format strings pour donner « st » suffixes, donc vous aurez besoin de le faire vous-même (non testé):

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. Cela suppose l'anglais: différentes langues ont des suffixes différents, donc vous allez avoir besoin de construire votre propre code de culture, car NumberFormatInfo ne fournit pas de nombres oridinaux. Wikipedia a quelques informations à ce sujet (et notez que le mot genre doit être inclus) ici: http://en.wikipedia.org/wiki/Ordinal_indicator

+0

Merci Richard.Mais comment gérez-vous différentes cultures? – user9969

+0

@ devnet247: était déjà mise à jour sur ce point. Mais votre format n'est vraiment applicable que marginalement à l'anglais (on peut prononcer une date comme si elle était écrite avec des ordinaux, les suffixes ne sont pas normallement écrits, et cela va à l'encontre des guides de style). ce format ne traduit certainement pas. Lorsque vous écrivez pour une culture, utilisez le format de cette culture. – Richard

+0

@ devnet247: vous devrez analyser les cas pour chaque langue et ajouter un commutateur supplémentaire pour la culture. Selon le nombre de terminaisons, vous pourriez avoir un motif ou non. – Rox

4

Il n'y a rien de intégré au .NET Framework pour la mise en forme spécifique à la culture des nombres ordinaux, comme d'autres l'ont indiqué. Et en tout cas, dans de nombreuses langues, les ordinaux ne seraient pas utilisés dans les dates (par exemple en espagnol, la date d'aujourd'hui est "9 septembre 2009", pas "9 septembre 2009").

D'autres raisons pour lesquelles un framework à usage général tel que .NET n'est jamais susceptible d'inclure une méthode "GetOrdinalSuffix" sensible à la culture ou similaire incluent le genre (1er, 1ère en français; 1o, 1a en espagnol, ainsi que le fait qu'il peut y avoir plus d'une forme dans une langue donnée (1o/1º ou 1a/1ª en espagnol) -. celui que vous utiliseriez peut dépendre de l'encodage que vous utilisez lors de la sortie du texte

Toutes les suggestions ?

Ma suggestion serait de ne pas le faire, expliquez à vos utilisateurs que c'est complexe parce que vous devriez recherche chaque langue supportée, et les persuade de vivre sans les suffixes. Expliquez-leur aussi qu'il est préférable d'avoir des dates formatées comme toutes les autres applications qu'ils utilisent.

+0

Merci pour votre réponse. Je mets un cas "ne pas le faire" !!! – user9969

Questions connexes