Velocity Reviews > Formatting Number With Thousands Separator

# Formatting Number With Thousands Separator

Douglas
Guest
Posts: n/a

 04-07-2004
Gday,

How would I format a number so that:

TheValue = 32500

Displays in the TextBox as: \$32,500.00

Thanks a lot
-Douglas

Randy Webb
Guest
Posts: n/a

 04-07-2004
Douglas wrote:

> Gday,
>
>
> How would I format a number so that:
>
> TheValue = 32500
>
> Displays in the TextBox as: \$32,500.00
>

And if the person viewing the page uses . as a separator instead of ,
and uses , instead of . for the decimal?

But, for a hint, convert your number to a String, reverse the String,
then insert the separators, then reverse it back. And then read the FAQ
to find out how to add the 00 on the end (Its in there).

--
Randy
Chance Favors The Prepared Mind
comp.lang.javascript FAQ - http://jibbering.com/faq/

Dr John Stockton
Guest
Posts: n/a

 04-07-2004
JRS: In article <(E-Mail Removed)>, seen in
news:comp.lang.javascript, Randy Webb <(E-Mail Removed)> posted at
Wed, 7 Apr 2004 12:45:08 :
>Douglas wrote:

>> How would I format a number so that:
>>
>> TheValue = 32500
>>
>> Displays in the TextBox as: \$32,500.00
>>

>
>And if the person viewing the page uses . as a separator instead of ,
>and uses , instead of . for the decimal?

Does any form of javascript recognise the possibility of a different
decimal separator or the possibility of a thousands separator (except by

If so, converting the number 12345.6 to string will allow then to be
determined.

>But, for a hint, convert your number to a String, reverse the String,
>then insert the separators, then reverse it back. And then read the FAQ
>to find out how to add the 00 on the end (Its in there).

There's no need to reverse the string.
<URL:http://www.merlyn.demon.co.uk/js-maths.htm#OutComma>

--
<URL:http://jibbering.com/faq/> Jim Ley's FAQ for news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.

Lasse Reichstein Nielsen
Guest
Posts: n/a

 04-08-2004
Dr John Stockton <(E-Mail Removed)> writes:

> Does any form of javascript recognise the possibility of a different
> decimal separator or the possibility of a thousands separator (except by

I can't say that there isn't some application of ECMAScript that doesn't
contain utility functions, but it's not part of ECMAScript, and it's not
in the usual clients.

> There's no need to reverse the string.
> <URL:http://www.merlyn.demon.co.uk/js-maths.htm#OutComma>

I notice the result -,123

expressions with lokahead can be used to make it easier:
---
function tsep(n,swap) {
var ts=",", ds="."; // thousands and decimal separators
if (swap) { ts=","; ts="."; } // swap if requested

var ns = String(n),ps=ns,ss=""; // numString, prefixString, suffixString
var i = ns.indexOf(".");
if (i!=-1) { // if ".", then split:
ps = ns.substring(0,i);
ss = ds+ns.substring(i+1);
}
return ps.replace(/(\d)(?=(\d{3})+([.]|\$))/g,"\$1"+ts)+ss;
}
---

/L
--
Lasse Reichstein Nielsen - http://www.velocityreviews.com/forums/(E-Mail Removed)
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Dr John Stockton
Guest
Posts: n/a

 04-08-2004
JRS: In article <(E-Mail Removed)>, seen in
news:comp.lang.javascript, Lasse Reichstein Nielsen <(E-Mail Removed)>
posted at Thu, 8 Apr 2004 02:08:30 :
>
>> There's no need to reverse the string.
>> <URL:http://www.merlyn.demon.co.uk/js-maths.htm#OutComma>

>
>I notice the result -,123

In a section which starts "Note that ThouS is for non-negative integers,
and Comma is for integers.", from function ThouS, the first line of
which was

function ThouS(SS) { var X = "", S = String(SS), L // SS >= 0

so that result demonstrates that the comment is significant.

That line of the results is now marked as comment.

--
<URL:http://jibbering.com/faq/> Jim Ley's FAQ for news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.

Dr John Stockton
Guest
Posts: n/a

 04-08-2004
JRS: In article <070420041803456176%(E-Mail Removed)>, seen in
news:comp.lang.javascript, Dennis M. Marks <(E-Mail Removed)>
posted at Wed, 7 Apr 2004 18:03:45 :

>I took the challenge and wrote the following. If you find an error, let
>me know.

>/// This script will format positive money values. Pass it a number

/* !!! */ alert(formatMoney(0.07, "£", ".", ",")) // -> 0.70

FAQ 4.6, IIRC, used that underlying method up to 2001-01-22. It was
replaced. The FAQ section cites a page which includes a section
"Testing" which recommends numbers to try : St Luke: Chapter 10, Verse
37, tail, applies.

Familiarising oneself with a newsgroup FAQ before posting protects
against unnecessary embarrassment.

--
<URL:http://jibbering.com/faq/> Jim Ley's FAQ for news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.

Douglas
Guest
Posts: n/a

 04-08-2004
Gday Dennis

thanks very much for your efforts...

While I'm not new to programming, this is probably my first attempt to
modify my own JavaScript.

I have made a couple of minor additions to the code you supplied, and
honestly, didnt have the faintest idea where to start because the syntax /
object model / typing etc are so vastly different from the code I am used to
writing.

Here 'tis... prolly a bit longhand and I'm sure theres more 'efficient' ways
to do the same thing but lets face it its prolly only a couple of cpu cycles
and additionally, those cpu cycles are not run on /my/ server )

Thanks Again.
-Douglas

/// ///
/// JavaScript FormatCurrency Function - FormatCurrency.js ///
/// ///

/// This script will format positive money values. Pass it a number
/// with or without decimal digits. It will be formatted with the currency,
/// thousands, and decimal symbols passed to it.

/// PASSED PARAMETERS
/// theNumber - the number to be formatted
/// theCurrency - the currency symbol
/// theThousands - the thousands separator
/// theDecimal - the decimal separator

function isThousands(position)
{
if (Math.floor(position/3)*3==position) return true;
return false;
};

function formatMoney (theNumber,theCurrency,theThousands,theDecimal)
{

if (theDecimal==undefined)
{
var theDecimalDigits = "";

} else {

var theDecimalDigits =
Math.round((theNumber*100)-(Math.floor(theNumber)*100));
}

theDecimalDigits= "" + (theDecimalDigits + "0").substring(0,2);

theNumber = "" + Math.floor(theNumber);

var theOutput = theCurrency;

for (x=0; x<theNumber.length; x++)
{

theOutput += theNumber.substring(x, x+1);

if (isThousands(theNumber.length-x-1) && (theNumber.length-x-1!=0))
{
theOutput += theThousands;
};
};

if (theDecimal!=undefined)
{
theOutput += theDecimal + theDecimalDigits;
}

return theOutput;
};

----- Original Message -----
From: "Dennis M. Marks" <(E-Mail Removed)>
Newsgroups: comp.lang.javascript
Sent: Thursday, April 08, 2004 9:03 AM
Subject: Re: Formatting Number With Thousands Separator

> In article <4074266f\$0\$27643\$(E-Mail Removed) u>,
> Douglas <(E-Mail Removed)> wrote:
>
> > Gday,
> >
> >
> > How would I format a number so that:
> >
> > TheValue = 32500
> >
> > Displays in the TextBox as: \$32,500.00
> >
> >
> >
> > Thanks a lot
> > -Douglas
> >
> >

> I took the challenge and wrote the following. If you find an error, let
> me know.
>
> <script type="text/javascript">
>
> /// This script will format positive money values. Pass it a number
> with or without decimal digits. It will be formatted with the currency,
> thousands, and decimal symbols passed to it.
> /// PASSED PARAMETERS
> /// theNumber - the number to be formatted
> /// theCurrency - the currency symbol
> /// theThousands - the thousands separator
> /// theDecimal - the decimal separator
>
> function isThousands(position) {
> if (Math.floor(position/3)*3==position) return true;
> return false;
> };
>
> function formatMoney (theNumber,theCurrency,theThousands,theDecimal) {
> var theDecimalDigits =
> Math.round((theNumber*100)-(Math.floor(theNumber)*100));
> theDecimalDigits= ""+ (theDecimalDigits + "0").substring(0,2);
> theNumber = ""+Math.floor(theNumber);
> var theOutput = theCurrency;
> for (x=0; x<theNumber.length; x++) {
> theOutput += theNumber.substring(x,x+1);
> if (isThousands(theNumber.length-x-1) && (theNumber.length-x-1
> !=0)) {
> theOutput += theThousands;
> };
> };
> theOutput += theDecimal + theDecimalDigits;
> return theOutput;
> };
>
>
>
> </script>
>
> --
> Dennis M. Marks
> http://www.dcs-chico.com/~denmarks/
> Replace domain.invalid with dcsi.net
>
>
> -----= Posted via Newsfeeds.Com, Uncensored Usenet News =-----
> http://www.newsfeeds.com - The #1 Newsgroup Service in the World!
> -----== Over 100,000 Newsgroups - 19 Different Servers! =-----

rh
Guest
Posts: n/a

 04-08-2004
Lasse Reichstein Nielsen wrote:
<snip>
> expressions with lokahead can be used to make it easier:
> ---
> function tsep(n,swap) {
> var ts=",", ds="."; // thousands and decimal separators
> if (swap) { ts=","; ts="."; } // swap if requested
>
> var ns = String(n),ps=ns,ss=""; // numString, prefixString, suffixString
> var i = ns.indexOf(".");
> if (i!=-1) { // if ".", then split:
> ps = ns.substring(0,i);
> ss = ds+ns.substring(i+1);
> }
> return ps.replace(/(\d)(?=(\d{3})+([.]|\$))/g,"\$1"+ts)+ss;
> }
> ---
>
> /L

An alternative that doesn't rely on lookahead, and includes
(truncated) \$ formatting requested by the OP:

function tsep(n,swap) {
var ns = String(n), seps = [".",","];
if(swap) seps.reverse();
while(/^([^.,]*\d)(\d{3}([.,]|\$))/.test(ns)) {
ns = ns.replace(/^([^.,]*\d)(\d{3}([.,]|\$))/,"\$1"+seps[1]+"\$2");
}
ns += ((ns.indexOf(seps[0]) < 0) ? seps[0] : "") +"00";
return "\$"+ns.replace(/(\d{2})\d*\$/i,"\$1");
}

Note that e-formatted n is not checked/handled.

../rh

Douglas
Guest
Posts: n/a

 04-09-2004
ok cool

didnt actually notice that problem but thanks for the bugfix

what i was trying to do with my addition was (in pseudocode):

if no decimal parameter is passed,
dont display the decimal value
(i suppose it /should/ round at this point? =P)
otherwise
go the whole hog
end if

sometimes i need to call the full formula

ie:
cost per m² = \$13.65

but the end result will usually be something like:

overall cost = cost per m² * area = \$136,500

so in that case i dont want to include the decimal.

on a second issue, consider the following:

--------------------------------
area cost/m² total
--------------------------------
area1 100 \$13.65 \$1,365
area2 1000 \$14.52 \$14,520
area3 10000 \$17.49 \$174,900
--------------------------------
grand total: \$190,785
--------------------------------

the grand total now comes up with NaN (not a number i assume?)

gtotal = parseFloat(area1) + parseFloat(area2) + parseFloat(area3);

not sure if i should be using parseFloat or ParseInt...

as I mentioned i dont have a c/jscript background so some of this is a
little unclear to me.

-Douglas

----- Original Message -----
From: "Dennis M. Marks" <(E-Mail Removed)>
Newsgroups: comp.lang.javascript
Sent: Friday, April 09, 2004 6:02 AM
Subject: Re: Formatting Number With Thousands Separator - corrected

> Corrected Script
> if (theDecimalDigits < 10) {theDecimalDigits = "0"+theDecimalDigits};
>
>
> <script type="text/javascript">
>
> /// This script will format positive money values. Pass it a number
> with or without decimal digits. It will be formatted with the currency,
> thousands, and decimal symbols passed to it.
> /// PASSED PARAMETERS
> /// theNumber - the number to be formatted
> /// theCurrency - the currency symbol
> /// theThousands - the thousands separator
> /// theDecimal - the decimal separator
>
> function isThousands(position) {
> if (Math.floor(position/3)*3==position) return true;
> return false;
> };
>
> function formatMoney (theNumber,theCurrency,theThousands,theDecimal) {
> var theDecimalDigits =
> Math.round((theNumber*100)-(Math.floor(theNumber)*100));
> if (theDecimalDigits < 10) {theDecimalDigits = "0"+theDecimalDigits};
> theDecimalDigits= ""+ (theDecimalDigits + "0").substring(0,2);
> theNumber = ""+Math.floor(theNumber);
> var theOutput = theCurrency;
> for (x=0; x<theNumber.length; x++) {
> theOutput += theNumber.substring(x,x+1);
> if (isThousands(theNumber.length-x-1) && (theNumber.length-x-1 !=
> 0)) {
> theOutput += theThousands;
> };
> };
> theOutput += theDecimal + theDecimalDigits;
> return theOutput;
> };
>
> </script>
>
> --
> Dennis M. Marks
> http://www.dcs-chico.com/~denmarks/
> Replace domain.invalid with dcsi.net
>
>
> -----= Posted via Newsfeeds.Com, Uncensored Usenet News =-----
> http://www.newsfeeds.com - The #1 Newsgroup Service in the World!
> -----== Over 100,000 Newsgroups - 19 Different Servers! =-----

Dr John Stockton
Guest
Posts: n/a

 04-09-2004
JRS: In article <080420041457482581%(E-Mail Removed)>, seen in
news:comp.lang.javascript, Dennis M. Marks <(E-Mail Removed)>
posted at Thu, 8 Apr 2004 14:57:48 :

>Lines: 183
> ... ... ...
>There is a bug that I am checking into. If the first digit after the
>decimal is zero it drops it.
> ...

You've been posting here long enough to have learnt how follow-up posts
should be formatted; it's explained in the FAQ.

Answer after what needs to be quoted; signatures almost never need be
reproduced.

--
Web <URL:http://www.uwasa.fi/~ts/http/tsfaq.html> -> Timo Salmi: Usenet Q&A.
Web <URL:http://www.merlyn.demon.co.uk/news-use.htm> : about usage of News.
No Encoding. Quotes before replies. Snip well. Write clearly. Don't Mail News.