2013-02-03 49 views
2

我是Java編程新手。我應該使用並行數組來自動簡化格式化日期嗎?

我想要system.out.println日期,用戶已經輸入並且知道它是否是'st','th','rd'和'nd'。所以如果我在出生的那天輸入'13',它會增加'th'來使它成爲'13'。

我如何使用所有數字'1'到'31'自動執行此操作?

對於st,nd,rd,th,我應該使用平行數組並且其中一個部分是'1'到'31'[0] - [30],而部分是[0] - [3]並讓它們相應匹配?

如果是這樣或者不是,我該如何聲明它?

對不起,寫了一個可怕的問題。我很難理解我的想法。

+0

無需並行陣列,您可以使用索引本身,例如a [0] =「st」(index = date - 1)。但是,AlexWien的答案更簡單。 – dmon

回答

1

我會用一個switch語句

int day; 
    // no read in or assign day: 1 - 31 

String ext; 
// day % 10 (modulo 10) reduces to 0-9 
switch (day % 10) { 
case 1: ext = "st"; 
    break; 
case 2: ext = "nd"; 
    break; 
case 3: ext = "rd"; 
    break; 
default: ext = "th"; 
    break; 
} 
if (day >= 11 && day <==13) ext == "th"; 
String dayText = "day: " + day + ext; 
+1

使用'switch(day%10)'來處理2位數字 – Doorknob

+1

它更復雜:11,12,13取th。 –

+0

@Cyrille Karmann是的,它有點高級,但對於downvoter:沒有必要downvote正確的解決方案。 – AlexWien

1
public static void main(String[] args) { 
     String[] dates = {"","1st","2nd","3rd","4th",...,"31st"}; 
     int input = 24; 
     System.out.println(dates[input]); 
} 
+0

這是非常低效的。見AlexWein的答案。 -1 – Doorknob

+0

@ Doorknob yes,但可能比較容易向老師解釋......如果老師會問第20天會發生什麼,什麼是20%10?,什麼是模數操作...... – AlexWien

+0

@ Doorknob Just tried提供替代品。我相信我的方法是有效的時間方式,而另一個是有效的空間方面:) –

1

我會做它,而這種方式:

String getExtension(int day) { 

    switch(day) { 

    case 1: 
    case 21: 
    case 31: 
    return "st"; 

    case 2: 
    case 22: 
    return "nd"; 

    case 3: 
    case 23: 
    return "rd"; 

    default: 
    return "th"; 
    } 

} 


String formatDay(int day) { 
    return day + getExtension(day); 
} 
0

我建議使用一個switch語句,但一定要責令其包括11 ,12和13.

switch (day) { 
case 2: 
case 22: 
    suffix = "nd"; 
    break; 
case 3: 
case 23: 
    suffix = "rd"; 
    break; 
default: 
    //Accounts for all other numbers including 1, 11, 12, 13, 21, and 31 
    suffix = "st"; 
    break; //Because I'm a conformist. 
} 
+0

當天== 14? –

+0

好...我會修復評論... – supersam654

0
public class SourceCodeProgram { 

    public static void main(String[] args) { 
     System.out.println(OrdinalNumber.format(1)); 
     System.out.println(OrdinalNumber.format(2)); 
     System.out.println(OrdinalNumber.format(3)); 
     System.out.println(OrdinalNumber.format(4)); 
     System.out.println(OrdinalNumber.format(5)); 
     System.out.println(OrdinalNumber.format(6)); 
     System.out.println(OrdinalNumber.format(12)); 
     System.out.println(OrdinalNumber.format(23)); 
     System.out.println(OrdinalNumber.format(101)); 
    } 
} 

class OrdinalNumber { 

    public static String format(int value) { 
     if (value > 3 && value < 21) { 
         //exception 
      return value + "th"; 
     } 
     switch (value % 10) { 
     case 1: 
      return value + "st"; 
     case 2: 
      return value + "nd"; 
     case 3: 
      return value + "rd"; 
     default: 
      return value + "th"; 
     } 
    } 
} 

此外,請參閱:

0

我不認爲你需要做的。關於這種附件的日期有明確的規定。

  • 如果日期結束於1且小於10或大於20,則以'st'結尾。
  • 如果日期以2結尾且小於10或大於20,則以'nd'結尾。
  • 如果日期結束於3且小於10或大於20,則以'rd'結尾。
  • 所有其他日期都以'th'結尾。

這是我粗暴過度的解決方案。從中取出你想要的東西。

public String appendDateEnding(String theDate) { 
    if(null != theDate) { 
     try { 
      return appendDateEnding(Integer.parseInt(theDate)); 
     } catch (NumberFormatException e) { 
      // we'll return null since we don't have a valid date. 
     } 
    } 
    return null; 
} 

private String appendDateEnding(int theDate) { 
    StringBuffer result = new StringBuffer(); 
    if(32 <= theDate || 0 >= theDate) { 
     throw new IllegalArgumentException("Invalid date."); 
    } else { 
     result.append(theDate); 
     int end = theDate % 10; 
     if(1 == end && isValidForSuffix(theDate)) { 
      result.append("st"); 
     } else if(2 == end && isValidForSuffix(theDate)) { 
      result.append("nd"); 
     } else if(3 == end && isValidForSuffix(theDate)) { 
      result.append("rd"); 
     } else { 
      result.append("th"); 
     } 
    } 
    return result.toString(); 
} 

private boolean isValidForSuffix(int theDate) { 
    return (10 > theDate || 20 < theDate); 
} 

什麼它打印出來,如果有1到31之間的天數範圍:

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