Unicode(货币问题)
又是Unicode问题。
西班牙语系有20种分支。但大概有5,6中表达方法。
mvLCID=LCID
Public 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 Function
Private 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 If
End 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
西班牙语系有20种分支。但大概有5,6中表达方法。
mvLCID=LCID
Public 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 Function
Private 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 If
End 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
成功者找方法,失败者找借口!