add ordinal case

This commit is contained in:
InspectorCaracal 2022-10-09 21:01:54 -06:00
parent 3970e82434
commit 00fe0a2d9d

View file

@ -2768,6 +2768,9 @@ _STR2INT_MAP = {
"seventy": 70, "eighty": 80, "ninety": 90, "seventy": 70, "eighty": 80, "ninety": 90,
"hundred": 100, "thousand": 1000, "hundred": 100, "thousand": 1000,
} }
_STR2INT_ADJS = {
"first": 1, "second": 2, "third": 3,
}
def str2int(number): def str2int(number):
""" """
Converts a string to an integer. Converts a string to an integer.
@ -2779,9 +2782,14 @@ def str2int(number):
int: The string represented as an integer. int: The string represented as an integer.
""" """
number = str(number) number = str(number)
original_input = number
try: try:
# it's a digit already # it's a digit already
return int(number) return int(number)
except:
# if it's an ordinal number such as "1st", it'll convert to int with the last two characters chopped off
try:
return int(number[:-2])
except: except:
pass pass
@ -2789,7 +2797,20 @@ def str2int(number):
# it's a single number, return it # it's a single number, return it
return i return i
number = number.replace(" and "," ") # convert sound changes for generic ordinal numbers
if number[-2:] == "th":
# remove "th"
number = number[:-2]
if number[-1] == "f":
# e.g. twelfth, fifth
number = number[:-1] + "ve"
elif number[-2:] == "ie":
# e.g. twentieth, fortieth
number = number[:-2] + "y"
# custom case for ninth
elif number[-3:] == "nin"
number += "e"
# split number words by spaces, hyphens and commas, to accommodate multiple styles # split number words by spaces, hyphens and commas, to accommodate multiple styles
numbers = [ word.lower() for word in re.split(r'[-\s\,]',number) if word ] numbers = [ word.lower() for word in re.split(r'[-\s\,]',number) if word ]
sums = [] sums = []
@ -2808,8 +2829,11 @@ def str2int(number):
else: else:
sums.append(i) sums.append(i)
else: else:
elif i := STR2INT_ADJS.get(word):
# it's a special adj word; ordinal case will never be a multiplier
sums.append(i)
else: else:
# invalid number-word, return None to error # invalid number-word, raise ValueError
return None raise ValueError(f"String {original_input} cannot be converted to int.")
return sum(sums) return sum(sums)