Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Number format regional settings in VB6

Posted on 2008-10-01
5
Medium Priority
?
2,364 Views
Last Modified: 2010-05-18
I have an app that is developed in vb6. When I do calculations I format numbers based on a '.' for the decimals. I now have customers in the Netherlands who format using ',' and when I do any calculations or submit the data I get errors.

How can I change this code for example:

myTotal = format(mysubtotal + mytax,"0.00")

Another One

rs!total = format(myTotal, "0.00')
I don't want to use the comma but would rather like code to do the math using the local regional settings.
Not all values are currency other some are qty's .

Please can anyone help

Thanks


0
Comment
Question by:cwaldick
  • 2
4 Comments
 
LVL 13

Expert Comment

by:Michael_D
ID: 22615463
If you want to use format function is to change Regional Settings of the. You might want to save current settings before calling the format function and restore them back afterward

you can find a code for changing  reg.settings here: http://www.vbcode.com/Asp/showsn.asp?theID=8337

Another solution (better) would be to create your own function that format the numbers the way you need.
0
 
LVL 22

Accepted Solution

by:
danaseaman earned 2000 total points
ID: 22617145
It is not recommended changing Regional Settings on another users machine.
You can format a number using U.S. English - LCID-1033, or any other supported LCID regardless of the users configurations using the following code:

Option Explicit
 
Private Declare Function GetLocaleInfoA Lib "kernel32" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpData As Any, ByVal cchData As Long) As Long
Private Declare Function GetNumberFormatA Lib "kernel32" (ByVal Locale As Long, ByVal dwFlags As Long, ByVal lpValue As String, ByRef lpFormat As NUMBERFMT, ByVal lpNumberStr As String, ByVal cchNumber As Long) As Long
 
Private Type NUMBERFMT
        NumDigits       As Long     ' number of decimal digits
        LeadingZero     As Long     ' if leading zero in decimal fields
        Grouping        As Long     ' group size left of decimal
        lpDecimalSep    As String   ' ptr to decimal separator string
        lpThousandSep   As String   ' ptr to thousand separator string
        NegativeOrder   As Long     ' negative number ordering
End Type
 
Private Sub Form_Load()
   Debug.Print FormatNumberByLCID("123456789", 1033) 'U.S. English
   Debug.Print FormatNumberByLCID("123456789", 1043) 'Dutch
End Sub
 
Public Function FormatNumberByLCID(ByVal sNumber As String, _
   Optional ByVal LCID As Long) As String
 
   Const LOCALE_SDECIMAL As Long = &HE
   Const LOCALE_STHOUSAND As Long = &HF&
   Const LOCALE_SGROUPING As Long = &H10
   Const LOCALE_IDIGITS As Long = &H11
   Const LOCALE_ILZERO As Long = &H12
   Const LOCALE_INEGNUMBER As Long = &H1010
   
   Dim Buffer          As String * 255
   
   Dim NF   As NUMBERFMT
   
   With NF
      .NumDigits = Val(pfGLI(LCID, LOCALE_IDIGITS))
      .Grouping = Val(pfGLI(LCID, LOCALE_SGROUPING))
      .lpDecimalSep = Left$(pfGLI(LCID, LOCALE_SDECIMAL), 1)
      .lpThousandSep = Left$(pfGLI(LCID, LOCALE_STHOUSAND), 1)
      .NegativeOrder = Val(pfGLI(LCID, LOCALE_INEGNUMBER))
      .LeadingZero = Val(pfGLI(LCID, LOCALE_ILZERO))
   End With
         
   GetNumberFormatA LCID, 0, sNumber, NF, Buffer, 255
   FormatNumberByLCID = StripNull(Buffer)
 
End Function
 
Public Function pfGLI(ByVal LCID As Long, ByVal reqInfo As Long) As String
   Dim nRet             As Long
   Dim Buffer           As String
   
   nRet = GetLocaleInfoA(LCID, reqInfo, Buffer, 0&)
 
   If nRet Then
      Buffer = Space$(nRet)
      nRet = GetLocaleInfoA(LCID, reqInfo, Buffer, Len(Buffer))
      pfGLI = Left$(Buffer, nRet - 1)
   End If
 
End Function
 
Public Function StripNull(ByVal StrIn As String) As String
   Dim nul              As Long
   nul = InStr(StrIn, vbNullChar)
   Select Case nul
      Case Is > 1
         StripNull = Left$(StrIn, nul - 1)
      Case 1
         StripNull = ""
      Case 0
         StripNull = Trim$(StrIn)
   End Select
End Function

Open in new window

0
 
LVL 17

Expert Comment

by:CSecurity
ID: 22620049
first check that is there comma ,
InStr(1, IP, ",", vbTextCompare)

and then replace , with .
using replace function
regards...
0
 
LVL 13

Expert Comment

by:Michael_D
ID: 22620083
>>first check that is there comma ,
>>InStr(1, IP, ",", vbTextCompare)

>>and then replace , with .
>>using replace function
>>regards...


What if regional setting are using comma as thousand separator? Then 1000 will be represented as 1,000.00
After applying your formula you will get 1.000.00 which is not legal decimal number at all.

danaseaman's solution is the way to do it right
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The Windows Phone Theme Colours is a tight, powerful, and well balanced palette. This tiny Access application makes it a snap to select and pick a value. And it doubles as an intro to implementing WithEvents, one of Access' hidden gems.
In a use case, a user needs to close an opened report by simply pressing the Escape (Esc) key. This can be done by adding macro code in Report_KeyPress or Report_KeyDown event.
With Microsoft Access, learn how to specify relationships between tables and set various options on the relationship. Add the tables: Create the relationship: Decide if you’re going to set referential integrity: Decide if you want cascade upda…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
Suggested Courses

877 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question