in reply to Can sprintf suppress leading zero for float < 1?

There's probably something I'm missing about your circumstances...
and this is, admittedly, not terribly elegant...
but -- as printf (referred from sprintf says (loosely paraphrased), don't use (s)printf when print would do.
So -- on the off-chance -- would this be acceptable?
my $str; my $val = 0.123456; ($str = $val ) =~ s/^0//; say "\$str: $str";

Output: $str: .123456

Updateprintf caution added

Replies are listed 'Best First'.
Re^2: Can sprintf suppress leading zero for float < 1?
by ikegami (Patriarch) on Apr 15, 2012 at 00:30 UTC

    That doesn't output .123.

      No, it doesn't.

      As posted, it outputs:

      $str: .123456

      when executed on Win7 with 5.014:

      This is perl 5, version 14, subversion 2 (v5.14.2) built for MSWin32-x +86-multi-thread (with 1 registered patch, see perl -V for more detail) Copyright 1987-2011, Larry Wall Binary build 1402 [295342] provided by ActiveState http://www.ActiveSt +ate.com Built Oct 7 2011 15:49:44

      Update: Head slap moment!

      Are you getting a different output? If so, with which perl version?

      No it doesn't. Truncating the original value is left as an exercise (already solved) by OP. So...

      #!/usr/bin/perl use 5.014; # 964932 my $str; my $val = 0.123456; my $fmt = '%.3f'; my $val_trunc = sprintf $fmt, $val; ($str = $val_trunc ) =~ s/^0//; say "\$str: $str";

      Output: $str: .123

        Truncating the original value is left as an exercise (already solved) by OP.

        Except the OP used sprintf and your whole point was he shouldn't use sprintf here. Or does "don't use (s)printf when print would do" mean something else?

        Need to handle negative numbers as well. How about this?

        #!/usr/bin/perl my $value = .23456; my $formatted = sprintf("%.3f", $value); $formatted =~ s/([^0-9])0\./$1./; print "$value => $formatted\n"; $value = $formatted = -.23456; $formatted = sprintf("%.3f", $value); $formatted =~ s/([^0-9])0\./$1./; print "$value => $formatted\n";