0

先頭のゼロを失うことなく、数値、文字列内のエーテル、または int を単語に変換する方法はありますか? 日付と時刻と電話番号を単語に変換しようとしていますが、2 番目に文字列値を int に変換すると、先頭のゼロが失われます。

ここに、数字を単語に変換するための現在のコードがあり、先行ゼロがない限りうまく機能します。これが私の問題の例です...たとえば、日付を2004年8月2日に回しているとしましょうこれをゼロエイトゼロツーとして出力したくない...などですが、現在の状態でそれを行うにはメソッドについていくつかのラウンドを行う必要があります...何かが欠けていない限り。

units = ["", "one", "two", "three", "four",  "five", 
    "six", "seven", "eight", "nine "]
teens = ["", "eleven", "twelve", "thirteen",  "fourteen", 
    "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
tens = ["", "ten", "twenty", "thirty", "forty",
    "fifty", "sixty", "seventy", "eighty", "ninety"]
thousands = ["","thousand", "million",  "billion",  "trillion", 
    "quadrillion",  "quintillion",  "sextillion",  "septillion", "octillion", 
    "nonillion",  "decillion",  "undecillion",  "duodecillion",  "tredecillion", 
    "quattuordecillion",  "sexdecillion",  "septendecillion",  "octodecillion", 
    "novemdecillion",  "vigintillion "]

def numToWords(self, num):
    words = []
    if num == 0:
        words.append("zero")
    else:
        numStr = "%d" % num
        numStrLen = len(numStr)
        groups = (numStrLen + 2) / 3
        numStr = numStr.zfill(groups * 3)
        for i in range(0, groups*3, 3):
            h = int(numStr[i])
            t = int(numStr[i+1])
            u = int(numStr[i+2])
            g = groups - (i / 3 + 1)

            if h >= 1:
                words.append(units[h])
                words.append("hundred")

            if t > 1:
                words.append(tens[t])
                if u >= 1:
                    words.append(units[u])
            elif t == 1:
                if u >= 1:
                    words.append(teens[u])
                else:
                    words.append(tens[t])
            else:
                if u >= 1:
                    words.append(units[u])

            if g >= 1 and (h + t + u) > 0:
                words.append(thousands[g])
    return ' '.join([w for w in words]) 

これに関するヘルプや提案をいただければ幸いです。

4

3 に答える 3

1

最初に文字列を指定していることを確認し、必要な場合にのみ int として評価してください。例えば:

def numToWords(self, numStr):
    words = []
    if int(numStr) == 0:
        words.append("zero")
    else:
        # no longer needed, it's already a string
        # numStr = "%d" % num
        numStrLen = len(numStr)
        groups = (numStrLen + 2) /
        ...
于 2013-07-19T00:11:24.083 に答える
1

%d を使用して int を文字列にフォーマットすると、先頭のゼロが削除されます。それらを保持するには、次のように最小桁数を指定する必要があります。

numStr = "%03d" % num

これにより、3 桁未満の数値の先頭にゼロが追加されます (この場合、最小桁数は 3 になります)。しかし、先頭の 0 をむやみに平手打ちする前に、最初に表示する合計桁数を決定する必要があります。

于 2013-07-19T00:16:22.077 に答える
0

再帰的アプローチを使用したこのソリューションはどうですか?

def numToWords(i):
    if i < 20:
        result = 'zero,one,two,three,four,five,six,\
                  seven,eight,nine,ten,eleven,twelve,\
                  thirteen,fourteen,fifteen,sixteen,\
                  seventeen,eighteen,nineteen'.split(',')[i]
    elif i < 100:
        result = ',,twenty,thirty,forty,fifty,sixty,seventy,\
                    eighty,ninety'.split(',')[i//10]
        if i % 10:
            result += ' ' + numToWords(i % 10)
    elif i < 1000:
        result = checkio(i // 100) + ' hundred'
        if i % 100:
            result += ' ' + numToWords(i % 100)
    return result
于 2013-12-17T12:33:03.160 に答える