Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Public Function ToWords(ByVal dblValue As Double, Optional Measure As Variant, Optional Gender As Variant, Optional NumScale As Variant) As String
- Dim vDigits As Variant
- Dim vGenderDigits As Variant
- Dim vValue As Variant
- Dim lIdx As Long
- Dim lDigit As Long
- Dim sResult As String
- '--- fix optional params default values
- If IsMissing(Gender) Then
- Gender = vbNullString
- End If
- If IsMissing(NumScale) Then
- NumScale = 2
- End If
- '--- init digits (incl. gender ones)
- vDigits = Split(ChrW(&H43D) & ChrW(&H443) & ChrW(&H43B) & ChrW(&H430) & ChrW(&H20) & ChrW(&H435) & ChrW(&H434) & ChrW(&H43D) & ChrW(&H43E) & ChrW(&H20) & ChrW(&H434) & ChrW(&H432) & ChrW(&H435) & ChrW(&H20) & ChrW(&H442) & ChrW(&H440) & ChrW(&H438) & ChrW(&H20) & ChrW(&H447) & ChrW(&H435) & ChrW(&H442) & ChrW(&H438) & ChrW(&H440) & ChrW(&H438) & ChrW(&H20) & ChrW(&H43F) & ChrW(&H435) & ChrW(&H442) & ChrW(&H20) & ChrW(&H448) & ChrW(&H435) & ChrW(&H441) & ChrW(&H442) & ChrW(&H20) & ChrW(&H441) & ChrW(&H435) & ChrW(&H434) & ChrW(&H435) & ChrW(&H43C) & ChrW(&H20) & ChrW(&H43E) & ChrW(&H441) & ChrW(&H435) & ChrW(&H43C) & ChrW(&H20) & ChrW(&H434) & ChrW(&H435) & ChrW(&H432) & ChrW(&H435) & ChrW(&H442))
- vGenderDigits = Split(Join(vDigits))
- Select Case Left$(Gender, 1)
- Case vbNullString, ChrW(&H4D), ""
- vGenderDigits(1) = ChrW(&H435) & ChrW(&H434) & ChrW(&H438) & ChrW(&H43D)
- vGenderDigits(2) = ChrW(&H434) & ChrW(&H432) & ChrW(&H430)
- Case ChrW(&H46)
- vGenderDigits(1) = ChrW(&H435) & ChrW(&H434) & ChrW(&H43D) & ChrW(&H430)
- End Select
- '--- split input value on decimal point and pad w/ zeroes
- vValue = Mid$(Format$(0, ChrW(&H30) & ChrW(&H2E) & ChrW(&H30)), 2, 1)
- vValue = Split(Format$(Abs(dblValue), ChrW(&H30) & ChrW(&H2E) & String(NumScale, ChrW(&H30))), vValue)
- vValue(0) = Right$(String$(18, ChrW(&H30)) & vValue(0), 18)
- '--- loop input digits from right to left
- For lIdx = 1 To Len(vValue(0))
- If lIdx <= 3 Then
- lDigit = Mid$(vValue(0), Len(vValue(0)) - lIdx + 1, 1)
- Else
- lDigit = Mid$(vValue(0), Len(vValue(0)) - lIdx - 1, 3)
- lIdx = lIdx + 2
- End If
- If lDigit <> 0 Then
- '--- separate by space (first time prepend ChrW(&H438) too)
- If LenB(sResult) <> 0 And (lIdx <> 2 Or lDigit <> 1) Then
- If InStr(sResult, ChrW(&H20) & ChrW(&H438) & ChrW(&H20)) = 0 Then
- sResult = ChrW(&H20) & ChrW(&H438) & ChrW(&H20) & sResult
- Else
- sResult = ChrW(&H20) & sResult
- End If
- End If
- Select Case lIdx
- Case 1
- sResult = vGenderDigits(lDigit) & sResult
- Case 2
- If lDigit = 1 Then
- '--- 11 to 19 special wordforms
- If LenB(sResult) <> 0 Then
- sResult = Replace(LTrim$(sResult), vGenderDigits(1), ChrW(&H435) & ChrW(&H434) & ChrW(&H438))
- sResult = Replace(sResult, vGenderDigits(2), ChrW(&H434) & ChrW(&H432) & ChrW(&H430)) & ChrW(&H43D) & ChrW(&H430) & ChrW(&H434) & ChrW(&H435) & ChrW(&H441) & ChrW(&H435) & ChrW(&H442)
- Else
- sResult = ChrW(&H434) & ChrW(&H435) & ChrW(&H441) & ChrW(&H435) & ChrW(&H442)
- End If
- Else
- sResult = IIf(lDigit = 2, ChrW(&H434) & ChrW(&H432) & ChrW(&H430), vDigits(lDigit)) & ChrW(&H434) & ChrW(&H435) & ChrW(&H441) & ChrW(&H435) & ChrW(&H442) & sResult
- End If
- Case 3
- '--- hundreds have special suffixes for 2 and 3
- Select Case lDigit
- Case 1
- sResult = ChrW(&H441) & ChrW(&H442) & ChrW(&H43E) & sResult
- Case 2, 3
- sResult = vDigits(lDigit) & ChrW(&H441) & ChrW(&H442) & ChrW(&H430) & sResult
- Case Else
- sResult = vDigits(lDigit) & ChrW(&H441) & ChrW(&H442) & ChrW(&H43E) & ChrW(&H442) & ChrW(&H438) & ChrW(&H43D) & sResult
- End Select
- Case 6
- '--- thousands are in feminine gender
- Select Case lDigit
- Case 1
- sResult = ChrW(&H445) & ChrW(&H438) & ChrW(&H43B) & ChrW(&H44F) & ChrW(&H434) & ChrW(&H430) & sResult
- Case Else
- sResult = ToWords(lDigit, vbNullString, Gender:=ChrW(&H46)) & ChrW(&H20) & ChrW(&H445) & ChrW(&H438) & ChrW(&H43B) & ChrW(&H44F) & ChrW(&H434) & ChrW(&H438) & sResult
- End Select
- Case 9, 12, 15
- '--- no special cases for bigger values
- sResult = ToWords(lDigit, vbNullString) & ChrW(&H20) & Split(ChrW(&H43C) & ChrW(&H438) & ChrW(&H43B) & ChrW(&H438) & ChrW(&H43E) & ChrW(&H43D) & ChrW(&H20) & ChrW(&H43C) & ChrW(&H438) & ChrW(&H43B) & ChrW(&H438) & ChrW(&H430) & ChrW(&H440) & ChrW(&H434) & ChrW(&H20) & ChrW(&H442) & ChrW(&H440) & ChrW(&H438) & ChrW(&H43B) & ChrW(&H438) & ChrW(&H43E) & ChrW(&H43D) & ChrW(&H20) & ChrW(&H43A) & ChrW(&H432) & ChrW(&H430) & ChrW(&H434) & ChrW(&H440) & ChrW(&H438) & ChrW(&H43B) & ChrW(&H438) & ChrW(&H43E) & ChrW(&H43D))((lIdx - 9) \ 3) _
- & IIf(lDigit <> 1, ChrW(&H430), vbNullString) & sResult
- End Select
- End If
- Next
- '--- handle zero and negative values
- If LenB(sResult) = 0 Then
- sResult = vDigits(0)
- End If
- If dblValue < 0 Then
- sResult = ChrW(&H43C) & ChrW(&H438) & ChrW(&H43D) & ChrW(&H443) & ChrW(&H441) & ChrW(&H20) & sResult
- End If
- '--- apply measure (use Measure:=vbNullString for none)
- If IsMissing(Measure) Then
- Measure = IIf(Val(vValue(0)) = 1, ChrW(&H43B) & ChrW(&H435) & ChrW(&H432), ChrW(&H43B) & ChrW(&H432) & ChrW(&H2E)) & ChrW(&H7C) & ChrW(&H441) & ChrW(&H442) & ChrW(&H2E)
- Gender = ChrW(&H4D) & ChrW(&H46)
- End If
- If LenB(Measure) <> 0 Then
- If Right$(sResult, Len(vDigits(0))) = vDigits(0) And Val(vValue(1)) <> 0 And InStr(Measure, ChrW(&H7C)) > 0 Then
- sResult = ToWords(IIf(dblValue < 0, -1, 1) * Val(vValue(1)), Split(Measure, ChrW(&H7C))(1), Mid$(Gender, 2))
- Else
- sResult = sResult & ChrW(&H20) & Split(Measure, ChrW(&H7C))(0)
- If Val(vValue(1)) <> 0 Or InStr(Measure, ChrW(&H7C)) > 0 Then
- sResult = sResult & ChrW(&H20) & ChrW(&H438) & ChrW(&H20) & vValue(1)
- End If
- If InStr(Measure, ChrW(&H7C)) > 0 Then
- sResult = sResult & ChrW(&H20) & Split(Measure, ChrW(&H7C))(1)
- End If
- sResult = UCase$(Left$(sResult, 1)) & Mid$(sResult, 2)
- End If
- End If
- ToWords = sResult
- End Function
- Public Function ToAllWords(ByVal dblValue As Double) As String
- ToAllWords = ToWords(Int(dblValue), ChrW(&H43B) & ChrW(&H432) & ChrW(&H2E)) & ChrW(&H20) & ChrW(&H438) & ChrW(&H20) & LCase$(ToWords(Round((dblValue - Int(dblValue)) * 100), ChrW(&H441) & ChrW(&H442) & ChrW(&H2E), ChrW(&H46)))
- End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement