in reply to Formating numbers with thousand separator - Solution for web-applications

Hi K, I took your comment that this is difficult with regex as a challenge. As I do not speak any Javascript, I have no idea whether my little code can be translated, so it will most likely not fit your purpose. I found it more difficult than expected, especially when trying to add variables for the separators. So here is my piece, not to be taken as a competitor to yours:

use strict; use warnings; sub fmthd { # number, decimal separator, thousands separator my ( $dec, $thd ) = ( $_[1] // ".", $_[2] // "," ); my ( $n, $d ) = split /\Q$dec\E/, shift; my $s = $n<0?"-":""; $n = reverse $n; return $s.reverse( $n = join $thd, $n =~ /(\d{1,3})/g ).($d?"$dec$d" +:"${dec}00"); } print fmthd( 1234567.14 ), "\n"; print fmthd( 1234567 ), "\n"; print fmthd( 12.14 ), "\n"; print fmthd( 123456.14343 ), "\n"; print fmthd( 1234567.14 ), "\n"; print fmthd( 8881234567.14 ), "\n"; print fmthd( -8881234567.14 ), "\n"; print fmthd( "-8881234567,14", ",", "." ), "\n";

One comment though: your Perl code seems to lose the minus sign for negative numbers.

  • Comment on Re: Formating numbers with thousand separator - Solution for web-applications
  • Download Code

Replies are listed 'Best First'.
Re^2: Formating numbers with thousand separator - Solution for web-applications
by Zzenmonk (Sexton) on May 27, 2013 at 18:23 UTC

    Thx

    This snippet is anyway only thought as a base. It needs to be customized for your requirements. I found this solution nice because it is short and easy to understand (and to debug!). Accordingly you can easily add features in JavaScript or PERL without ending up with a code monster. I use the same principle for example to format the IBAN account number (a financial standard to identify an account made of 12 to 34 alphanumeric characters) for display purposes.

    As I searched the net I found a lot of solutions with regexp especially in the area of JavaScript. Things like /\B(?=(\d{3})+(?!\d))/'/g, if it may inspire you. I tried two or three of them and gave up because they did not work.

    An expert in C would also tell you, there is a solution with the printf function family. Not being an expert, I could not find a format mask allowing for any number size (in fact it takes more time to read the man page than to write this).

    Effectively this code is loosing the signs. It was designed to format amounts for a banking application. In this application the amounts are always positive. So I did not have the issue.

    K

    The best medicine against depression is a cold beer!