2013-05-11 27 views
0

在Java中,我知道的下一件事是確定的:在沒有足夠參數的情況下克服String.format的MissingFormatArgumentException方法?

String test="aaa"; 
System.out.println(String.format(test,"asd")); 

(打印 「AAA」)

不過,我希望能夠處理相反的事,如:

String test="aaa%sbbb"; 
System.out.println(String.format(test)); 

,無論(這會產生一個異常java.util.MissingFormatArgumentException)

我希望讓它儘可能通用多少符/ parame如果沒有足夠的值,就忽略它們(跳過問題位置的所有說明符),然後寫下字符串的其餘部分(例如,在我顯示的情況下,它會寫入「aaabbb 「)。

開箱即可使用,還是應該編寫一個可以使用的函數?

+1

只是說明:有一個'System.out.format()'方法。 – Keppil 2013-05-11 23:18:28

+0

是的,我忘了它,但它只是一個樣本。我不需要在我使用它的真實場景中寫入控制檯。 – 2013-05-12 07:39:45

回答

1

好吧,我想我已經得到了有效的解決方案,並且我也認爲它支持的String.format支持一切:

public static String formatString(final String stringToFormat,final Object... args) 
    { 
    if(stringToFormat==null||stringToFormat.length()==0) 
    return stringToFormat; 
    int specifiersCount=0; 
    final int argsCount=args==null ? 0 : args.length; 
    final StringBuilder sb=new StringBuilder(stringToFormat.length()); 
    for(int i=0;i<stringToFormat.length();++i) 
    { 
    char c=stringToFormat.charAt(i); 
    if(c!='%') 
     sb.append(c); 
    else 
     { 
     final char nextChar=stringToFormat.charAt(i+1); 
     if(nextChar=='%'||nextChar=='n') 
     { 
     ++i; 
     sb.append(c); 
     sb.append(nextChar); 
     continue; 
     } 
     // found a specifier 
     ++specifiersCount; 
     if(specifiersCount<=argsCount) 
     sb.append(c); 
     else while(true) 
     { 
     ++i; 
     c=stringToFormat.charAt(i); 
     // find the end of the converter, to ignore it all 
     if(c=='t'||c=='T') 
      { 
      // time prefix and then a character, so skip it 
      ++i; 
      break; 
      } 
     if(c>='a'&&c<='z'||c>='A'&&c<='Z') 
      break; 
     } 
     } 
    } 
    return String.format(sb.toString(),args); 
    } 

和測試,只是爲了顯示它的工作原理:

System.out.println(formatString("aaa%sbbb")); 
System.out.println(formatString("%da%sb%fc%tBd%-15se%16sf%10.2fg")); 

不幸的是,它創建了一個新的stringBuilder和一個字符串的方式,但它的工作原理。

0

開箱即可使用,還是應該編寫一個功能?

開箱即不可能。標準實現中沒有任何內容忽略這一點。

我想你可以編寫一個函數來處理格式字符串以擺脫「不需要的」格式說明符。不過,這很可能會更容易之一:

  • 選擇或基於你有參數的數量格式字符串,
  • 呼叫format方法一次爲每個參數,或
  • 做格式化完全是另一種方式。
+0

如果我寫了一個函數,我應該忽略寫在API中的所有類型的說明符,還是我可以忽略任何具有'%'和後面的字母(並且不忽略它的轉義字符)? – 2013-05-12 05:52:42

相關問題