2011-06-21 37 views
96

原始的問題,但我怎麼格式化字符串這樣的:如何在Java格式字符串

「步驟{1} {2}」

通過使用Java替代變量?在C#中很容易。

+0

見[本問題](http://stackoverflow.com/questions/5057960/is-there-a-general-string-substitution-function -similar-to-sl4fj) –

+0

http://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax –

回答

80

除的String.format,也看看java.text.MessageFormat。格式較少簡潔,有點接近C#示例你」已經提供並可以將其用於解析以及

,例如:

int someNumber = 42; 
String someString = "foobar"; 
Object[] args = {new Long(someNumber), someString}; 
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}."); 
System.out.println(fmt.format(args)); 

一個更好的實施例利用了可變參數的和自動裝箱改進的Java 1.5並接通到上述一襯墊:

MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar"); 

MessageFormat對於用選項修飾符做i18nized複數有點更好。要指定正確地使用單數形式時,變量爲1和複數另有一個消息,你可以做這樣的事情:

String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}"; 
MessageFormat fmt = new MessageFormat(formatString); 
fmt.format(new Object[] { new Long(numberOfObjects) }); 
+6

MessageFormat是用於本地化的目的,所以在使用它時要小心。例如下面的代碼:'MessageFormat.format(「Number {0}」,1234));'取決於默認語言環境可以產生'Number 1,234'而不是'Number 1234'。 –

+0

@ataylor:你好,對不起,但我有點困惑。我想要這樣的東西,我會傳遞具有數據的Class對象,並且當{{1},然後是lastname'時,它將採用firstname',就像這樣。是否可能像'{0,choice,0.getFirstName()}'或類似的東西? –

+0

@ user3145373ツ我不這麼認爲。 – ataylor

133

看看String.format。但請注意,它需要的格式說明符與C的printf功能家族相似 - 例如:

String.format("Hello %s, %d", "world", 42); 

會返回「Hello world 42」。在瞭解格式說明符時,您可能會發現this有幫助。 Andy Thomas-Cramer很友善地將this鏈接留在下面的評論中,這似乎指向官方規範。最常用的是:

  • %S - 插入一個字符串
  • %d - 插入符號的整數(十進制)
  • %F - 插入一個實數,標準符號

這與C#完全不同,C#使用具有可選格式說明符的位置引用。 這意味着,你不能做喜歡的東西:

String.format("The {0} is repeated again: {0}", "word"); 

... 實際上不重複傳遞給printf /格式參數。 (見下面的Scrum邁斯特的評論)


如果你只是想直接打印結果,您可能會發現System.out.printf(PrintStream.printf)根據自己的喜好。

+2

另一種選擇是java.text.MessageFormat,它接受{ 1}樣式的格式符號。 String.format()的格式符號可以類似於C的printf()格式符號 - 但也可能不同。有關完整的語法,請參見http://download.oracle.com/javase/6/docs/api/java/util/Formatter.html#syntax。 –

+27

'String.format'也可以使用數字位置:'String.format(「%2 $ s%1 $ s」,「foo」,「bar」);'輸出'bar foo' –

2

如果您選擇不使用的String.format,另一個選項是+二元運算符

String str = "Step " + a + " of " + b; 

這是

new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));

無論你用的是你的選擇相當。 StringBuilder速度更快,但速度差異很小。我更喜歡使用+運營商(其中做了StringBuilder.append(String.valueOf(X)))並發現它更容易閱讀。

+2

如果你打算去要否認我,請解釋原因。 –

+7

1)爲了回答關於字符串格式化的問題,你解釋'+'操作符是如何工作的。 2)你的解釋甚至不準確。 '+'等同於使用'StringBuilder',而不是'String.concat'。 [(對此太多瞭解。)](http://www.znetdevelopment。com/blogs/2009/04/06/java-string-concatenation /) –

+2

StringBuilder.append,實際上。我會更新答案。 –

2
public class StringFormat { 

    public static void main(String[] args) { 
      Scanner sc=new Scanner(System.in); 
      System.out.println("================================"); 
      for(int i=0;i<3;i++){ 
       String s1=sc.next(); 
       int x=sc.nextInt(); 
       System.out.println(String.format("%-15s%03d",s1,x)); 
      } 
      System.out.println("================================"); 

    } 
} 

outpot 「========= =======================「
ved15space123 ved15space123 ved15space123 」================= ===============

Java解決方案

  • 的 「 - 」 是用來左縮進

  • 的 「15」,使該字符串的最小長度它佔用是15

  • 的 「S」(這是%)後的幾個字符將被替換爲我們的字符串
  • 0填充我們的整數在0左邊
  • 3使我們的整數爲最小長度3
+0

你是對的http://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax –

2

我已經寫了我的簡單的方法吧:

public class SomeCommons { 
    /** Message Format like 'Some String {0}/{1}' with arguments */ 
    public static String msgFormat(String s, Object... args) { 
     return new MessageFormat(s).format(args); 
    } 
} 

,所以你可以使用它作爲:

SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two"); 
1

該解決方案爲我工作。我需要爲REST客戶端創建URL動態,所以我創造了這個方法,所以你只需要通過restURL這樣

/customer/{0}/user/{1}/order 

,並添加儘可能多的PARAMS,因爲你需要:

public String createURL (String restURL, Object ... params) {  
    return new MessageFormat(restURL).format(params); 
} 

你只需要調用這個方法是這樣的:

createURL("/customer/{0}/user/{1}/order", 123, 321); 

輸出

「/客戶/ 123 /用戶/ 321 /訂單」