大家好!现在有一个问题迟迟解决不了,希望大家帮忙。我在给西班牙的一家公司编写一套财务系统,因为这边有中国人也有西班牙人,因此要兼顾所有的客户的习惯。众所周知,在欧洲这边如果表示10.50欧元这个金额,老外的习惯是写成10,50的形式,也就是小数点位用,表示,而不是.。这样的问题是如果我的用户是西班牙人,他们的默认键盘和区域设定什么的都是西班牙语状态的,这样他们在录入或者是开发票的时候,将会打入成10,50的形式,但是这时候系统(我指的是西班牙语版的或者是英文版的XP)只要曾经安装过东亚语言的附加支持,那么此时老外的计算机上面的小键盘0数字右边的小数点就自动固定成了“.”,而不是他们习惯的“,”了,而且再也该不回来了(至少我没找到改过来的办法,控制面板什么的我都研究过了)。此时的问题就随之而来,系统会自动把老外输入的10.50识别成1050,也就是数值扩大了十倍。造成最后的结果肯定出现问题。我用的是textbox控件,即便用format函数限定数字样式也没用。
现在我想,问问大家有没有一个API可以测定这台计算机目前是使用什么国家代码,以及目前是处于什么键盘方案下,这样我就可以根据不同的设定,做一个case来修正数值了。
等候大家的帮助,谢谢!顺祝圣诞、新年快乐!!
Simon

解决方案 »

  1.   

    GetNumberFormat LOCALE_USER_DEFAULT
    GetLocaleInfo LOCALE_USER_DEFAULT
      

  2.   

    又是Unicode问题。
    西班牙语系有20种分支。但大概有5,6中表达方法。
    mvLCID=LCIDPublic Function FormatCurrency(CurVal As Double, Optional UseGrouping As Boolean = True, Optional ShowCSymbol As Boolean = True) As String
       Dim NumDigits        As Integer
       Dim LeadingZero      As Integer
       Dim Grouping         As Integer
       Dim decSep           As String
       Dim thouSep          As String
       Dim negOrder         As Integer
       Dim posOrder         As Integer
       Dim cSymb            As String
       Dim posIntVal        As Double, intStr As String
       Dim posDecVal        As Double, decStr As String
       Dim negNum           As Boolean, i As Integer
       Dim fCur             As String   NumDigits = CInt(pfGLI(LOCALE_IDIGITS))
       LeadingZero = CInt(pfGLI(gliILZERO))
       Grouping = CInt(Left(pfGLI(gliSGROUPING), 1))
       decSep = Left(pfGLI(gliSDECIMAL), 1)
       thouSep = Left(pfGLI(gliSTHOUSAND), 1)
       negOrder = CInt(pfGLI(gliINEGCURR))
       posOrder = CInt(pfGLI(gliICURRENCY))
       cSymb = pfGLI(gliSCURRENCY)   If Not ShowCSymbol Then cSymb = ""   If CurVal < 0 Then negNum = True
       posIntVal = Abs(Fix(CurVal))
       posDecVal = Abs(CurVal - Fix(CurVal)) * (10 ^ NumDigits)   intStr = Format(posIntVal, "#############################################")
       decStr = Format(posDecVal, String(NumDigits, "0"))   If UseGrouping And Grouping > 0 And Len(intStr) > Grouping Then
          ' Insert the ordinal separators in the integer part of the number
          For i = Grouping To Len(intStr) Step Grouping + 1
             intStr = Left(intStr, Len(intStr) - i) + thouSep + Right(intStr, i)
          Next
       End If   ' Final format
       If negNum Then
          Select Case negOrder
             Case 0
                fCur = "(" + cSymb + intStr + decSep + decStr + ")"
             Case 1
                fCur = "-" + cSymb + intStr + decSep + decStr
             Case 2
                fCur = cSymb + "-" + intStr + decSep + decStr
             Case 3
                fCur = cSymb + intStr + decSep + decStr + "-"
             Case 4
                fCur = "(" + intStr + decSep + decStr + cSymb + ")"
             Case 5
                fCur = "-" + intStr + decSep + decStr + cSymb
             Case 6
                fCur = intStr + decSep + decStr + "-" + cSymb
             Case 7
                fCur = intStr + decSep + decStr + cSymb + "-"
             Case 8
                fCur = "-" + intStr + decSep + decStr + " " + cSymb
             Case 9
                fCur = "-" + cSymb + " " + intStr + decSep + decStr
             Case 10
                fCur = intStr + decSep + decStr + " " + cSymb + "-"
             Case 11
                fCur = cSymb + " " + intStr + decSep + decStr + "-"
             Case 12
                fCur = cSymb + " -" + intStr + decSep + decStr
             Case 13
                fCur = intStr + decSep + decStr + "- " + cSymb
             Case 14
                fCur = "(" + cSymb + " " + intStr + decSep + decStr + ")"
             Case 15
                fCur = "(" + intStr + decSep + decStr + " " + cSymb + ")"
             Case Else
                fCur = "-" + cSymb + intStr + decSep + decStr
          End Select
       Else
          Select Case posOrder
             Case 0
                fCur = cSymb + intStr + decSep + decStr
             Case 1
                fCur = intStr + decSep + decStr + cSymb
             Case 2
                fCur = cSymb + " " + intStr + decSep + decStr
             Case 3
                fCur = intStr + decSep + decStr + " " + cSymb
             Case Else
                fCur = cSymb + intStr + decSep + decStr
          End Select
       End If   FormatCurrency = Trim(fCur)End FunctionPrivate Function pfGLI(reqInfo As GLITypes, _
       Optional ByVal bUnicode As Boolean = False) As String   Dim aStr             As String   aStr = String(255, Chr(0))
       If bUnicode Then
          GetLocaleInfoW mvLCID, reqInfo, StrPtr(aStr), 255
          pfGLI = aStr 'StrConv(aStr, vbFromUnicode)
       Else
          GetLocaleInfo mvLCID, reqInfo, aStr, 255
          aStr = Left(aStr, InStr(1, aStr, Chr(0)) - 1)
          pfGLI = aStr
       End IfEnd Function' This just makes my life a little easier
    Private Enum GLITypes
       gliICALENDARTYPE = &H1009
       gliIOPTIONALCALENDAR = &H100B
       gliICENTURY = &H24
       gliICOUNTRY = &H5
       gliICURRDIGITS = &H19
       gliICURRENCY = &H1B
       gliIDATE = &H21
       gliIDAYLZERO = &H26
       gliIDEFAULTCODEPAGE = &HB
       gliIDEFAULTCOUNTRY = &HA
       gliIDEFAULTLANGUAGE = &H9
       gliIDIGITS = &H11
       gliIINTLCURRDIGITS = &H1A
       gliILANGUAGE = &H1
       gliILDATE = &H22
       gliILZERO = &H12
       gliIMEASURE = &HD
       gliIMONLZERO = &H27
       gliINEGCURR = &H1C
       gliINEGSEPBYSPACE = &H57
       gliINEGSIGNPOSN = &H53
       gliINEGSYMPRECEDES = &H56
       gliIPOSSEPBYSPACE = &H55
       gliIPOSSIGNPOSN = &H52
       gliIPOSSYMPRECEDES = &H54
       gliITIME = &H23
       gliITLZERO = &H25
       gliNOUSEROVERRIDE = &H80000000
       gliS1159 = &H28
       gliS2359 = &H29
       gliSABBREVCTRYNAME = &H7
       gliSABBREVDAYNAME1 = &H31
       gliSABBREVDAYNAME2 = &H32
       gliSABBREVDAYNAME3 = &H33
       gliSABBREVDAYNAME4 = &H34
       gliSABBREVDAYNAME5 = &H35
       gliSABBREVDAYNAME6 = &H36
       gliSABBREVDAYNAME7 = &H37
       gliSABBREVLANGNAME = &H3
       gliSABBREVMONTHNAME1 = &H44
       gliSABBREVMONTHNAME10 = &H4D
       gliSABBREVMONTHNAME11 = &H4E
       gliSABBREVMONTHNAME12 = &H4F
       gliSABBREVMONTHNAME13 = &H100F
       gliSABBREVMONTHNAME2 = &H45
       gliSABBREVMONTHNAME3 = &H46
       gliSABBREVMONTHNAME4 = &H47
       gliSABBREVMONTHNAME5 = &H48
       gliSABBREVMONTHNAME6 = &H49
       gliSABBREVMONTHNAME7 = &H4A
       gliSABBREVMONTHNAME8 = &H4B
       gliSABBREVMONTHNAME9 = &H4C
       gliSCOUNTRY = &H6
       gliSCURRENCY = &H14
       gliSDATE = &H1D
       gliSDAYNAME1 = &H2A
       gliSDAYNAME2 = &H2B
       gliSDAYNAME3 = &H2C
       gliSDAYNAME4 = &H2D
       gliSDAYNAME5 = &H2E
       gliSDAYNAME6 = &H2F
       gliSDAYNAME7 = &H30
       gliSDECIMAL = &HE
       gliSENGCOUNTRY = &H1002
       gliSENGLANGUAGE = &H1001
       gliSGROUPING = &H10
       gliSINTLSYMBOL = &H15
       gliSLANGUAGE = &H2
       gliSLIST = &HC
       gliSLONGDATE = &H20
       gliSMONDECIMALSEP = &H16
       gliSMONGROUPING = &H18
       gliSMONTHNAME1 = &H38
       gliSMONTHNAME10 = &H41
       gliSMONTHNAME11 = &H42
       gliSMONTHNAME12 = &H43
       gliSMONTHNAME2 = &H39
       gliSMONTHNAME3 = &H3A
       gliSMONTHNAME4 = &H3B
       gliSMONTHNAME5 = &H3C
       gliSMONTHNAME6 = &H3D
       gliSMONTHNAME7 = &H3E
       gliSMONTHNAME8 = &H3F
       gliSMONTHNAME9 = &H40
       gliSMONTHOUSANDSEP = &H17
       gliSNATIVECTRYNAME = &H8
       gliSNATIVEDIGITS = &H13
       gliSNATIVELANGNAME = &H4
       gliSNEGATIVESIGN = &H51
       gliSPOSITIVESIGN = &H50
       gliSSHORTDATE = &H1F
       gliSTHOUSAND = &HF
       gliSTIME = &H1E
       gliSTIMEFORMAT = &H1003
    End Enum...