80 lines
2.7 KiB
Plaintext
80 lines
2.7 KiB
Plaintext
var commatize = Fn.new { |s, start, step, sep|
|
|
var addSeps = Fn.new { |n, dp|
|
|
var lz = ""
|
|
if (!dp && n.startsWith("0") && n != "0") {
|
|
var k = n.trimStart("0")
|
|
if (k == "") k = "0"
|
|
lz = "0" * (n.count - k.count)
|
|
n = k
|
|
}
|
|
if (dp) n = n[-1..0] // invert if after decimal point
|
|
var i = n.count - step
|
|
while (i >= 1) {
|
|
n = n[0...i] + sep + n[i..-1]
|
|
i = i - step
|
|
}
|
|
if (dp) n = n[-1..0] // invert back
|
|
return lz + n
|
|
}
|
|
|
|
var t = s.toList
|
|
var isExponent = Fn.new { |c| "eEdDpP^∙x↑*⁰¹²³⁴⁵⁶⁷⁸⁹".contains(c) }
|
|
var acc = (start == 0) ? "" : t.toList[0...start].join()
|
|
var n = ""
|
|
var dp = false
|
|
for (j in start...t.count) {
|
|
var c = t[j].codePoints[0]
|
|
if (c >= 48 && c <= 57) {
|
|
n = n + t[j]
|
|
if (j == t.count-1) {
|
|
if (acc != "" && isExponent.call(acc[-1])) {
|
|
acc = s
|
|
} else {
|
|
acc = acc + addSeps.call(n, dp)
|
|
}
|
|
}
|
|
} else if (n != "") {
|
|
if (acc != "" && isExponent.call(acc[-1])) {
|
|
acc = s
|
|
break
|
|
} else if (t[j] != ".") {
|
|
acc = acc + addSeps.call(n, dp) + t[j..-1].join()
|
|
break
|
|
} else {
|
|
acc = acc + addSeps.call(n, dp) + t[j]
|
|
dp = true
|
|
n = ""
|
|
}
|
|
} else {
|
|
acc = acc + t[j]
|
|
}
|
|
}
|
|
|
|
System.print(s)
|
|
System.print(acc)
|
|
System.print()
|
|
}
|
|
|
|
// special version of the above which uses defaults for start, step and sep.
|
|
var commatize2 = Fn.new { |s| commatize.call(s, 0, 3, ",") }
|
|
|
|
commatize.call("123456789.123456789", 0, 2, "*")
|
|
commatize.call(".123456789", 0, 3, "-")
|
|
commatize.call("57256.1D-4", 0, 4, "__")
|
|
commatize.call("pi=3.14159265358979323846264338327950288419716939937510582097494459231", 0, 5, " ")
|
|
commatize.call("The author has two Z$100000000000000 Zimbabwe notes (100 trillion).", 0, 3, ".")
|
|
|
|
var defaults = [
|
|
"\"-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."
|
|
]
|
|
|
|
defaults.each { |d| commatize2.call(d) }
|