2015-08-31 3 views
6

Sto cercando un modo idiomatico (forse incorporato) di riempire le rappresentazioni di stringa di interi con zeri a sinistra.Come si esegue il rilievo delle rappresentazioni di stringa degli interi in Haskell?

Nel mio caso i numeri interi sono mai più di 99 in modo

fix r = if length r == 1 then '0':r else r 
fix.show <$> [1..15] 

opere. Ma mi aspetto che ci sia un modo migliore.

Come si esegue il rilievo delle rappresentazioni di stringa di numeri interi in Haskell?

+4

mi consiglia di utilizzare [ 'Text.Printf'] (http://hackage.haskell.org/package/base-4.6.0.1/docs/Text-Printf.html), dal momento che è una costruito nel modulo per la formattazione di stringhe. – bheklilr

risposta

11

printf formattazione dello stile è availble attraverso il modulo Text.Printf:

import Text.Printf 

fmt x = printf "%02d" x 

O per caso particolare la formattazione di 0:

fmt 0 = " " 
fmt x = printf "%02d" x 
+0

Mi piacerebbe usare questo, ma manca un caso, dalla mia domanda originale. Posso rendere questo spettacolo '0' come' "" '(due spazi), piuttosto che' "00" '? – orome

+0

Risposta modificata. – ErikR

+0

Grazie. Ma niente di intelligente da fare in 'printf' è corretto? – orome

4
> (\x -> replicate (3 - length x) '0' ++ x) "2" 
"002" 
> (\x -> replicate (3 - length x) '0' ++ x) "42" 
"042" 
> (\x -> replicate (3 - length x) '0' ++ x) "142" 
"142" 
> (\x -> replicate (3 - length x) '0' ++ x) "5142" 
"5142" 

È possibile che sfrutta il fatto che replicate restituisce il vuoto stringa su argomento negativo.

3

Per motivi di completezza, aggiungo qui un programma di riempimento qualsiasi elenco di stringhe con un carattere passato come argomento.

Piuttosto che prendere il massimo delle lunghezze dal get go, io uso un'istanza di circular programming: se guardi attentamente, vedrai che n è il risultato di un calcolo ... in cui viene utilizzato!

pad :: Char -> [String] -> [String] 
pad c xs = ys where 
    (ys, n)   = foldr cons ([],0) xs 
    cons x (acc, m) = ((replicate (n - m') C++ x) : acc, max m m') 
    where m' = length x 
+0

Questa è una tecnica interessante, ma non penso che abbia molto valore in questo caso. Se, d'altra parte, volessi riempire la * fine * di ogni stringa, allora usare una tecnica simile con numeri pigri naturali potrebbe aggiungere pigrizia potenzialmente utile. – dfeuer

Problemi correlati