#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);
}