在 Racket 中对字符串中的数字进行 commatize 的简单函数
Easy function to commatize a number in string in Racket
给字符串中的数字加逗号,有没有简单的函数可以通用?我找到了一种方法,但它看起来很复杂但很全面:https://rosettacode.org/wiki/Commatizing_numbers#Racket
我只是想要一个功能如下:
(addcommas 1234567890)
"1,234,567,890"
(有点奇怪的是,拥有许多高级功能的Racket没有针对这种常见需求的内置功能)。
你可以试试这个:
(define (addcommas n)
(define (split n acc)
(if (< (abs n) 1000)
(cons n acc)
(let-values ([(quot rem) (quotient/remainder n 1000)])
(split quot (cons (abs rem) acc)))))
(apply ~a (split n '()) #:separator ","))
(addcommas -2332342390)
;; -> "-2,332,342,390"
如果你想格式化实数,因为它们有二进制表示,并且转换可能不精确,你必须添加一个精度参数来指定小数点后的位数:
(define (addcommas-real n precision)
(let* ((int-part (exact-truncate n))
(float-part (exact-truncate (* (- n int-part) (expt 10 precision)))))
(~a (addcommas int-part) "." (abs float-part))))
(addcommas-real -2332342390.34 2)
;; -> "-2,332,342,390.34"
(addcommas-real -2332342390.34 5)
;; -> "-2,332,342,390.34000"
给字符串中的数字加逗号,有没有简单的函数可以通用?我找到了一种方法,但它看起来很复杂但很全面:https://rosettacode.org/wiki/Commatizing_numbers#Racket
我只是想要一个功能如下:
(addcommas 1234567890)
"1,234,567,890"
(有点奇怪的是,拥有许多高级功能的Racket没有针对这种常见需求的内置功能)。
你可以试试这个:
(define (addcommas n)
(define (split n acc)
(if (< (abs n) 1000)
(cons n acc)
(let-values ([(quot rem) (quotient/remainder n 1000)])
(split quot (cons (abs rem) acc)))))
(apply ~a (split n '()) #:separator ","))
(addcommas -2332342390)
;; -> "-2,332,342,390"
如果你想格式化实数,因为它们有二进制表示,并且转换可能不精确,你必须添加一个精度参数来指定小数点后的位数:
(define (addcommas-real n precision)
(let* ((int-part (exact-truncate n))
(float-part (exact-truncate (* (- n int-part) (expt 10 precision)))))
(~a (addcommas int-part) "." (abs float-part))))
(addcommas-real -2332342390.34 2)
;; -> "-2,332,342,390.34"
(addcommas-real -2332342390.34 5)
;; -> "-2,332,342,390.34000"