13 Soru: Sayı kelimelerini Tam Sayılara dönüştürmenin bir yolu var mı?

tarafından oluşturulan soru Fri, Mar 25, 2016 12:00 AM

one’u 1’a, two’u 2’a dönüştürmem gerekiyor.

Bunu bir kütüphane veya sınıfla veya başka bir şeyle yapmanın bir yolu var mı?

    
53
  1. 2009-01-30 17: 34: 56Z
  2. Belki bu yararlı olabilir: pastebin.com/WwFCjYtt
    2015-10-26 09: 42: 03Z
  3. Eğer kimse hala bunun için bir cevap arıyorsa, aşağıdaki tüm cevaplardan ilham aldım ve bir python paketi oluşturdum: github.com/careless25/text2digits
    2019-03-31 03: 51: 26Z
  4. Bu süreci geliştirmek ve genişletmek için aşağıdaki örnekleri kullandım, ancak daha sonra başvurmak üzere ispanyolcaya: github.com/elbaulp/text2digits_es
    2019-06-28 06: 35: 06Z
13 Yanıtlar                              13                         

Bu kodun çoğu, yalnızca ilk aramada yapılan sayıları dikte etmektir.

 
def text2int(textnum, numwords={}):
    if not numwords:
      units = [
        "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
        "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
        "sixteen", "seventeen", "eighteen", "nineteen",
      ]

      tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]

      scales = ["hundred", "thousand", "million", "billion", "trillion"]

      numwords["and"] = (1, 0)
      for idx, word in enumerate(units):    numwords[word] = (1, idx)
      for idx, word in enumerate(tens):     numwords[word] = (1, idx * 10)
      for idx, word in enumerate(scales):   numwords[word] = (10 ** (idx * 3 or 2), 0)

    current = result = 0
    for word in textnum.split():
        if word not in numwords:
          raise Exception("Illegal word: " + word)

        scale, increment = numwords[word]
        current = current * scale + increment
        if scale > 100:
            result += current
            current = 0

    return result + current

print text2int("seven billion one hundred million thirty one thousand three hundred thirty seven")
#7100031337
    
96
2013-01-17 14: 31: 52Z
  1. FYI, bu tarihlerle çalışmaz. Deneyin: print text2int("nineteen ninety six") # 115
    2014-05-13 14: 26: 53Z
  2. 1996'yı sayılarla yazmanın doğru yolu "bin dokuz yüz doksan altı" dır. Yılları desteklemek istiyorsanız, farklı bir koda ihtiyacınız olacak.
    2014-05-13 15: 08: 27Z
  3. Marc Burns tarafından bir yakut mücevher var bu yapar. Geçenlerde yıllarca destek eklemeye zorladım. python'dan ruby ​​ 'i arayabilirsiniz.
    2015-03-05 20: 14: 52Z
  4. 'Yüz altı' denemesi için ayrıldı. yazdır (text2int ("hundred and six")) .. ayrıca yazdır (text2int ("bin"))
    2017-02-26 08: 43: 54Z
  5. Bu sayıları yazmanın doğru yolu yüz altı ile bindir. Ancak bu davaları ele almanız gerekiyorsa, destek eklemek için çekinmeyin.
    2017-02-26 15: 27: 02Z

Herhangi biri ilgileniyorsa, dizenin geri kalanını koruyan bir sürümü hackledim (hatalar olsa da, çok fazla test etmemiş olabilir).

 
def text2int (textnum, numwords={}):
    if not numwords:
        units = [
        "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
        "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
        "sixteen", "seventeen", "eighteen", "nineteen",
        ]

        tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]

        scales = ["hundred", "thousand", "million", "billion", "trillion"]

        numwords["and"] = (1, 0)
        for idx, word in enumerate(units):  numwords[word] = (1, idx)
        for idx, word in enumerate(tens):       numwords[word] = (1, idx * 10)
        for idx, word in enumerate(scales): numwords[word] = (10 ** (idx * 3 or 2), 0)

    ordinal_words = {'first':1, 'second':2, 'third':3, 'fifth':5, 'eighth':8, 'ninth':9, 'twelfth':12}
    ordinal_endings = [('ieth', 'y'), ('th', '')]

    textnum = textnum.replace('-', ' ')

    current = result = 0
    curstring = ""
    onnumber = False
    for word in textnum.split():
        if word in ordinal_words:
            scale, increment = (1, ordinal_words[word])
            current = current * scale + increment
            if scale > 100:
                result += current
                current = 0
            onnumber = True
        else:
            for ending, replacement in ordinal_endings:
                if word.endswith(ending):
                    word = "%s%s" % (word[:-len(ending)], replacement)

            if word not in numwords:
                if onnumber:
                    curstring += repr(result + current) + " "
                curstring += word + " "
                result = current = 0
                onnumber = False
            else:
                scale, increment = numwords[word]

                current = current * scale + increment
                if scale > 100:
                    result += current
                    current = 0
                onnumber = True

    if onnumber:
        curstring += repr(result + current)

    return curstring

Örnek:

 
 >>> text2int("I want fifty five hot dogs for two hundred dollars.")
 I want 55 hot dogs for 200 dollars.

"200 $" demeniz durumunda sorunlar olabilir. Ancak, bu gerçekten zordu.

    
12
2017-01-02 09: 15: 39Z
  1. Bu ve diğer kod parçacıklarını buradan alıp bir python kütüphanesine yerleştirdim: github.com/careless25/text2digits
    2019-03-31 02: 52: 59Z

Kod pasajı için teşekkürler ... çok zaman kazandırdı!

Sıralı kelimeler ("ilk", "ikinci"), tirelenmiş kelimeler ("yüz") ve "" elli yedinci ") gibi tirelenmiş sıralı kelimeler gibi birkaç ek ayrıştırma durumuyla ilgilenmem gerekiyordu. bu yüzden birkaç satır ekledim:

 
def text2int(textnum, numwords={}):
    if not numwords:
        units = [
        "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
        "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
        "sixteen", "seventeen", "eighteen", "nineteen",
        ]

        tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]

        scales = ["hundred", "thousand", "million", "billion", "trillion"]

        numwords["and"] = (1, 0)
        for idx, word in enumerate(units):  numwords[word] = (1, idx)
        for idx, word in enumerate(tens):       numwords[word] = (1, idx * 10)
        for idx, word in enumerate(scales): numwords[word] = (10 ** (idx * 3 or 2), 0)

    ordinal_words = {'first':1, 'second':2, 'third':3, 'fifth':5, 'eighth':8, 'ninth':9, 'twelfth':12}
    ordinal_endings = [('ieth', 'y'), ('th', '')]

    textnum = textnum.replace('-', ' ')

    current = result = 0
    for word in textnum.split():
        if word in ordinal_words:
            scale, increment = (1, ordinal_words[word])
        else:
            for ending, replacement in ordinal_endings:
                if word.endswith(ending):
                    word = "%s%s" % (word[:-len(ending)], replacement)

            if word not in numwords:
                raise Exception("Illegal word: " + word)

            scale, increment = numwords[word]

         current = current * scale + increment
         if scale > 100:
            result += current
            current = 0

    return result + current`
    
9
2009-02-28 17: 34: 48Z
  1. Not: Bu, hundredth, thousandth vb. için sıfır döndürür. one hundredth almak için 100 kullanın!
    2016-03-26 18: 50: 00Z

Az önce PyPI'ye word2number adlı bir python modülünü yayınladım. https://github.com/akshaynagpal/w2n

Kullanarak kurun:

 
pip install word2number

pip'inizin en son sürüme güncellendiğinden emin olun.

Kullanım:

 
from word2number import w2n

print w2n.word_to_num("two million three thousand nine hundred and eighty four")
2003984
    
7
2016-01-02 18: 48: 01Z
  1. Paketinizi denedim. "1 million" veya "1M" gibi dizeleri kullanmayı öneririm. w2n.word_to_num ("1 milyon") hata atar.
    2016-05-04 19: 50: 56Z
  2. @ Ray Bunu denediğiniz için teşekkür ederiz. Lütfen bir sorunu github.com/akshaynagpal/w2n/issues adresinde yayınlayabilir misiniz? İsterseniz ayrıca katkıda bulunabilirsiniz. Aksi takdirde, bir sonraki sürümde bu konuya kesinlikle bakacağım. Tekrar teşekkürler!
    2016-05-04 20: 33: 19Z
  3. Bu paketi kullanmamaya dikkat edin: github .com /akshaynagpal /W2N /sorunlar /7
    2016-08-07 01: 24: 19Z
  4. Robert, Açık kaynaklı yazılım tamamen onu işbirliğine göre geliştiren insanlar hakkında. Bir kütüphane istedim ve insanların da istediğini gördüm. Böylece yaptım. Üretim seviyesi sistemler için hazır olmayabilir veya ders kitaplarındaki buzzwords ile uyumlu olmayabilir. Ancak, bu amaç için çalışır. Ayrıca, tüm kullanıcılar için daha da geliştirilebilmesi için bir PR gönderebilmeniz harika olurdu.
    2016-08-07 06: 27: 42Z

Girişim bir konuşmadan metne dönüştürmeden geldiğinden ve çözüm her zaman sayıları toplayamadığından, biraz farklı bir şeye ihtiyacım vardı. Örneğin, "posta kodum bir iki üç dört beş" "posta kodum 15" e dönmemelidir.

Andrew’un yanıtını aldım ve hata olarak vurgulanan diğer birkaç olayı ele almak için ince ayar yaptım ve bunun gibi örnekler için destek de ekledim Yukarıda belirtilen posta kodu. Bazı temel test durumları aşağıda gösterilmektedir, ancak hala iyileştirme için yer olduğundan eminim.

 
def is_number(x):
    if type(x) == str:
        x = x.replace(',', '')
    try:
        float(x)
    except:
        return False
    return True

def text2int (textnum, numwords={}):
    units = [
        'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
        'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen',
        'sixteen', 'seventeen', 'eighteen', 'nineteen',
    ]
    tens = ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']
    scales = ['hundred', 'thousand', 'million', 'billion', 'trillion']
    ordinal_words = {'first':1, 'second':2, 'third':3, 'fifth':5, 'eighth':8, 'ninth':9, 'twelfth':12}
    ordinal_endings = [('ieth', 'y'), ('th', '')]

    if not numwords:
        numwords['and'] = (1, 0)
        for idx, word in enumerate(units): numwords[word] = (1, idx)
        for idx, word in enumerate(tens): numwords[word] = (1, idx * 10)
        for idx, word in enumerate(scales): numwords[word] = (10 ** (idx * 3 or 2), 0)

    textnum = textnum.replace('-', ' ')

    current = result = 0
    curstring = ''
    onnumber = False
    lastunit = False
    lastscale = False

    def is_numword(x):
        if is_number(x):
            return True
        if word in numwords:
            return True
        return False

    def from_numword(x):
        if is_number(x):
            scale = 0
            increment = int(x.replace(',', ''))
            return scale, increment
        return numwords[x]

    for word in textnum.split():
        if word in ordinal_words:
            scale, increment = (1, ordinal_words[word])
            current = current * scale + increment
            if scale > 100:
                result += current
                current = 0
            onnumber = True
            lastunit = False
            lastscale = False
        else:
            for ending, replacement in ordinal_endings:
                if word.endswith(ending):
                    word = "%s%s" % (word[:-len(ending)], replacement)

            if (not is_numword(word)) or (word == 'and' and not lastscale):
                if onnumber:
                    # Flush the current number we are building
                    curstring += repr(result + current) + " "
                curstring += word + " "
                result = current = 0
                onnumber = False
                lastunit = False
                lastscale = False
            else:
                scale, increment = from_numword(word)
                onnumber = True

                if lastunit and (word not in scales):                                                                                                                                                                                                                                         
                    # Assume this is part of a string of individual numbers to                                                                                                                                                                                                                
                    # be flushed, such as a zipcode "one two three four five"                                                                                                                                                                                                                 
                    curstring += repr(result + current)                                                                                                                                                                                                                                       
                    result = current = 0                                                                                                                                                                                                                                                      

                if scale > 1:                                                                                                                                                                                                                                                                 
                    current = max(1, current)                                                                                                                                                                                                                                                 

                current = current * scale + increment                                                                                                                                                                                                                                         
                if scale > 100:                                                                                                                                                                                                                                                               
                    result += current                                                                                                                                                                                                                                                         
                    current = 0                                                                                                                                                                                                                                                               

                lastscale = False                                                                                                                                                                                                              
                lastunit = False                                                                                                                                                
                if word in scales:                                                                                                                                                                                                             
                    lastscale = True                                                                                                                                                                                                         
                elif word in units:                                                                                                                                                                                                             
                    lastunit = True

    if onnumber:
        curstring += repr(result + current)

    return curstring

Bazı testler ...

 
one two three -> 123
three forty five -> 345
three and forty five -> 3 and 45
three hundred and forty five -> 345
three hundred -> 300
twenty five hundred -> 2500
three thousand and six -> 3006
three thousand six -> 3006
nineteenth -> 19
twentieth -> 20
first -> 1
my zip is one two three four five -> my zip is 12345
nineteen ninety six -> 1996
fifty-seventh -> 57
one million -> 1000000
first hundred -> 100
I will buy the first thousand -> I will buy the 1000  # probably should leave ordinal in the string
thousand -> 1000
hundred and six -> 106
1 million -> 1000000
    
7
2018-11-20 20: 00: 30Z
  1. Cevabınızı alıp bazı hataları düzelttim. "Yirmi on" için destek eklendi - > 2010 ve genel olarak tüm onlarca. Burada bulabilirsiniz: github.com/careless25/text2digits
    2019-03-31 02: 51: 03Z

İşte önemsiz vaka yaklaşımı:

 
>>> number = {'one':1,
...           'two':2,
...           'three':3,}
>>> 
>>> number['two']
2

Yoksa "on iki bin, yüz yetmiş iki" ile baş edebilecek bir şey mi arıyorsunuz?

    
4
2009-01-29 20: 25: 24Z

Ayrıştırmak istediğiniz sınırlı sayıda numara varsa, bu kolayca bir sözlükte kodlanmış olabilir.

Biraz daha karmaşık durumlar için, nispeten basit sayılar gramerini temel alarak bu sözlüğü otomatik olarak oluşturmak isteyeceksiniz. Bunun çizgisinde bir şey (elbette genelleştirilmiş ...)

 
for i in range(10):
   myDict[30 + i] = "thirty-" + singleDigitsDict[i]

Daha kapsamlı bir şeye ihtiyacınız olursa, doğal dil işleme araçlarına ihtiyacınız olacak gibi görünüyor. Bu makale iyi bir başlangıç ​​noktası olabilir.

    
3
2009-01-29 20: 28: 09Z

Bu, ilk cevapta kodun c # uygulamasıdır:

 
public static double ConvertTextToNumber(string text)
{
    string[] units = new string[] {
        "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
        "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
        "sixteen", "seventeen", "eighteen", "nineteen",
    };

    string[] tens = new string[] {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};

    string[] scales = new string[] { "hundred", "thousand", "million", "billion", "trillion" };

    Dictionary<string, ScaleIncrementPair> numWord = new Dictionary<string, ScaleIncrementPair>();
    numWord.Add("and", new ScaleIncrementPair(1, 0));
    for (int i = 0; i < units.Length; i++)
    {
        numWord.Add(units[i], new ScaleIncrementPair(1, i));
    }

    for (int i = 1; i < tens.Length; i++)
    {
        numWord.Add(tens[i], new ScaleIncrementPair(1, i * 10));                
    }

    for (int i = 0; i < scales.Length; i++)
    {
        if(i == 0)
            numWord.Add(scales[i], new ScaleIncrementPair(100, 0));
        else
            numWord.Add(scales[i], new ScaleIncrementPair(Math.Pow(10, (i*3)), 0));
    }

    double current = 0;
    double result = 0;

    foreach (var word in text.Split(new char[] { ' ', '-', '—'}))
    {
        ScaleIncrementPair scaleIncrement = numWord[word];
        current = current * scaleIncrement.scale + scaleIncrement.increment;
        if (scaleIncrement.scale > 100)
        {
            result += current;
            current = 0;
        }
    }
    return result + current;
}


public struct ScaleIncrementPair
{
    public double scale;
    public int increment;
    public ScaleIncrementPair(double s, int i)
    {
        scale = s;
        increment = i;
    }
}
    
3
2013-04-23 14: 21: 10Z
  1. Bu hoşuma gidiyor - aynı cevabı uygulamak için farklı şekillerde genişleyen cevapların uzantılarını görmek. Soru zaten yanıtlandığından, araştırmacının belirlemediği bir dilde uygulamaktan zarar gelmez. Ancak , , kodu denemek ve uygulamak için gelenlere yardım eder. Bu sorunun gelecekteki okuyucularına yardımcı olmak için, +1
    2013-08-30 04: 32: 18Z

e_h'in C # uygulamasının hızlı ve kirli Java portu (yukarıda). Her ikisinin de int ile değil, double ile döndüğünü unutmayın.

 
public class Text2Double {

    public double Text2Double(String text) {

        String[] units = new String[]{
                "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
                "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
                "sixteen", "seventeen", "eighteen", "nineteen",
        };

        String[] tens = new String[]{"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};

        String[] scales = new String[]{"hundred", "thousand", "million", "billion", "trillion"};

        Map<String, ScaleIncrementPair> numWord = new LinkedHashMap<>();
        numWord.put("and", new ScaleIncrementPair(1, 0));


        for (int i = 0; i < units.length; i++) {
            numWord.put(units[i], new ScaleIncrementPair(1, i));
        }

        for (int i = 1; i < tens.length; i++) {
            numWord.put(tens[i], new ScaleIncrementPair(1, i * 10));
        }

        for (int i = 0; i < scales.length; i++) {
            if (i == 0)
                numWord.put(scales[i], new ScaleIncrementPair(100, 0));
            else
                numWord.put(scales[i], new ScaleIncrementPair(Math.pow(10, (i * 3)), 0));
        }

        double current = 0;
        double result = 0;

        for(String word : text.split("[ -]"))
        {
            ScaleIncrementPair scaleIncrement = numWord.get(word);
            current = current * scaleIncrement.scale + scaleIncrement.increment;
            if (scaleIncrement.scale > 100) {
                result += current;
                current = 0;
            }
        }
        return result + current;
    }
}

public class ScaleIncrementPair
{
    public double scale;
    public int increment;

    public ScaleIncrementPair(double s, int i)
    {
        scale = s;
        increment = i;
    }
}
    
2
2017-02-16 20: 57: 28Z

Değişiklik yapıldı, böylece text2int (scale) doğru dönüşüme dönecek. Örneğin, text2int ("hundred") = > 100.

 
import re

numwords = {}


def text2int(textnum):

    if not numwords:

        units = [ "zero", "one", "two", "three", "four", "five", "six",
                "seven", "eight", "nine", "ten", "eleven", "twelve",
                "thirteen", "fourteen", "fifteen", "sixteen", "seventeen",
                "eighteen", "nineteen"]

        tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", 
                "seventy", "eighty", "ninety"]

        scales = ["hundred", "thousand", "million", "billion", "trillion", 
                'quadrillion', 'quintillion', 'sexillion', 'septillion', 
                'octillion', 'nonillion', 'decillion' ]

        numwords["and"] = (1, 0)
        for idx, word in enumerate(units): numwords[word] = (1, idx)
        for idx, word in enumerate(tens): numwords[word] = (1, idx * 10)
        for idx, word in enumerate(scales): numwords[word] = (10 ** (idx * 3 or 2), 0)

    ordinal_words = {'first':1, 'second':2, 'third':3, 'fifth':5, 
            'eighth':8, 'ninth':9, 'twelfth':12}
    ordinal_endings = [('ieth', 'y'), ('th', '')]
    current = result = 0
    tokens = re.split(r"[\s-]+", textnum)
    for word in tokens:
        if word in ordinal_words:
            scale, increment = (1, ordinal_words[word])
        else:
            for ending, replacement in ordinal_endings:
                if word.endswith(ending):
                    word = "%s%s" % (word[:-len(ending)], replacement)

            if word not in numwords:
                raise Exception("Illegal word: " + word)

            scale, increment = numwords[word]

        if scale > 1:
            current = max(1, current)

        current = current * scale + increment
        if scale > 100:
            result += current
            current = 0

    return result + current
    
1
2011-10-03 06: 48: 21Z
  1. 100'ün doğru ingilizce yazımının "yüz" olduğunu düşünüyorum.
    2011-04-27 20: 14: 24Z
  2. @ recursive kesinlikle haklısınız, ancak bu kodun avantajı "yüzüncü" yi kullanmasıdır (belki de Dawa'nın vurgulamaya çalıştığı şey budur). Açıklamanın sesinden, diğer benzer kodun "yüzüncü" olması gerekiyordu ve bu her zaman yaygın olarak kullanılan bir terim değildi (örneğin, "atılması gereken yüzüncü maddeyi seçtiği" gibi)
    2016-12-29 23: 05: 03Z

Marc Burns'ün yaptığı bir yakut mücevher var. Geçenlerde yıllarca destek eklemeye zorladım. yakut kodunu python'dan arayabilirsiniz.

 
  require 'numbers_in_words'
  require 'numbers_in_words/duck_punch'

  nums = ["fifteen sixteen", "eighty five sixteen",  "nineteen ninety six",
          "one hundred and seventy nine", "thirteen hundred", "nine thousand two hundred and ninety seven"]
  nums.each {|n| p n; p n.in_numbers}

sonuç:
"fifteen sixteen" 1516 "eighty five sixteen" 8516 "nineteen ninety six" 1996 "one hundred and seventy nine" 179 "thirteen hundred" 1300 "nine thousand two hundred and ninety seven" 9297

    
1
2016-10-29 16: 34: 11Z
  1. Lütfen python'dan ruby ​​kodunu ya da ruby'den python kodunu aramayın. Böyle bir şeyin taşınması için yeterince yakınlar.
    2016-10-10 11: 51: 01Z
  2. Kabul edildi, ancak aktarılana kadar ruby ​​kodunu çağırmak hiç yoktan iyidir.
    2016-10-10 12: 59: 42Z
  3. Çok karmaşık değil, altında @recursive, kullanılabilecek bir mantık (birkaç kod satırıyla) sağlamıştır.
    2016-10-10 13: 00: 20Z
  4. Aslında bana "onbeş on altı" nın yanlış olduğu görünüyor?
    2016-10-29 10: 21: 20Z
  5. @ yekta Doğru, özyinelemenin cevabının SO cevabı kapsamında iyi olduğunu düşünüyorum. Ancak, gem testleri ve diğer özellikleri ile tam bir paket sunar. Her neyse, bence ikisinin de yeri var.
    2016-10-29 16: 37: 02Z

Hızlı bir çözüm, çeviri için sözlük oluşturmak üzere inflect.py 'yi kullanmaktır.

inflect.py, bir sayıyı (örneğin, number_to_words()) kelime biçimine (örneğin, 2) çevirecek olan 'two' işlevine sahiptir. Ne yazık ki, bunun tersi (çeviri sözlüğü yolundan kaçınmanıza izin verecek) önerilmemiştir. Aynı şekilde, çeviri sözlüğünü oluşturmak için bu işlevi kullanabilirsiniz:  
>>> import inflect
>>> p = inflect.engine()
>>> word_to_number_mapping = {}
>>>
>>> for i in range(1, 100):
...     word_form = p.number_to_words(i)  # 1 -> 'one'
...     word_to_number_mapping[word_form] = i
...
>>> print word_to_number_mapping['one']
1
>>> print word_to_number_mapping['eleven']
11
>>> print word_to_number_mapping['forty-three']
43

Biraz zaman ayırmaya istekli iseniz, inflect.py'nin number_to_words() işlevinin iç çalışmalarını incelemek ve bunu dinamik bir şekilde yapmak için kendi kodunuzu oluşturmak mümkün olabilir (     

0
2014-02-14 23: 05: 42Z
 
This code works only for numbers below 99.
both word to Int and int to word.
(for rest need to implement 10-20 lines of code and simple logic. This is just simple code for beginners)


num=input("Enter the number you want to convert : ")
mydict={'1': 'One', '2': 'Two', '3': 'Three', '4': 'Four', '5': 'Five','6': 'Six', '7': 'Seven', '8': 'Eight', '9': 'Nine', '10': 'Ten','11': 'Eleven', '12': 'Twelve', '13': 'Thirteen', '14': 'Fourteen', '15': 'Fifteen', '16': 'Sixteen', '17': 'Seventeen', '18': 'Eighteen', '19': 'Nineteen'}
mydict2=['','','Twenty','Thirty','Fourty','fifty','sixty','Seventy','Eighty','Ninty']
if num.isdigit():
    if(int(num)<20):
        print(" :---> "+mydict[num])
    else:
            var1=int(num)%10
            var2=int(num)/10
            print(" :---> "+mydict2[int(var2)]+mydict[str(var1)])
else:
    num=num.lower();
    dict_w={'one':1,'two':2,'three':3,'four':4,'five':5,'six':6,'seven':7,'eight':8,'nine':9,'ten':10,'eleven':11,'twelve':12,'thirteen':13,'fourteen':14,'fifteen':15,'sixteen':16,'seventeen':'17','eighteen':'18','nineteen':'19'}
    mydict2=['','','twenty','thirty','fourty','fifty','sixty','seventy','eighty','ninty']
    divide=num[num.find("ty")+2:]
    if num:
        if(num in dict_w.keys()):
            print(" :---> "+str(dict_w[num]))
        elif divide=='' :
                for i in range(0, len(mydict2)-1):
                   if mydict2[i] == num:
                      print(" :---> "+str(i*10))
        else :
            str3=0
            str1=num[num.find("ty")+2:]
            str2=num[:-len(str1)]
            for i in range(0, len(mydict2) ):
                if mydict2[i] == str2:
                    str3=i;
            if str2 not in mydict2:
                print("----->Invalid Input<-----")                
            else:
                try:
                    print(" :---> "+str((str3*10)+dict_w[str1]))
                except:
                    print("----->Invalid Input<-----")
    else:
            print("----->Please Enter Input<-----")
    
- 2
2017-08-21 12: 09: 03Z
  1. lütfen bu kodun ne yaptığını ve nasıl yaptığını açıklayın. Bu şekilde cevabınız henüz kodlamayı iyi anlamayanlar için daha değerli.
    2017-08-21 12: 14: 43Z
  2. Kullanıcı, giriş programı olarak rakam verirse, kelimeleri tersine çevirir ve örneğin 5-> beş ve Beş -> 5. 100, ancak yalnızca birkaç kod satırı ekleyerek herhangi bir alana genişletilebilir.
    2017-12-06 06: 45: 21Z
kaynak yerleştirildi İşte
Diğer sorular