2010-09-29 10 views
7

Qualcuno sa di un metodo per convertire parole come "prima", "decimo" e "un centesimo" in equivalente numerico?Esiste un metodo semplice per convertire una stringa numerica ordinale in un valore numerico corrispondente?

Campioni: "prima" -> 1, "secondo" -> 2, "decimo" -> 10, "centesimo" -> 100

qualsiasi algoritmo sarà sufficiente, ma sto scrivendo questo in C#.

EDIT

Non è bello e funziona solo con una parola alla volta, ma si adatta al mio scopo. Forse qualcuno può migliorarlo ma sono fuori tempo.

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

Vuoi dire, convertire qualcosa come : '231' a' 1 + 30 + 200'? – Ruel

+0

@Ruel, no, penso che l'OP indichi 1 -> "primo", 10 -> "decimo", 100 -> "un centesimo" –

+0

quanto in alto vuoi andare con questo? – BlackICE

risposta

2

Non ho mai dato questo molto pensiero al di là So che la parola "e" dovrebbe essere il passaggio da numeri interi a decimali. Come

One Hundred Ninety-Nine dollari e dieci centesimi

non

centonovanta-nove dollari.

In ogni caso qualsiasi soluzione potenziale dovrebbe analizzare la stringa di input, aumentare eventuali eccezioni o altrimenti restituire il valore.

Ma in primo luogo dovreste sapere "le regole" Questo sembra essere molto arbitraria e basata sulla tradizione, ma questo signore sembra buono un posto come un altro per iniziare:

Ask Dr. Math

+0

Se si imposta una regola che "e" viene utilizzata solo nella transizione verso i decimali, si avrà un sacco di problemi quando si tenta di vendere il software nel vecchio mondo! Qui nel Regno Unito generalmente diciamo "cento E una sterlina e diciannove penny", o anche "duecentosei giorni fino al mio compleanno" - "centouno" suona molto americano per noi. – AAT

+0

Yup, base arbitraria e tradizione. Grazie per l'ottimo linguaggio btw. Abbiamo solo dovuto apportare alcune modifiche ad esso. :-) –

0

penso potresti finire per dover mappare le stringhe ai valori fino all'intervallo massimo che ti aspetti e quindi analizzare la stringa in ordine e posizionare i valori come tali. Dal momento che la convenzione di denominazione è molto piccola e in ordine di grandezza, non credo che esista un modo elegante o semplice per analizzare una parola per ottenere il suo valore numerico. Fortunatamente, a seconda del formato, probabilmente devi solo mappare ogni ordine di grandezza. Ad esempio, se ti aspetti solo numeri 0-100 e vengono immessi come "novantanove", devi solo mappare 0-9, quindi 10-100 in passaggi di 10.

Problemi correlati