简单的功能,以便在Racket中对字符串中的数字进行汇编

时间:2016-08-20 04:27:02

标签: scheme racket

要将逗号添加到字符串中的数字,是否可以使用简单的函数来处理常见情况?我发现了一种方法,但它看起来很复杂但很全面:https://rosettacode.org/wiki/Commatizing_numbers#Racket

我只想拥有一个如下工作的功能:

(addcommas 1234567890)
"1,234,567,890"

(有一点令人惊讶的是,具有许多高级功能的Racket没有针对这一常见要求的内置功能)。

1 个答案:

答案 0 :(得分:2)

你可以试试这个:

(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"