Ordinal Numbers Replacement

Ordinal numbers replacement

The package number-parser can parse ordinal words ("first", "second", etc) to integers.

from number_parser import parse_ordinal
n = parse_ordinal("first")

To convert an integer to "1st", "2nd", etc, you can use the following (taken from Gareth on codegolf):

ordinal = lambda n: "%d%s" % (n,"tsnrhtdd"[(n//10%10!=1)*(n%10<4)*n%10::4])

This works on any number:

print([ordinal(n) for n in range(1,32)])

['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th',
'11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th',
'20th', '21st', '22nd', '23rd', '24th', '25th', '26th', '27th', '28th',
'29th', '30th', '31st']

Find ordinal numbers with loop dynamically: find th - st - nd - rd

So, the problem is that 111 gets displayed as 111st instead of 111th.

You have 11 as ex1, I assume short for "exception 1", but your condition:

if number == ex1:

Clearly doesn't match 111.

Instead you could do:

if number % 100 == ex1:

Which will be true for 11, 111, 211 etc.

On a side note:

elif number % 10 == 1 or not ex1:

Clearly isn't what you intended. This is interpreted as:

elif (number % 10 == 1) or (not ex1):

not ex1 does not depend on number and will always evaluate the same way (False). But since you're already checking ex1 separately, it would be redundant to do it correctly here.

If you wanted to correct that, so that you don't need to check ex1 twice, you'd do this:

if number % 10 == 1 and number % 100 != 11:

I think in this case using != is clearer than not and I don't think there is any benefit from assigning a variable to 11.

Add st, nd, rd and th (ordinal) suffix to a number

The rules are as follows:

  • st is used with numbers ending in 1 (e.g. 1st, pronounced first)
  • nd is used with numbers ending in 2 (e.g. 92nd, pronounced ninety-second)
  • rd is used with numbers ending in 3 (e.g. 33rd, pronounced thirty-third)
  • As an exception to the above rules, all the "teen" numbers ending with 11, 12 or 13 use -th (e.g. 11th, pronounced eleventh, 112th,
    pronounced one hundred [and] twelfth)
  • th is used for all other numbers (e.g. 9th, pronounced ninth).

The following JavaScript code (rewritten in Jun '14) accomplishes this:

function ordinal_suffix_of(i) {
var j = i % 10,
k = i % 100;
if (j == 1 && k != 11) {
return i + "st";
}
if (j == 2 && k != 12) {
return i + "nd";
}
if (j == 3 && k != 13) {
return i + "rd";
}
return i + "th";
}

Sample output for numbers between 0-115:

  0  0th
1 1st
2 2nd
3 3rd
4 4th
5 5th
6 6th
7 7th
8 8th
9 9th
10 10th
11 11th
12 12th
13 13th
14 14th
15 15th
16 16th
17 17th
18 18th
19 19th
20 20th
21 21st
22 22nd
23 23rd
24 24th
25 25th
26 26th
27 27th
28 28th
29 29th
30 30th
31 31st
32 32nd
33 33rd
34 34th
35 35th
36 36th
37 37th
38 38th
39 39th
40 40th
41 41st
42 42nd
43 43rd
44 44th
45 45th
46 46th
47 47th
48 48th
49 49th
50 50th
51 51st
52 52nd
53 53rd
54 54th
55 55th
56 56th
57 57th
58 58th
59 59th
60 60th
61 61st
62 62nd
63 63rd
64 64th
65 65th
66 66th
67 67th
68 68th
69 69th
70 70th
71 71st
72 72nd
73 73rd
74 74th
75 75th
76 76th
77 77th
78 78th
79 79th
80 80th
81 81st
82 82nd
83 83rd
84 84th
85 85th
86 86th
87 87th
88 88th
89 89th
90 90th
91 91st
92 92nd
93 93rd
94 94th
95 95th
96 96th
97 97th
98 98th
99 99th
100 100th
101 101st
102 102nd
103 103rd
104 104th
105 105th
106 106th
107 107th
108 108th
109 109th
110 110th
111 111th
112 112th
113 113th
114 114th
115 115th

Is there a python function to convert ordinal number to word

You can extract your number from your string (i.e. extract 42 from 42nd) and then use num2words with ordinal=True:

import re
from num2words import num2words

ordinalAsNumber = "42nd"
number = re.search('\d+', ordinalAsNumber)

ordinalAsString = num2words(number[0], ordinal=True)

print( ordinalAsString ) # forty-second

You can extract all ordinals from a string like this:

text = "Text with several ordinals such as 42nd, 31st, and 5th as well as plain numbers such as 1, 2, 3."
numbers = re.findall('(\d+)[st|nd|rd|th]', text)

for n in numbers:
ordinalAsString = num2words(n, ordinal=True)
print( ordinalAsString )

Output:

forty-second
thirty-first
fifth

You can do replacements with re.sub():

text = "Text with several ordinals such as 42nd, 31st, and 5th as well as plain numbers such as 1, 2, 3."
numbers = re.findall('(\d+)[st|nd|rd|th]', text)

newText = text
for n in numbers:
ordinalAsString = num2words(n, ordinal=True)
newText=re.sub(r"\d+[st|nd|rd|th]", ordinalAsString, text, 1)

print ( text )
print( newText )

Output:

# Text with several ordinals such as 42nd, 31st, and 5th as well as plain numbers such as 1, 2, 3.
# Text with several ordinals such as forty-secondd, thirty-firstt, and fifthh as well as plain numbers such as 1, 2, 3.

Ordinal number to words in Python

Remove the ordinal endings from the strings:

import re

re.findall('\d+', stringValue)

and then use

num2words(foundInteger, ordinal=True)

How to get ordinal Numbers in flutter

Try with this

void main() {
for(int i =1; i<=100;i++){
print("$i${ordinal(i)}");
}
}
String ordinal(int number) {
if(!(number >= 1 && number <= 100)) {//here you change the range
throw Exception('Invalid number');
}

if(number >= 11 && number <= 13) {
return 'th';
}

switch(number % 10) {
case 1: return 'st';
case 2: return 'nd';
case 3: return 'rd';
default: return 'th';
}
}

output:
1st
2nd
3rd
4th
5th
6th
7th
8th
9th
10th
..................

How to add ordinal numbers to the start of each line in text file

Something like this...

def ordinal_string(i):
if i >= 10 and i <= 20:
suffix = 'th'
else:
il = i % 10
if il == 1:
suffix = 'st'
elif il == 2:
suffix = 'nd'
elif il == 3:
suffix = 'rd'
else:
suffix = 'th'
return str(i) + suffix + '. '

then:

for i, line in enumerate(sorted_modified_lines): print(ordinal_string(i+1) + line[1].strip()+"\n")


Related Topics



Leave a reply



Submit