let string_of_size ?(fuzzy=false) sz = 
  let buffer = Buffer.create 16
  in
  let append_unit unt vl =
    begin
      if Buffer.length buffer = 0 then
        ()
      else
        Buffer.add_char buffer ' '
    end;
    Printf.bprintf buffer "%d %s" (truncate vl) unt;
    vl -. (float_of_int (truncate vl))
  in
  let rec string_of_size_aux sz =
    if fuzzy && (Buffer.length buffer > 0) then
      Buffer.contents buffer
    else
      begin
        match sz with
          TB f when f > 1.0 -> 
            string_of_size_aux (TB (append_unit "TB" f))
        | GB f when f > 1.0 ->
            string_of_size_aux (GB (append_unit "GB" f))
        | MB f when f > 1.0 ->
            string_of_size_aux (MB (append_unit "MB" f))
        | KB f when f > 1.0 ->
            string_of_size_aux (KB (append_unit "KB" f))
        | B  f when f > 1.0 ->
            string_of_size_aux (B  (append_unit "B"  f))
        | B  f ->
            Buffer.contents buffer
        | sz ->
            string_of_size_aux (size_convert_down sz)
      end
  in
  string_of_size_aux sz