【问题标题】:How to format Java String with multiple padded segments如何使用多个填充段格式化 Java 字符串
【发布时间】:2021-01-12 19:25:24
【问题描述】:

我有一些代码假设输入不会超过 6 位。它采用该值,用前导 0 填充它,然后在其前面加上“999”,如下所示:

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

预期的输入现在溢出了 6 位最大值,变成了 7 位。这会产生 10 个字符的格式化输出(例如 String.format("999%06d", 1000000); // => "9991000000"),这对我们来说很糟糕。

问题:是否可以指定此字符串格式以使其保持与上述相同的逻辑,但不是始终以前导“999”为前缀,而是在输入为7时仅以两个前导“9”为前缀数字长(如果输入的长度为

为了帮助说明,这些是当值从 6 位增加到 7 位时我们想要的输入/输出:

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

(我知道还有其他方法可以做到这一点,这些方法很有帮助,但我们的情况不典型,所以我想问一下这是否可以在单个 String.format 电话中完成)

【问题讨论】:

  • 不,这是不可能的。您作为第一个参数提供的格式字符串是文字(静态)字符串值,它不能包含控制流,因此,它将始终以相同的方式格式化您的输出。您可能想要编写一些逻辑(例如 if-else)并定义两个不同的(或更多,如果您愿意的话)场景。
  • 格式化后100.000如何变成1.000.000?它会变成 0100000
  • 看来String.format是不可能的,但是你可以使用s = s.substring(s.length() - 9)作为格式的结果

标签: java string formatting


【解决方案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

【讨论】:

    【解决方案2】:

    解决方法

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

    【讨论】:

      猜你喜欢
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多