2012-03-20 16 views
5

PRIMA:Esiste un modo più elegante/elegante per formattare il seguente numero di previdenza sociale come String con o senza Groovy?

EUTQQGOPED 

DOPO:

EUT-QQG-OPED 

L'esempio che segue è quello che mi è venuta per aggiungere '-' in una stringa di 10 caratteri come parte di un requisito di leggibilità. Il modello di formattazione è simile a come un numero di sicurezza sociale degli Stati Uniti viene spesso formattato.

Esiste un modo più semplice e meno dettagliato di eseguire il formato aggiuntivo?

risposta

7

Penso che quello che hai fatto è il modo migliore per farlo, tuttavia si potrebbe rendere più elegante, semplicemente in-fodera tutto, come segue:

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

Questo tipo di a -lining è possibile grazie a StringBuilder che fornisce uno fluent interface (che consente il concatenamento del metodo).

Nota anche la trasposizione degli inserti, perché l'ordine in cui li hai inseriti significa che il primo inserimento influisce sui parametri del secondo inserto. Ordinandoli più grandi, i primi sono sostanzialmente indipendenti l'uno dall'altro.

E c'è sempre ... "meno codice == buono" (fintanto che è ancora leggibile, e in questo caso è IMHO più leggibile)

+0

Meno codice di solito == cattivo come diminuzione della leggibilità e aumento dei costi di manutenzione :) – Adam

+2

Codice più leggibile == buono (non importa se minore o maggiore). :) – David

+0

+1 Inlining il codice originale ha fatto la differenza in questo caso, questo si legge bene. – David

5

È possibile utilizzare regex, è leggermente più chiaro di quello che si sta facendo, ma non è altrettanto efficiente.

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

Uso creativo di regex. Mi piace. – pimaster

+0

Bella risposta! Forse prenderei in considerazione l'uso di '/(...)(...)(.*)/' come espressione regolare, giusto per mantenerlo estremamente semplice. – epidemian

2

Queste sono un paio di opzioni che Groovy ti offre. Non leggono necessariamente molto facilmente in questo caso, ma sono carini e brevi.

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

Mentre mi piace l'opzione String.format, penso che la rottura in su sembra più brutto.

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

Ho giocato anche con questo. Trovo la sintassi che intimidisce. –

2

Per semplicità, mi piacerebbe andare con:

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

Per brevità, questo potrebbe essere un hack, ma è molto breve (e penso che sia abbastanza leggibile anche hehe):

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

Questa seconda opzione è sicuramente succinta. Potrebbe anche essere usato in questo modo 'def formatted = pin [0..2," - ", 3..5," - ", 6..9]'. Il che rende leggermente più ovvio cosa sta succedendo (IMO). – David

+1

@David Non riesco a far funzionare quell'espressione (lancia StringIndexOutOfBoundsException; I'm on Groovy 1.8.6). Sei sicuro che sia valido Groovy?In effetti, renderebbe l'intento più chiaro. – epidemian

+0

Ah, sì hai ragione. Scusa, stavo mescolando tra la costruzione di una lista (come fai nel primo esempio) e l'affettatura della stringa con gli indici. – David

Problemi correlati