2015-09-01 16 views
12

Sto provando a stampare un elenco di stringhe tutte riempite alla stessa larghezza.Riempimento di una stringa rapida per la stampa

In C, vorrei usare qualcosa come printf("%40s", cstr), dove cstr è una stringa C.

Nel Swift, il meglio che potevo venire è questo:

line += String(format: "%40s",string.cStringUsingEncoding(<someEncoding>)) 

Esiste un modo migliore?

risposta

10

NSString ha il metodo stringByPaddingToLength::

line += string.stringByPaddingToLength(40, withString: " ", startingAtIndex: 0) 
+1

Per aggiungere padding a sinistra, dobbiamo scrivere il nostro codice, estensione String { func PadLeft (totalWidth: Int, byString: String) -> String { lasciare toPad = totalWidth - auto.. characters.count; se toPad <1 { return self; } return "" .stringByPaddingToLength (toPad, withString: byString, startingAtIndex: 0) + self; } } –

5

Mettere tutto string-format-code in extension e riutilizzarlo dove vuoi.

extension String { 
    func padding(length: Int) -> String { 
     return self.stringByPaddingToLength(length, withString: " ", startingAtIndex: 0) 
    } 

    func padding(length: Int, paddingString: String) -> String { 
     return self.stringByPaddingToLength(length, withString: paddingString, startingAtIndex: 0) 
    } 
} 

var str = "str" 
print(str.padding(10)) // "str  " 
print(str.padding(10, paddingString: "+")) // "str+++++++" 
+0

Sembra che queste funzioni stiano i linefeed dall'output. – Johan

35

In Swift 3 è possibile utilizzare:

let str = "Test string" 
let paddedStr = str.padding(toLength: 20, withPad: " ", startingAt: 0) 

stringa Risultato: "Test string "

Se avete bisogno di pad a sinistra, il testo (a destra giustificare), è possibile scrivere il seguente funzione come estensione a String:

extension String { 
    func leftPadding(toLength: Int, withPad character: Character) -> String { 
     let newLength = self.characters.count 
     if newLength < toLength { 
      return String(repeatElement(character, count: toLength - newLength)) + self 
     } else { 
      return self.substring(from: index(self.startIndex, offsetBy: newLength - toLength)) 
     } 
    } 
} 

Quindi, se si scrive: stringa

let str = "Test string" 
let paddedStr = str.leftPadding(toLength: 20, withPad: " ") 

Risultato: " Test string"

In Swift 4 il metodo substring è deprecato e ci sono un certo numero di nuovi metodi per ottenere una stringa. O prefix, suffix o sottoscrizione dello String con un Range<String.Index>.

Per l'estensione precedente, è possibile utilizzare il metodo suffix per ottenere lo stesso risultato. Poiché il metodo suffix restituisce un valore String.SubSequence, è necessario convertirlo in String prima di essere restituito.

extension String { 
    func leftPadding(toLength: Int, withPad character: Character) -> String { 
     let stringLength = self.characters.count 
     if stringLength < toLength { 
      return String(repeatElement(character, count: toLength - stringLength)) + self 
     } else { 
      return String(self.suffix(toLength)) 
     } 
    } 
} 
+1

Perfetto! Grazie ! – BSQ