2012-03-20 7 views
5

' - ' 10文字の文字列への読みやすさの要件の一部としてGroovyの有無にかかわらずStringのような社会保障番号をフォーマットするための、より簡潔でエレガントな方法はありますか?</p> <pre><code>EUTQQGOPED </code></pre> <p>AFTER:BEFORE

EUT-QQG-OPED 

次の例では、私が追加することを思い付いたものです。書式設定のパターンは、米国社会保障番号がしばしばフォーマットされる方法と似ています。

追加フォーマットを実行するのが簡単で控えめな方法がありますか?

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 
} 

答えて

7

は、しかし私は、あなたがでそれがよりエレガントにすることができ、何をやったことは、それを行うための最善の方法だと思う単純で、ライニング、次のように、すべてのものを:

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

におけるこの種のStringBuilderがfluent interface(メソッド連鎖を可能にする)を提供するため、線引きが可能です。

また、挿入の順序は、最初の挿入が2番目の挿入のパラメータに影響するためです。それらを最大の優先順位で注文することは、基本的に互いに独立していることを意味します。簡単にするために

そして常にあります...(限り、それはまだ読めるのですが、この場合には、それは私見より読みやすいよう)「少ないコード==良い」

+0

一般的に、コードが少なくても可読性が低下し、メンテナンスコストが増加します。:) – Adam

+2

可読性の高いコード==良い(それほど重要ではありません)。 :) – David

+0

+1この場合、元のコードをインライン展開するとすべての違いが生じ、これはうまく読み込めます。 – David

5

は、正規表現を使用することができ、それはあなたが何をやっている少し明確だが、効率的ではないPROB。

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

正規表現のクリエイティブな使用。私はそれが好きです。 – pimaster

+0

ニースの答え!たぶん、正規表現として '/(...)(...)(.*)/'を使うことを考えてみましょう。 – epidemian

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 
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))); 
+0

私もこれで演奏しました。私は威圧的な構文を見つける。 –

2

、私は行くだろう:

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] 
+0

その2番目のオプションは間違いなく簡潔です。これは 'def formatted = pin [0..2、" - "、3..5、" - "、6..9]'のように使用することもできます。これは、何が起こっているのかを少しはっきりさせる(IMO)。 – David

+1

@Davidその式を動作させることができません(StringIndexOutOfBoundsExceptionをスローします;私はGroovy 1.8.6を使用しています)。 Groovyが有効であると確信していますか?それは確かに意図をより明確にするでしょう。 – epidemian

+0

ああ、そうですね。申し訳ありませんが、最初の例のようにリストを作成してからインデックスで文字列をスライスするまでの間に混乱していました。 – David

関連する問題

 関連する問題