[Javascript] thousand separator
Paul Novitski
paul at novitskisoftware.com
Fri Jun 4 14:21:13 CDT 2004
Shawn,
[I fear this thread will become tiresome to others on the list, so if
anyone complains perhaps we should move it to the multi-lingual listserve
'multiweb' at googlegroups.com. I do find the subject quite interesting.]
Your latest number-formatting script was definitely an improvement. I have
these suggestions:
_______________________________
1) The test for Chinese & Japanese should be /(zh-|ja)/ to cover the codes
ja, zh-tw, zh-cn, zh-hk, & zh-sg. MSDN list of language codes:
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/language_codes.asp
_______________________________
2) To make the function more flexible, I'd add an optional argument whereby
the caller can specify the language code:
function addCommas_skm_pdn(someNum, langCode){
if (langCode)
{
var regionTest = langCode
} else {
var regionTest = navigator.systemLanguage + '' + navigator.language
}
That way, the function can be used to display different nation's currency
formats regardless of the local settings of the user's browser.
_______________________________
3) Supporting the Indian pattern (separating the first group of 3 then 2
thereafter) is easy if both match & replace RegExps are dynamic during the
loop, inserting the proper Group value with each iteration. Pseudocode:
- default Group = 3
- zh/ja Group = 4
while (match)
- replace one
- if Hindi, Group = 2
- modify match & replace RegExps
loop
_______________________________
4) The zh/ja group separator, now that I read the fine print, changes to a
new character for each group of 10,000; see:
http://www.xencraft.com/resources/multi-currency.html#ja-count
This can be handled easily:
[a]
// create array of Chinese/Japanese separators
var aZhJa = new array(U+4E07, U+5104, U+5146, U+4EAC, U+5793, U+79BE,
U+7A63, U+6E9D, U+6F97, U+6B63, U+8F09, U+6975);
var iteration = 0;
[b]
while (someNum.match(reMatch))
{
// change the zh/ja separator each time
if (regionTest.match(/(zh-|ja)/i))
{ strThou = aZhJa[iteration];}
[b]
someNum = someNum.replace(reReplace, '$1' + strThou + '$2');
iteration++;
}
Notes:
[a] I'm unsure how to represent & manipulate UTF-16 character codes in
JavaScript; I'll have to read up on that.
[b] The ZH/JA separators need to find their way into the match() &
replace() regexp's, either by loading them all in from the start or by
modifying the regexp's after each replacement.
_______________________________
5) To keep the loop code from getting too gnarly, it might be desireable to
separate the formatting into two processes: positioning the separators and
determining their value. For example, one could insert "[#]" each time
where # = the iteration number, then replace those afterward with logic
like this:
var iteration = 0;
while (someNum.match(reMatch))
{
someNum = someNum.replace(reReplace, '$1\[' + iteration + '\]$2');
iteration++;
}
before: 1234567890
after: 1[3]234[2]567[1]890
or: 1[4]23[3]45[2]67[1]890 (Hindi)
or: 12[2]3456[1]7890 (Chinese/Japanese)
then: replace each [#] with separator
if zh/ja, different character each time
else single character per language group
// if Zh/Ja, replace each separator with a different character
if (regionTest.match(/zh|ja/i)
{
for (var i=0; i < aZhJa.length; i++)
{
reReplace = "[\" + i + "\]"
reReplace = new RegExp(reReplace)
someNum = someNum.replace(reReplace, aZhJa[i])
}
// everyone else uses the same separator throughout
} else {
someNum = someNum.replace(/\[\d\]/g, sThou)
}
_______________________________
Finally, here are some links I've found useful while playing with this:
Language Codes (MSDN)
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/language_codes.asp
Language Codes: ISO 639, Microsoft and Macintosh (UNICODE)
http://www.unicode.org/onlinedat/languages.html
Country Codes: ISO 3166, Microsoft, and Macintosh (UNICODE)
http://www.unicode.org/onlinedat/countries.html
Currency Internationalization, Multiple Currencies and Foreign Exchange
(XenCraft.com)
http://www.xencraft.com/resources/multi-currency.html
Detect foreign language support using JavaScript (article)
http://builder.com.com/5100-6371-5069931.html
More information about the Javascript
mailing list