2012-06-24 52 views
7

Tôi có danh sách các số nguyên - có thư viện để chuyển đổi chúng thành xếp hạng văn bản thuần túy không? IE: 1,2,3 -> "đầu tiên, thứ hai, thứ ba"?Có thư viện nào để chuyển đổi số nguyên thành thứ nhất/thứ hai/thứ ba

+1

http://www.daniweb.com/software-development/python/code/216839/number-to-word-converter-python –

+1

Khi tôi bắt đầu học đại học, đó là một trong những nhiệm vụ của chúng tôi vào ngày đầu tiên để viết chính xác điều này trong Java. Nếu bạn có một chút kinh nghiệm trong lập trình, điều này sẽ không mất nhiều thời gian hơn 30 phút. –

+1

30 phút? thực sự lol .. bạn có nghĩa là 1 phút .... http://jsfiddle.net/cmvLS/ (javascript) – ncubica

Trả lời

5

Bạn dự định sẽ đi bao nhiêu? (Bạn có bao giờ mong đợi cao hơn, nói rằng, "hai mươi"?)

Có lẽ bạn chỉ cần một dict,

nth = { 
    1: "first", 
    2: "second", 
    3: "third", 
    4: "fourth" 
    # etc 
} 
+3

Nó chỉ trở nên dễ dàng hơn sau khi "twentieth" :) –

2

Tùy thuộc vào tình hình của bạn, bạn có thể tìm thấy nó hữu ích để giữ lại nguyên và thêm " st "," nd "," rd "và" th ". Nếu vậy, đây là một thuật toán đơn giản:

LƯU Ý: Thuật toán này được viết bằng Java. Tôi không biết Python. Bất cứ ai muốn viết lại nó bằng Python, là khách của tôi.

public static String appendInt(int number) { 
    String value = String.valueOf(number); 
    if(value.length() > 1) { 
     // Check for special case: 11 - 13 are all "th". 
     // So if the second to last digit is 1, it is "th". 
     char secondToLastDigit = value.charAt(value.length()-2); 
     if(secondToLastDigit == '1') 
      return "th"; 
    } 
    char lastDigit = value.charAt(value.length()-1); 
    switch(lastDigit) { 
     case '1': 
      return "st"; 
     case '2': 
      return "nd"; 
     case '3': 
      return "rd"; 
     default: 
      return "th"; 
    } 
} 

Vì vậy

System.out.println(1 + appendInt(1)); 
System.out.println(2 + appendInt(2)); 
System.out.println(3 + appendInt(3)); 
System.out.println(4 + appendInt(4)); 
System.out.println(5 + appendInt(5)); 
System.out.println(11 + appendInt(11)); 
System.out.println(21 + appendInt(21)); 

màn

1st 
2nd 
3rd 
4th 
5th 
11th 
21st 
+0

Đó là một cách tuyệt vời để đi về nó. – answerSeeker

3

không thể bình luận về bài đăng ryvantage vì điểm nhưng tôi đã viết mã tương tự cho python:

def appendInt(num): 
    if num > 9: 
     secondToLastDigit = str(num)[-2] 
     if secondToLastDigit == '1': 
      return 'th' 
    lastDigit = num % 10 
    if (lastDigit == 1): 
     return 'st' 
    elif (lastDigit == 2): 
     return 'nd' 
    elif (lastDigit == 3): 
     return 'rd' 
    else: 
     return 'th' 



def appendInt2(num): 
    value = str(num) 
    if len(value) > 1: 
     secondToLastDigit = value[-2] 
     if secondToLastDigit == '1': 
      return 'th' 
    lastDigit = value[-1] 
    if (lastDigit == '1'): 
     return 'st' 
    elif (lastDigit == '2'): 
     return 'nd' 
    elif (lastDigit == '3'): 
     return 'rd' 
    else: 
     return 'th' 

Các thứ hai là phần chuyển tiếp trực tiếp lation, nhưng tôi thấy rằng sự thay đổi đầu tiên là nhanh hơn đáng kể:

Fri 28 tháng 8 11:48:13 2015 kết quả

  300000005 function calls in 151.561 seconds 

    Ordered by: call count, name/file/line 

    ncalls tottime percall cumtime percall filename:lineno(function) 
100000000 6.674 0.000 6.674 0.000 {len} 
100000000 43.064 0.000 43.064 0.000 test.py:7(appendInt) 
100000000 66.664 0.000 73.339 0.000 test.py:22(appendInt2) 
     1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 
     1 0.000 0.000 151.561 151.561 <string>:1(<module>) 
     1 0.000 0.000 151.561 151.561 test.py:51(main) 
     1 16.737 16.737 59.801 59.801 test.py:39(test1) 
     1 18.421 18.421 91.759 91.759 test.py:45(test2) 
+0

mảng [-2] là giá trị mảng thứ hai để cuối cùng trong Python? * cool * – ryvantage

2

Tương tự như các tĩnh mạch @Hugh Bothwellwas following, chỉ không sử dụng một dict (vì bạn phím đã tốt đẹp và số), tôi đã đặt lại với nhau sau "lót":

ordinal=lambda x:["first","second","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth"][x-1] 

nào bao gồm tất cả trường hợp lên đến 12. Nếu y ou cần cao hơn (vào hàng trăm, vv), sau đó bạn có thể sẽ cần một cái gì đó mạnh mẽ hơn (với đệ quy tôi tưởng tượng, vv).

0

Một tốt đẹp và đơn giản viết lại:

def num_to_ith(num): 
    """1 becomes 1st, 2 becomes 2nd, etc.""" 
    value    = str(num) 
    before_last_digit = value[-2] 
    last_digit  = value[-1] 
    if len(value) > 1 and before_last_digit == '1': return value +'th' 
    if last_digit == '1': return value + 'st' 
    if last_digit == '2': return value + 'nd' 
    if last_digit == '3': return value + 'rd' 
    return value + 'th' 
9

Các python inflect gói có một phương pháp để chuyển đổi các chữ số vào ordinals:

import inflect 
p = inflect.engine() 

for i in range(1,25,5): 
    print(p.ordinal(i)) 

hiển thị:

1st 
6th 
11th 
16th 
21st 
+1

Haha, tuyệt vời! Đây ** IS ** câu trả lời đúng cho câu hỏi. – Atcold

+0

Wow rằng những gì tôi đang tìm kiếm !! – answerSeeker

+0

'p.number_to_words (p.ordinal (i))' sẽ hiển thị nó là 'first',' second', 'third', v.v. –

0

Mã của tôi cho điều này sử dụng danh sách, mô đun số nguyên để tìm số đầu tiên và phân chia tầng nguyên để kiểm tra ru le 11 thru 13.

def stringify(number): 
     suffix = ["th","st","nd","rd","th","th","th","th","th","th"] 
     return str(number) + suffix[number % 10] if str(number // 10)[-1] != 1 else str(number) + "th"   

Dòng cuối cùng dễ đọc hơn:

if str(number // 10)[-1] != '1':  
     return str(number) + suffix[number % 10] 
    else: 
     return str(number) + "th" 

Về cơ bản, tôi đang kiểm tra các chữ số thứ hai trong vòng 1 * mà chỉ một ngày 11, 12, ngắt nguyên tắc thứ 13 có thể.Đối với người giữ nguyên quy tắc, danh sách được tham chiếu bởi phần còn lại của số chia cho 10 (toán tử mô đun).

Tôi chưa thực hiện bất kỳ thử nghiệm nào về hiệu quả mã và việc kiểm tra độ dài có thể đọc được nhiều hơn, nhưng điều này có hiệu quả.

* (str (number) [- 2] tạo ra một IndexError nếu đầu vào là một chữ số. Sử dụng phân chia tầng trên các số nguyên luôn dẫn đến ít nhất 1 chữ số để chuỗi luôn có chỉ số -1)

Các vấn đề liên quan