• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 570
  • Last Modified:

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.

  • 2
  • 2
1 Solution
Om PrakashCommented:

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

Open in new window

LeighWardleAuthor Commented:

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
Om PrakashCommented:
The code simply formats the number and displays the number of 0's required after decimal.
So the output for
a = -0.00000033358

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.
Check this out


It seems to have issues with negative numbers though.

Remove this line from the code to fix it.

FormatSF = FormatSF * intSign

LeighWardleAuthor Commented:

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"
        End If
    End If
    End Function

Open in new window

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now