# Vectorized sprintf?

**URL:** <https://discourse.julialang.org/t/vectorized-sprintf/91526>\
**Category:** General Usage\
**Created:** [December 11, 2022, 1:17pm UTC](https://discourse.julialang.org/t/vectorized-sprintf/91526 "2022-12-11T13:17:59Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![tp2750](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tp2750/32/207806_2.png) [@tp2750](https://discourse.julialang.org/u/tp2750)\
**Post date:** [December 11, 2022, 1:17pm UTC](https://discourse.julialang.org/t/vectorized-sprintf/91526/1 "2022-12-11T13:17:59Z")

</div>

In R I can easily generate vectors of formatted strings like this:

```r
> sprintf("a%.2d", 1:10)
 [1] "a01" "a02" "a03" "a04" "a05" "a06" "a07" "a08" "a09" "a10"

```

What is the closest in julia?

As @sprintf is a macro I cannot do

```julia
using Printf
@sprintf.("a%.2d", 1:10)
ERROR: syntax: invalid macro usage "@(sprintf.(("a%.2d", 1:10)))"

```

If I give up the formatting, I can do:

```julia
julia> string.("a", 1:10)
10-element Vector{String}:
 "a1"
 "a2"
 "a3"
 "a4"
 "a5"
 "a6"
 "a7"
 "a8"
 "a9"
 "a10"

```

The solutions I have found are `map` or list comprehension:

```julia
using Printf
map( x-> @sprintf("a%.2d", x), 1:10)
10-element Vector{String}:
 "a01"
 "a02"
 "a03"
 "a04"
 "a05"
 "a06"
 "a07"
 "a08"
 "a09"
 "a10"
[@sprintf("a%.2d", x) for x in 1:10];

```

but both are longer than broadcasting had @sprintf been a function.

What is the idiomatic solution?

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [December 11, 2022, 3:20pm UTC](https://discourse.julialang.org/t/vectorized-sprintf/91526/2 "2022-12-11T15:20:43Z")

</div>

You can try Printf.Format, see [example here.](https://discourse.julialang.org/t/how-to-repeat-the-format-in-printf/66695/8), or use a helper function as [here](https://discourse.julialang.org/t/how-to-repeat-the-format-in-printf/66695/11).

---

<div class="post-metadata">

**Author:** ![tp2750](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tp2750/32/207806_2.png) [@tp2750](https://discourse.julialang.org/u/tp2750)\
**Post date:** [December 11, 2022, 3:35pm UTC](https://discourse.julialang.org/t/vectorized-sprintf/91526/3 "2022-12-11T15:35:24Z")

</div>

Thank you @rafael.guerra .

They way I understand your comment, the suggestion is something like this:

```julia
Printf.format.(Ref(Printf.Format("a%.2d")),1:10)
10-element Vector{String}:
 "a01"
 "a02"
 "a03"
 "a04"
 "a05"
 "a06"
 "a07"
 "a08"
 "a09"
 "a10"

```

Also a bit long for my taste.

---

<div class="post-metadata">

**Author:** ![mcabbott](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mcabbott/32/6603_2.png) [@mcabbott](https://discourse.julialang.org/u/mcabbott)\
**Post date:** [December 11, 2022, 3:56pm UTC](https://discourse.julialang.org/t/vectorized-sprintf/91526/4 "2022-12-11T15:56:26Z")

</div>

There’s a string macro which is a bit tidier. I wonder why Format objects aren’t made scalar under broadcasting, since they aren’t iterable / indexable. That’s a small change, a larger one would be to make them callable:

```julia
julia> using Printf: format, @format_str, Format

julia> Broadcast.broadcastable(f::Format) = Ref(f)

julia> format.(format"a%.2d", 1:10)
10-element Vector{String}:
 "a01"
[...]

julia> (f::Format)(x) = format(f, x)

julia> format"a%.2d".(1:10)
10-element Vector{String}:
 "a01"
[...]

```

---

<div class="post-metadata">

**Author:** ![tp2750](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tp2750/32/207806_2.png) [@tp2750](https://discourse.julialang.org/u/tp2750)\
**Post date:** [December 11, 2022, 5:22pm UTC](https://discourse.julialang.org/t/vectorized-sprintf/91526/5 "2022-12-11T17:22:09Z")

</div>

Thanks @mcabbott

This is a lot closer to what I would expect from julia - in particular the last one. But it is annoying that ` @format_str` is not exported and it does not work “out of the box”.

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [December 11, 2022, 8:09pm UTC](https://discourse.julialang.org/t/vectorized-sprintf/91526/6 "2022-12-11T20:09:58Z")

</div>

> [@mcabbott](#):
>
> I wonder why Format objects aren’t made scalar under broadcasting

Would be an easy PR if anyone wants to take it on. Maybe file an issue and mark it with the “Good first issue” tag.

---

<div class="post-metadata">

**Author:** ![rmsmsgood](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rmsmsgood/32/20544_2.png) [@rmsmsgood](https://discourse.julialang.org/u/rmsmsgood)\
**Post date:** [December 12, 2022, 7:18am UTC](https://discourse.julialang.org/t/vectorized-sprintf/91526/7 "2022-12-12T07:18:34Z")

</div>

It’s not the closest to your example, but i guess most idiomatic in julia.

```julia
julia> "a" .* lpad.(1:10, 2, '0')
10-element Vector{String}:
 "a01"
 "a02"
 "a03"
 "a04"
 "a05"
 "a06"
 "a07"
 "a08"
 "a09"
 "a10"

```

---

<div class="post-metadata">

**Author:** ![tp2750](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tp2750/32/207806_2.png) [@tp2750](https://discourse.julialang.org/u/tp2750)\
**Post date:** [December 12, 2022, 7:58am UTC](https://discourse.julialang.org/t/vectorized-sprintf/91526/8 "2022-12-12T07:58:07Z")

</div>

Thanks @rmsmsgood I totally forgot about lpad 😄
