I found that the behavior of format ~F is determined by the implementation
of 'number->string'.

If (number->string (exact->inexact 0.0003)) returns "0.0003",
(format "~1,2F" 0.0003) returns "0.00".

If (number->string (exact->inexact 0.0003)) returns "3.0e-4",
(format "~1,2F" 0.0003) returns "3.00e-4".

I think this behavior should be customizable but it seems difficult.

So, I defined three procedures near the top of code and added a comment
that explains them.

If system provides a kind of 'number->string' that can select whether
output is fixed-point notation or exponential notation, user can use it
by overwriting these procedures.

Also, I refactored some code and confirmed all tests are passed in the
following environment.

OS: Windows 8.1 (64bit)
DevTool: MSYS2/MinGW-w64 (64bit) (gcc version 7.1.0 (Rev2, Built by MSYS2 project))
Scheme: Gauche v0.9.6_pre4, Sagittarius v0.8.4, Racket v6.7

I created a pull request as follows.
https://github.com/scheme-requests-for-implementation/srfi-48/pull/3