如何使用多个填充段格式化Java字符串

3

我有一些代码假设输入不超过6位数。它会将该值填充为前导0,然后以“999”作为前缀,就像这样:

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

期望的输入现在已经超出6位数的最大限制,进入到7位数。这会产生10个字符的格式化输出(例如:String.format("999%06d", 1000000); // => "9991000000"),这破坏了我们的事情。
问题:是否可能指定此字符串格式,以便它将保持与上述相同的逻辑,但如果输入为7位数,则只在前面加上两个“9”(同时仍然在小于等于6位数的情况下在前面加上三个“9”)?
为了帮助说明,这些是我们期望当值从6递增到7位时的输入/输出:
(Input) => (Formatted Output)
1       => "999000001"
999999  => "999999999"
1000000 => "991000000"

我知道还有其他方法可以实现这个目标,但是由于我们的情况比较特殊,所以我想问一下是否可以在一个单独的 String.format 调用中完成。

不,这是不可能的。你提供作为第一个参数的格式字符串是一个字面(静态)字符串值,它不能包含控制流,因此,它将始终以相同的方式格式化输出。你可能想编写一些逻辑(例如if-else),并定义两个不同的(或更多,如果你愿意)场景。 - Giorgi Tsiklauri
当格式化时,100,000 如何变成 1,000,000?它将变成 0100000。 - azro
似乎无法使用String.format,但您可以使用s = s.substring(s.length() - 9)作为格式化的结果。 - Youcef LAIDANI
2个回答

1

Workaround

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

1
绕过方法:
static String prefix999(int number) {
    String s = String.format("999%06d", 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接