Запятые в Юлии 1,0 номера любого вида - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужна функция в коде Джулии, num2str, которая бы добавляла запятые или указанный разделитель в соответствующих местах с левой стороны десятичной точки для любого вида действительного числа Джулии, включая BigInt и BigFloat.Возвращается строка для печати. ​​

Например:

flt1 = 122234.141567
println("flt1 num2str($flt1) = ", num2str(flt1))
# Expected output is:
flt1 num2str(122234.141567) = 122,234.141567

Я хочу использовать эту функцию со встроенными функциями print и println.

1 Ответ

0 голосов
/ 17 сентября 2018

На этот вопрос частично ответили здесь , т.е. для целых чисел. Следующая функция должна ответить на необходимость чисел с плавающей точкой и «больших» чисел.

"""
 For any valid number, add appropriate delimiters.
 See "Regular Expressions Cookbook," by Goyvaerts and Levithan, O'Reilly, 2nd Ed, 
 p. 402, for Regex that inserts commas into integers returning a string.
"""
function num2str(num::Number; delim=",")
   decimal_point = "."
   str = string(num)
   strs = split(str, decimal_point)
   left_str = strs[1]
   right_str = length(strs) > 1 ? strs[2] : ""
   left_str = replace(left_str, r"(?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))" => delim)
   decimal_point = occursin(decimal_point, str) ? decimal_point : ""
   return left_str * decimal_point * right_str
end

# Test integers, BigInts, floats, and BigFloats:
int0 = 0
int1 = 123
int2 = 123456789
big1 = big"123"
big2 = big"123456789123456789"
flt1 = 122234.141567
flt2 = 7.12345e9
big3 = big"260123.0"
big4 = big"7.12345e9"

setprecision(20)
println("int0 num2str($int0) \t\t\t\t = ", num2str(int0))
println("int1 num2str($int1) \t\t\t\t = ", num2str(int1))
println("int2 num2str($int2) \t\t\t = ", num2str(int2))
println("big1 num2str($big1) \t\t\t\t = ", num2str(big1))
println("big2 num2str($big2) \t\t = ", num2str(big2))
println("big2 num2str($big2) delim is _ \t = ", num2str(big2, delim="_"))
println("flt1 num2str($flt1) \t\t\t = ", num2str(flt1))
println("flt1 num2str($flt1) delim is _ \t\t = ", num2str(flt1, delim="_"))
println("flt2 num2str($flt2) \t\t\t = ", num2str(flt2))
println("big3 num2str($big3) \t\t\t = ", num2str(big3))
println("big4 num2str($big4) \t\t\t = ", num2str(big4))
println("big4 num2str($big4) delim is _ \t\t = ", num2str(big4, delim="_"))

## ============================== Output ===================================
int0 num2str(0)                                  = 0
int1 num2str(123)                                = 123
int2 num2str(123456789)                          = 123,456,789
big1 num2str(123)                                = 123
big2 num2str(123456789123456789)                 = 123,456,789,123,456,789
big2 num2str(123456789123456789) delim is _      = 123_456_789_123_456_789
flt1 num2str(122234.141567)                      = 122,234.141567
flt1 num2str(122234.141567) delim is _           = 122_234.141567
flt2 num2str(7.12345e9)                          = 7.12345e9
big3 num2str(2.60123e+05)                        = 2.60123e+05
big4 num2str(7.12345e+09)                        = 7.12345e+09
big4 num2str(7.12345e+09) delim is _             = 7.12345e+09

Я ожидаю, что возможность добавлять запятые в конечном итоге будет добавлена ​​либо к print/println, и / или @printf. До тех пор, похоже, это работает.

...