Как отформатировать строку Java с несколькими дополненными сегментами

#java #string #formatting

#java #строка #форматирование

Вопрос:

У меня есть некоторый код, который предполагает, что ввод не будет превышать 6 цифр. Он принимает это значение, дополняет его начальными 0, а затем добавляет к нему префикс «999», например:

 String.format("999d", 123); // => "999000123"
 

Ожидаемый ввод теперь превышает этот 6-значный максимум до 7 цифр. Это приводит к форматированному выводу из 10 символов (например String.format("999d", 1000000); // => "9991000000" ), что ломает для нас ситуацию.

Вопрос: Можно ли указать этот формат строки, чтобы он сохранял ту же логику, что и выше, но вместо того, чтобы всегда вводить префикс с начальным «999», он будет иметь префикс только с ДВУМЯ начальными «9», если длина ввода составляет 7 цифр (при этом все еще вводится префикс с ТРЕМЯ начальными «9» если ввод имеет длину <= 6 цифр)?

Чтобы проиллюстрировать, это те входы / выходы, которые мы хотели бы получить, когда значение увеличивается с 6 до 7 цифр:

 (Input) => (Formatted Output)
1       => "999000001"
999999  => "999999999"
1000000 => "991000000"
 

(Я знаю, что есть другие способы добиться этого, и они полезны, но наша ситуация нетипична, поэтому я спрашиваю, можно ли это сделать за один String.format вызов)

Комментарии:

1. Нет, это невозможно. Строка формата, которую вы предоставляете в качестве первого аргумента, является буквальным (статическим) строковым значением и не может включать поток управления, следовательно, она всегда будет форматировать ваш вывод одинаково. Возможно, вам захочется написать некоторую логику (например, if-else ) и определить два разных (или более, если хотите) сценария.

2. Как 100.000 может стать 1.000.000 при форматировании? это станет 0100000

3. Кажется, что String.format это невозможно, но вы можете использовать s = s.substring(s.length() - 9) в качестве результата форматирования

Ответ №1:

Обходной путь:

 static String prefix999(int number) {
    String s = String.format("999d", number);
    return s.substring(Math.min(3, s.length() - 9));
}
 

Тесты

 System.out.println(prefix999(123));
System.out.println(prefix999(1));
System.out.println(prefix999(999999));
System.out.println(prefix999(1000000));
System.out.println(prefix999(1234567));
System.out.println(prefix999(12345678));
System.out.println(prefix999(123456789));
System.out.println(prefix999(1234567890));
 

Вывод

 999000123
999000001
999999999
991000000
991234567
912345678
123456789
1234567890
 

Ответ №2:

Обходной путь

 public static String format(int i) {
    String s = String.format("999d", i);
    return s.substring(s.length() - 9);
}