【问题标题】:format string by custom pattern in java [closed]通过java中的自定义模式格式化字符串[关闭]
【发布时间】:2014-01-18 12:42:19
【问题描述】:

我有一个String 实例,其中包含1548258598784165 等数字。 我想要一个灵活的实用程序来将此字符串格式化为另一个字符串。 我的目标是以下结果(示例):

  • 规则 1:中间三颗星-右四位-左四位。结果将是:1548***4165
  • 规则 2:一个破折号而不是除三个第一位数字和两个最后一位数字之外的任何字符。结果将是:154-----------65
  • 规则 3:用空格分隔任意四位数字。结果将是:1548 2585 9878 4165

以上规则是我格式化原始字符串的规则示例。 我的问题是:我的目标是否有好处?我不想被substring 和类似的方式操纵。

【问题讨论】:

  • 你考虑过创建一个类来为你做这件事吗?您已经定义了规则,创建一个围绕字符串输出这些不同情况的类应该不会太难。
  • 您可以将字符串转换为 char 数组,然后用它们的索引 (char[] charArray = str.toCharArray();) 替换字符,但不知道为什么您不想只使用 substring 或“类似方式”。你认为这个“福利实用程序”会是什么样子?
  • @ZachL 因为使用substring 来解决这个问题会产生非常不可读的代码,几个if 语句,几个NullPointerException maby throws 和...
  • @MJM 我不认为会有一个超级相关的库来为你做这些事情。接受下面答案中的建议,并将这种复杂性包含在它自己的类中。通过一些努力,我相信您可以将 Elliotts 的答案重构为可读性强且优雅。

标签: java apache-commons


【解决方案1】:

我相信这符合您的要求

public static String customFormat(String in, int i) {
    StringBuilder sb = new StringBuilder();
    if (in != null) {
        char[] arr = in.toCharArray();
        switch (i) {
        case 1:
            for (int t = 0; t < 4; t++) {
                sb.append(arr[t]);
            }
            sb.append("***");
            for (int t = arr.length - 4; t < arr.length; t++) {
                sb.append(arr[t]);
            }
            break;
        case 2:
            for (int t = 0; t < 3; t++) {
                sb.append(arr[t]);
            }
            for (int t = 3; t < arr.length - 2; t++) {
                sb.append("-");
            }
            for (int t = arr.length - 2; t < arr.length; t++) {
                sb.append(arr[t]);
            }
            break;
        default:
            for (int t = 0; t < arr.length; t++) {
                if (t > 0 && t % 4 == 0) {
                    sb.append(" ");
                }
                sb.append(arr[t]);
            }
        }
    }
    return sb.toString();
}

public static void main(String args[]) throws IOException {
    for (int i = 1; i < 4; i++) {
        System.out.println(customFormat("1548258598784165", i));
    }
}

运行时输出

1548***4165
154-----------65
1548 2585 9878 4165

【讨论】:

  • 我可能会为每种格式创建一个带有好听名称的 Enum,这样您就没有幻数变量 i
【解决方案2】:

如果您希望以一种非常优雅的方式编写它,我相信创建一个新类是一个好主意,该类将包含一个字符串和以您想要的方式对该字符串进行操作的方法。字符串可以作为参数传递给类的构造函数(然后在类中是私有的)。

当然,您可以只创建一个类,其中包含处理作为参数传递给方法的字符串的方法,这可能是一种更通用的方式(因为您可以处理普通字符串,而不仅仅是你自己的类型。)

这两种情况下的方法都可能基于标准的 String 类方法。您可以使用 inputString.charAt(int index) 从您的字符串中访问单个符号,这似乎是满足您大多数要求的简单解决方案。每个方法都可以返回一个使用源字符串中的字符和您希望它包含的其他符号构建的新字符串。您唯一需要实现的是对 String 类方法的包装。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2010-11-18
    • 2012-08-28
    相关资源
    最近更新 更多