2016-08-20 11 views
0

文字列の数値にカンマを追加するには、一般的な状況で使用する簡単な関数がありますか?私は1つの方法を見つけましたが、総合的なものの、それは非常に複雑なようだ:https://rosettacode.org/wiki/Commatizing_numbers#Racketラケットで文字列の数値を連合させる簡単な関数

私は単純に次のように動作機能を持つようにしたい:

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

(ラケット、多くの高レベルの機能を有していることを少しは驚くべきことですこの共通の要件のための組み込み関数はありません)。

答えて

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" 
+0

送信される値が常に正の値であれば機能を単純化できますか? – rnso

+0

2つの 'abs'呼び出しを単に削除してください。 – Renzo

+0

私は、小数点の扱いがはるかに複雑になると考えています。 – rnso