Commatizing numbers: Difference between revisions
Content added Content deleted
m (→{{header|Haskell}}: works with a more recent version of GHC, too) |
|||
Line 789: | Line 789: | ||
6/9/1946 was a good year for some. |
6/9/1946 was a good year for some. |
||
</pre> |
</pre> |
||
=={{header|Nim}}== |
|||
{{trans|Kotlin}} |
|||
This is a translation of the Kotlin (and Go) algorithm with some modifications. |
|||
<lang Nim>import re |
|||
import strutils |
|||
let r = re"(\.[0-9]+|[1-9]([0-9]+)?(\.[0-9]+)?)" |
|||
#--------------------------------------------------------------------------------------------------- |
|||
proc commatize(str: string; startIndex = 0; period = 3; sep = ","): string = |
|||
result = str |
|||
var dp, ip = "" |
|||
if startIndex notin 0..str.high : return |
|||
# Extract first number (if any). |
|||
let (lowBound, highBound) = str.findBounds(r, startIndex) |
|||
if lowBound < 0: return |
|||
let match = str[lowBound..highBound] |
|||
let splits = match.split('.') |
|||
# Process integer part. |
|||
ip = splits[0] |
|||
if ip.len > period: |
|||
var inserted = 0 |
|||
for i in countup(ip.high mod period + 1, ip.high, period): |
|||
ip.insert(sep, i + inserted) |
|||
inc inserted |
|||
# Process decimal part. |
|||
if '.' in match: |
|||
dp = splits[1] |
|||
if dp.len > period: |
|||
for i in countdown(dp.high div period * period, period, period): |
|||
dp.insert(sep, i) |
|||
ip &= '.' & dp |
|||
# Replace the number by its "commatized" version. |
|||
result[lowBound..highBound] = ip |
|||
#——————————————————————————————————————————————————————————————————————————————————————————————————— |
|||
const Tests = [ |
|||
"123456789.123456789", |
|||
".123456789", |
|||
"57256.1D-4", |
|||
"pi=3.14159265358979323846264338327950288419716939937510582097494459231", |
|||
"The author has two Z$100000000000000 Zimbabwe notes (100 trillion).", |
|||
"-in Aus$+1411.8millions", |
|||
"===US$0017440 millions=== (in 2000 dollars)", |
|||
"123.e8000 is pretty big.", |
|||
"The land area of the earth is 57268900(29% of the surface) square miles.", |
|||
"Ain't no numbers in this here words, nohow, no way, Jose.", |
|||
"James was never known as 0000000007", |
|||
"Arthur Eddington wrote: I believe there are " & |
|||
"15747724136275002577605653961181555468044717914527116709366231425076185631031296" & |
|||
" protons in the universe.", |
|||
" $-140000±100 millions.", |
|||
"6/9/1946 was a good year for some."] |
|||
echo Tests[0].commatize(period = 2, sep = "*") |
|||
echo Tests[1].commatize(period = 3, sep = "-") |
|||
echo Tests[2].commatize(period = 4, sep = "__") |
|||
echo Tests[3].commatize(period = 5, sep = " ") |
|||
echo Tests[4].commatize(sep = ".") |
|||
for n in 5..Tests.high: |
|||
echo Tests[n].commatize()</lang> |
|||
{{out}} |
|||
<pre>1*23*45*67*89.12*34*56*78*9 |
|||
.123-456-789 |
|||
5__7256.1D-4 |
|||
pi=3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59231 |
|||
The author has two Z$100.000.000.000.000 Zimbabwe notes (100 trillion). |
|||
-in Aus$+1,411.8millions |
|||
===US$0017,440 millions=== (in 2000 dollars) |
|||
123.e8000 is pretty big. |
|||
The land area of the earth is 57,268,900(29% of the surface) square miles. |
|||
Ain't no numbers in this here words, nohow, no way, Jose. |
|||
James was never known as 0000000007 |
|||
Arthur Eddington wrote: I believe there are 15,747,724,136,275,002,577,605,653,961,181,555,468,044,717,914,527,116,709,366,231,425,076,185,631,031,296 protons in the universe. |
|||
$-140,000±100 millions. |
|||
6/9/1946 was a good year for some.</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |