2010-09-29 2 views
7

Est-ce que quelqu'un connaît une méthode pour convertir des mots comme «premier», «dixième» et «centième» en équivalent numérique?Existe-t-il une méthode simple de conversion d'une chaîne numérique ordinal en sa valeur numérique correspondante?

échantillons: "premier" -> 1, "seconde" -> 2, "dixième" -> 10, "centième" -> 100

Tout algorithme suffit, mais j'écris ceci en C#.

EDIT

Il est pas joli et ne fonctionne qu'avec un seul mot à la fois, mais il convient à mes besoins. Peut-être que quelqu'un peut l'améliorer, mais je n'ai plus de temps.

public static int GetNumberFromOrdinalString(string inputString) 
    { 
     string[] ordinalNumberWords = { "", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth", "thirteenth", "fourteenth", "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth" }; 
     string[] ordinalNumberWordsTens = { "", "tenth", "twentieth", "thirtieth", "fortieth", "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth" }; 
     string[] ordinalNumberWordsExtended = {"hundredth", "thousandth", "millionth", "billionth" }; 

     if (inputString.IsNullOrEmpty() || inputString.Length < 5 || inputString.Contains(" ")) return 0; 

     if (ordinalNumberWords.Contains(inputString) || ordinalNumberWordsTens.Contains(inputString)) 
     { 
      var outputMultiplier = ordinalNumberWords.Contains(inputString) ? 1 : 10; 
      var arrayToCheck = ordinalNumberWords.Contains(inputString) ? ordinalNumberWords : ordinalNumberWordsTens; 

      // Use the loop counter to get our output integer. 
      for (int x = 0; x < arrayToCheck.Count(); x++) 
      { 
       if (arrayToCheck[x] == inputString) 
       { 
        return x * outputMultiplier; 
       } 
      } 
     } 

     // Check if the number is one of our extended numbers and return the appropriate value. 
     if (ordinalNumberWordsExtended.Contains(inputString)) 
     { 
      return inputString == ordinalNumberWordsExtended[0] ? 100 : inputString == ordinalNumberWordsExtended[1] ? 1000 : inputString == ordinalNumberWordsExtended[2] ? 1000000 : 1000000000; 
     } 

     return 0; 
    } 
+0

Voulez-vous dire, convertir quelque chose comme : '231' à' 1 + 30 + 200'? – Ruel

+0

@Ruel, non, je pense que l'OP signifie 1 -> "premier", 10 -> "dixième", 100 -> "centième" –

+0

quelle hauteur voulez-vous aller avec cela? – BlackICE

Répondre

2

Je ne l'ai jamais donné autant au-delà de la pensée que je connais le mot « et » est censé être la transition des nombres entiers aux décimales. Comme

Cent Quatre-vingt dix-neuf dollars et dix cents

pas

Cent quatre-vingt-neuf dollars.

De toute façon, toute solution potentielle devrait analyser la chaîne d'entrée, déclencher des exceptions ou retourner la valeur.

Mais vous auriez à savoir « les règles » Cela semble être très arbitraire et basée sur la tradition, mais ce monsieur semble aussi bon endroit que tout à commencer:

Ask Dr. Math

+0

Si vous faites une règle que "et" est seulement utilisé dans la transition vers les décimales alors vous aurez tout un tas de problèmes lorsque vous essayez de vendre votre logiciel dans le Vieux Monde! Ici, au Royaume-Uni, nous disons généralement «cent un livres et dix-neuf pence», ou même «deux cent six jours jusqu'à mon anniversaire» - «cent un» nous semble très américain. – AAT

+0

Yup, base arbitraire et tradition. Merci pour la bonne langue btw. Nous avons seulement dû faire quelques changements. :-) –

0

Je pense vous pourriez finir par devoir mapper des chaînes à des valeurs jusqu'à la gamme maximale que vous attendez, puis analyser la chaîne dans l'ordre et placer les valeurs en tant que telles. Comme il y a très peu de conventions de dénomination régulière dans l'ordre de grandeur, je ne pense pas qu'il existe un moyen élégant ou facile d'analyser un mot pour obtenir sa valeur numérique. Heureusement, selon le format, vous n'avez probablement qu'à cartographier tous les ordres de grandeur. Par exemple, si vous attendez seulement les nombres 0-100 et qu'ils sont entrés comme "quatre-vingt-dix-neuf", alors vous avez seulement besoin de mapper 0-9, puis 10-100 par pas de 10.

Questions connexes