2011-07-24 86 views
33

我要帶一個整數,並得到其序,即:Java中有一種將整數轉換爲序數的方法嗎?

1 -> "First" 
2 -> "Second" 
3 -> "Third" 
... 
+4

的http://計算器.com/questions/3911966/how-to-convert-number-to-words-in-java – Felix

+1

它會很整潔也可以做前綴... st,nd,rd –

+0

請注意,如果您希望您的程序在您的國家以外使用,則應該小心使用可以本地化的解決方案。 –

回答

81

如果你用「1」 OK,「第二」,「第三」等,這裏有一些簡單的代碼,將正確處理任何整數

public static String ordinal(int i) { 
    String[] sufixes = new String[] { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th" }; 
    switch (i % 100) { 
    case 11: 
    case 12: 
    case 13: 
     return i + "th"; 
    default: 
     return i + sufixes[i % 10]; 

    } 
} 

這裏的一些測試對邊緣情況:

public static void main(String[] args) { 
    int[] edgeCases = { 0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 100, 101, 102, 103, 104, 111, 112, 113, 114 }; 
    for (int edgeCase : edgeCases) { 
     System.out.println(ordinal(edgeCase)); 
    } 
} 

輸出:

0th 
1st 
2nd 
3rd 
4th 
5th 
10th 
11th 
12th 
13th 
14th 
20th 
21st 
22nd 
23rd 
24th 
100th 
101st 
102nd 
103rd 
104th 
111th 
112th 
113th 
114th 
4

在1行:

public static String ordinal(int i) { 
    return i % 100 == 11 || i % 100 == 12 || i % 100 == 13 ? i + "th" : i + new String[]{"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"}[i % 10]; 
} 
+1

男孩會給垃圾收集器一個有趣的時間XD – Supuhstar

+0

@Supuhstar,該數組很容易被證明無法離開該方法的範圍,所以編譯器和運行時可以做相當繁重的優化。即使用我最悲觀的預測,這種方法在很短的時間內也不會產生垃圾。 –

+0

@ M.Prokhorov我寧願一個不依賴於JVM實現細節的解決方案,這些細節可能會在版本和環境之間發生變化,而是依賴嚴格定義的語言行爲而不是 – Supuhstar

12

另一種解決方案

public static String ordinal(int i) { 
    int mod100 = i % 100; 
    int mod10 = i % 10; 
    if(mod10 == 1 && mod100 != 11) { 
     return i + "st"; 
    } else if(mod10 == 2 && mod100 != 12) { 
     return i + "nd"; 
    } else if(mod10 == 3 && mod100 != 13) { 
     return i + "rd"; 
    } else { 
     return i + "th"; 
    } 
} 

臨:不要求的陣列被初始化(以下垃圾)
缺點:不是一個襯墊...

14

使用優良ICU4J (也有一個很好的C版本),你也可以做這件事,並得到普通話作爲普通話;

RuleBasedNumberFormat nf = new RuleBasedNumberFormat(Locale.UK, RuleBasedNumberFormat.SPELLOUT); 
for(int i = 0; i <= 30; i++) 
{ 
    System.out.println(i + " -> "+nf.format(i, "%spellout-ordinal")); 
} 

例如產生

0 -> zeroth 
1 -> first 
2 -> second 
3 -> third 
4 -> fourth 
5 -> fifth 
6 -> sixth 
7 -> seventh 
8 -> eighth 
9 -> ninth 
10 -> tenth 
11 -> eleventh 
12 -> twelfth 
13 -> thirteenth 
14 -> fourteenth 
15 -> fifteenth 
16 -> sixteenth 
17 -> seventeenth 
18 -> eighteenth 
19 -> nineteenth 
20 -> twentieth 
21 -> twenty-first 
22 -> twenty-second 
23 -> twenty-third 
24 -> twenty-fourth 
25 -> twenty-fifth 
26 -> twenty-sixth 
27 -> twenty-seventh 
28 -> twenty-eighth 
29 -> twenty-ninth 
30 -> thirtieth 
+3

我認爲這應該被選爲接受的答案,因爲它直接回答了問題。 – TheGT

-1

最簡單的方式,在這裏,我們去:

import java.util.*; 
public class Numbers 
{ 
    public final static String print(int num) 
    { 
     num = num%10; 
     String str = ""; 
     switch(num) 
     { 
     case 1:  
      str = "st"; 
      break; 
     case 2:  
      str = "nd"; 
      break; 
     case 3:  
      str = "rd"; 
      break; 
     default: 
      str = "th";    
     } 
     return str; 
    } 

    public static void main(String[] args) 
    { 
     Scanner sc = new Scanner(System.in); 
     System.out.print("Enter a number: "); 
     int number = sc.nextInt(); 
     System.out.print(number + print(number)); 
    } 
} 
+1

我沒有看到這個處理數字11,12和13? – Enoobong

2

波希米亞人答案是非常好的,但我建議改進錯誤處理。如果您提供了一個負整數,那麼使用原始版本的序號會拋出ArrayIndexOutOfBoundsException。我認爲我的版本更清晰。我希望junit也很有用,所以沒有必要直觀地檢查輸出。

public class FormattingUtils { 

    /** 
    * Return the ordinal of a cardinal number (positive integer) (as per common usage rather than set theory). 
    * {@link http://stackoverflow.com/questions/6810336/is-there-a-library-or-utility-in-java-to-convert-an-integer-to-its-ordinal} 
    * 
    * @param i 
    * @return 
    * @throws {@code IllegalArgumentException} 
    */ 
    public static String ordinal(int i) { 
     if (i < 0) { 
      throw new IllegalArgumentException("Only +ve integers (cardinals) have an ordinal but " + i + " was supplied"); 
     } 

     String[] sufixes = new String[] { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th" }; 
     switch (i % 100) { 
     case 11: 
     case 12: 
     case 13: 
      return i + "th"; 
     default: 
      return i + sufixes[i % 10]; 
     } 
    } 
} 


import org.junit.Test; 
import static org.assertj.core.api.Assertions.assertThat; 

public class WhenWeCallFormattingUtils_Ordinal { 

    @Test 
    public void theEdgeCasesAreCovered() { 
     int[] edgeCases = { 0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 100, 101, 102, 103, 104, 111, 112, 
       113, 114 }; 
     String[] expectedResults = { "0th", "1st", "2nd", "3rd", "4th", "5th", "10th", "11th", "12th", "13th", "14th", 
       "20th", "21st", "22nd", "23rd", "24th", "100th", "101st", "102nd", "103rd", "104th", "111th", "112th", 
       "113th", "114th" }; 

     for (int i = 0; i < edgeCases.length; i++) { 
      assertThat(FormattingUtils.ordinal(edgeCases[i])).isEqualTo(expectedResults[i]); 
     } 
    } 

    @Test(expected = IllegalArgumentException.class) 
    public void supplyingANegativeNumberCausesAnIllegalArgumentException() { 
     FormattingUtils.ordinal(-1); 
    } 

} 
0

在斯卡拉的變化,

List(1, 2, 3, 4, 5, 10, 11, 12, 13, 14 , 19, 20, 23, 33, 100, 113, 123, 101, 1001, 1011, 1013, 10011) map { 
    case a if (a % 10) == 1 && (a % 100) != 11 => a + "-st" 
    case b if (b % 10) == 2 && (b % 100) != 12 => b + "-nd" 
    case c if (c % 10) == 3 && (c % 100) != 13 => c + "-rd" 
    case e          => e + "-th" 
    } foreach println 
+0

Java問題? – Enoobong

0
public static String getOrdinalFor(int value) { 
     int tenRemainder = value % 10; 
     switch (tenRemainder) { 
      case 1: 
      return value+"st"; 
      case 2: 
      return value+"nd"; 
      case 3: 
      return value+"rd"; 
      default: 
      return value+"th"; 
     } 
     } 
+0

我沒有看到這個處理數字11,12和13?使用和如果檢查它們,例如 - 「''if(number> = 11 && number <= 13)返回數字+」th「; }''' – Enoobong

-1
private static String getOrdinalIndicator(int number) { 
     int mod = number; 
     if (number > 13) { 
      mod = number % 10; 
     } 
     switch (mod) { 
     case 1: 
      return "st"; 
     case 2: 
      return "nd"; 
     case 3: 
      return "rd"; 
     default: 
      return "th"; 
     } 
    } 
+0

問題是要返回'First'爲1等等,就像'Eleventh'爲11等等。你的回答並沒有達到那個目的。 –

0

我有一個長期的,複雜的一個,但很容易理解的概念

private static void convertMe() { 

    Scanner in = new Scanner(System.in); 
    try { 
     System.out.println("input a number to convert: "); 
     int n = in.nextInt(); 

     String s = String.valueOf(n); 
     //System.out.println(s); 

     int len = s.length() - 1; 
     if (len == 0){ 
      char lastChar = s.charAt(len); 
      if (lastChar == '1'){ 
       System.out.println(s + "st"); 
      } else if (lastChar == '2') { 
       System.out.println(s + "nd"); 
      } else if (lastChar == '3') { 
       System.out.println(s + "rd"); 
      } else { 
       System.out.println(s + "th"); 
      } 
     } else if (len > 0){ 
      char lastChar = s.charAt(len); 
      char preLastChar = s.charAt(len - 1); 
      if (lastChar == '1' && preLastChar != '1'){ //not ...11 
       System.out.println(s + "st"); 
      } else if (lastChar == '2' && preLastChar != '1'){ //not ...12 
       System.out.println(s + "nd"); 
      } else if (lastChar == '3' && preLastChar != '1'){ //not ...13 
       System.out.println(s + "rd"); 
      } else { 
       System.out.println(s + "th"); 
      } 
     } 


    } catch(InputMismatchException exception){ 
     System.out.println("invalid input"); 
    } 


} 
相關問題