是否有更简洁/优雅的方式来格式化以下社会安全号码,如有或没有Groovy的字符串?

时间:2012-03-20 23:35:24

标签: java groovy

在:

EUTQQGOPED

在:

EUT-QQG-OPED

以下示例是我提出的将“ - ”添加到10个字符的字符串作为可读性要求的一部分。格式化模式类似于美国社会安全号码的格式。

是否有更简单,更简洁的方法来完成其他格式?

public static void main(String[] args){
        String pin = "EUTQQGOPED";
        StringBuilder formattedPIN = new StringBuilder(pin);
        formattedPIN = formattedPIN.insert(3, '-').insert(7, '-');
        //output is EUT-QQG-OPED
        println formattedPIN
}

5 个答案:

答案 0 :(得分:7)

我认为你所做的是最好的方法,但你可以通过简单地插入所有内容来使它变得更优雅,如下所示:

public static void main(String[] args) {
    println new StringBuilder("EUTQQGOPED").insert(6, '-').insert(3, '-');
}

由于StringBuilder提供fluent interface(允许方法链接),因此可以使用这种内联。

还要注意插入的转置,因为您使用它们的顺序意味着第一个插入会影响第二个插入的参数。通过命名它们最大的第一意味着它们基本上彼此独立。

而且总是...... “少代码==好”(只要它仍然可读,在这种情况下,它是恕我直言更多可读)

答案 1 :(得分:5)

可以使用正则表达式,它会更清楚你正在做什么,但问题不是那么有效。

String formattedPin = pin.replaceAll("(.{3})(.{3})(.{4})", "$1-$2-$3")
System.out.println(formattedPin);

答案 2 :(得分:3)

为简单起见,我会选择:

def pin = "EUTQQGOPED"
def formatted = [pin[0..2], pin[3..5], pin[6..-1]].join('-')

为简洁起见,这可能是一个黑客攻击,但它很短(而且我觉得它也很可读):

def formatted = "-$pin"[1..3, 0, 4..6, 0, 7..10]

答案 3 :(得分:2)

这些是Groovy为您提供的几个选项。在这种情况下,它们不一定非常容易阅读,但它们很好而且很短。

    def pin = "EUTQQGOPED"

    // Option 1
    def formatted1 = "${pin[0..2]}-${pin[3..5]}-${pin[6..-1]}" 
    println formatted1

    // Option 2
    def pt1 = pin[0..2]
    def pt2 = pin[3..5]
    def pt3 = pin[6..-1]

    def formatted2 = pt1 << "-" << pt2 << "-" << pt3
    println formatted2

答案 4 :(得分:2)

虽然我喜欢String.format选项,但我觉得分手看起来更加丑陋。

    String pin = "EUTQQGOPED";
    System.out.println(String.format("%s-%s-%s", pin.substring(0, 3), pin.substring(3,6), pin.substring(6)));