Примітивне запитання, але як я форматую рядки так:
"Крок {1} з {2}"
замінивши змінні за допомогою Java? В C # це легко.
Примітивне запитання, але як я форматую рядки так:
"Крок {1} з {2}"
замінивши змінні за допомогою Java? В C # це легко.
Відповіді:
Окрім 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));
Хороший приклад використовує переваги вдосконалень varargs та autoboxing в 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) });
MessageFormat.format("Number {0}", 1234));
залежно від мови за замовчуванням, може створювати Number 1,234
замість Number 1234
.
{0} it ll take firstname
, коли {1} then lastname
, як так. Чи можливо подібне {0,choice,0.getFirstName()}
чи щось подібне?
Погляньте на String.format . Однак зауважте, що він має специфікатори формату, подібні до функцій сімейства printf C - наприклад:
String.format("Hello %s, %d", "world", 42);
Повернеться "Привіт, світ, 42". Ви можете знайти це корисно при вивченні специфікаторів формату. Енді Томас-Креймер був добрим, щоб залишити це посилання в коментарі нижче, який, схоже, вказує на офіційну специфікацію. Найпоширеніші з них:
Це кардинально відрізняється від C #, що використовує позиційні позиції з необов'язковим специфікатором формату. Це означає, що ви не можете робити такі речі, як:
String.format("The {0} is repeated again: {0}", "word");
... без фактичного повторення параметра, переданого до printf / format. (див. коментар Scrum Meister нижче)
Якщо ви просто хочете надрукувати результат безпосередньо, ви можете знайти System.out.printf ( PrintStream.printf ) на свій смак.
String.format
також може приймати числові позиції: String.format("%2$s %1$s", "foo", "bar");
виведеbar foo
Якщо ви вирішите не використовувати 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) Ваше пояснення навіть не є точним. +
еквівалентно використанню StringBuilder
, ні String.concat
. (Занадто багато інформації про це.)
Я написав для цього простий метод:
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");
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
Це рішення спрацювало на мене. Мені потрібно було динамічно створювати URL-адреси для клієнта REST, тому я створив цей метод, тож вам просто потрібно передати рештуURL, як це
/customer/{0}/user/{1}/order
і додайте стільки парам, скільки вам потрібно:
public String createURL (String restURL, Object ... params) {
return new MessageFormat(restURL).format(params);
}
Вам просто потрібно назвати цей метод так:
createURL("/customer/{0}/user/{1}/order", 123, 321);
Вихід
"/ замовник / 123 / користувач / 321 / замовлення"
Я написав цю функцію, вона робить правильно. Інтерполюйте слово, починаючи зі $
значення однойменної змінної.
private static String interpol1(String x){
Field[] ffield = Main.class.getDeclaredFields();
String[] test = x.split(" ") ;
for (String v : test ) {
for ( Field n: ffield ) {
if(v.startsWith("$") && ( n.getName().equals(v.substring(1)) )){
try {
x = x.replace("$" + v.substring(1), String.valueOf( n.get(null)));
}catch (Exception e){
System.out.println("");
}
}
}
}
return x;
}