Link to home
Start Free TrialLog in
Avatar of LeighWardle
LeighWardleFlag for Australia

asked on

VB6 function to format floating point number rounded to specified number of significant figures

Hi Experts,

I am looking for a VB6 function that will format floating point numbers (say doubles) rounded to a specified number of significant figures.
I do not want scientific format.

Regards,
Leigh
Avatar of Om Prakash
Om Prakash
Flag of India image


Dim a As Double
a = 12.333
MsgBox (FormatNumber(a, 2))
'gives Output as 12.33

Open in new window

Avatar of LeighWardle

ASKER

om_prakash_p:

That code does not work for all inputs, for example:

when a = -0.00000033358

the output should be -0.00000033, but your code gives 0.00
The code simply formats the number and displays the number of 0's required after decimal.
So the output for
a = -0.00000033358
is
0.00

If you round variable "a"
MsgBox (Round(a, 8))
then you get the output you want.
Even this will not work for all cases. you need to handle those conditions separately.
ASKER CERTIFIED SOLUTION
Avatar of Thomasian
Thomasian
Flag of Philippines image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thomasian:

I had independently tried that code earlier, but had abandonded it because it did not work for negative numbers.
Thanks for the fix.

It also needed a fix for the case when the input is zero.
See my modified code below.
    'Returns input number rounded to specified number of significant figures.
    Function FormatSF(dblInput As Double, intSF As Integer) As String
    Dim intCorrPower As Integer         'Exponent used in rounding calculation
    Dim intSign As Integer              'Holds sign of dblInput since logs are used in calculations
    FormatSF = "0"                      'default
    '-- Store sign of dblInput --
    intSign = Sgn(dblInput)
    If dblInput <> 0# Then 'dblInput cannot be zero or Log10 will crash
        '-- Calculate exponent of dblInput --
        intCorrPower = Int(Log10(Abs(dblInput)))
        FormatSF = Round(dblInput * 10 ^ ((intSF - 1) - intCorrPower))   'integer value with no sig fig
        FormatSF = FormatSF * 10 ^ (intCorrPower - (intSF - 1))         'raise to original power
        '-- Reconsitute final answer --
        'FormatSF = FormatSF * intSign 'deactivated to fix negative values
        '-- Answer sometimes needs padding with 0s --
        If InStr(FormatSF, ".") = 0 Then
            If Len(FormatSF) < intSF Then
                FormatSF = Format(FormatSF, "##0." & String(intSF - Len(FormatSF), "0"))
            End If
        End If
        If intSF > 1 And Abs(FormatSF) < 1 Then
            Do Until Left(Right(FormatSF, intSF), 1) <> "0" And Left(Right(FormatSF, intSF), 1) <> "."
                FormatSF = FormatSF & "0"
            Loop
        End If
    End If
    End Function

Open in new window