整数をカンマ区切りの文字列で取得

何故 sprintf で出来ないのだろうか。。

open System;
let fn (x:int) = String.Format("{0:#,#}", x);;

let fn x =
  let cc = [| ""; ""; ""; ","; |]
  let rec fn' x (s:string) =
    if x <= 0 then s
    else
      fn' (x/10) ((string (x%10)) + cc.[s.Length % 4] + s)
  fn' x "";;
  
let fn (x:int) =
  let cc = [| ","; ""; ""; |]
  (string x).ToCharArray()
  |> Array.rev
  |> Array.mapi (fun i x -> ((string) x) + cc.[i%3])
  |> Array.rev
  |> Array.reduce(+)
  |> (fun (s:string) -> s.Trim(','))