String format does not work

#lang racket
(printf "width1: |~6d|~6d|\n" 12 345)

Why dose it cause error message " printf: ill-formed pattern string
explanation: tag ~6 not allowed; arguments were: 12 345"?

Ps: on Drracket v8.17

~ is a directive, followed by a letter:

[

13.5 Writing
docs.racket-lang.org

](https://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._fprintf%29%29)

If you want a tilde, use ~~.

Hi & welcome!

Are you trying to format the numbers to 6 digits?

Perhaps you were after something like this:

#lang racket
(define a (~r 12 #:min-width 6))
(define b (~r 345 #:min-width 6))
(printf "width1: ~a~a\n" a b)

which prints

width1:     12   345

~r is documented in 4.4 Strings

2 Likes

Many thanks!

2 Likes

There are alternative format implementations available that do support widths and other features not in the bare-bones one built in to Racket.

SRFI-48 Intermediate Format Strings (Comes bundled with racket):

> (require srfi/48)
> (format #t "width1: |~6F|~6F|\n" 12 345) ; note F instead of d
width1: |    12|   345|

or my slib-format:

> (require slib/format)
> (printf "width1: |~6d|~6d|\n" 12 345)
width1: |    12|   345|
1 Like

How can I know if the function 'format' comes from Racket or srfi/48?

If you hover over the identifier in DrRacket it'll tell you which module provided it.