Advertisement
IvanChergarov

ValueToText("BG" currency)

Feb 25th, 2020
803
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Public Function ToWords(ByVal dblValue As Double, Optional Measure As Variant, Optional Gender As Variant, Optional NumScale As Variant) As String
  2.     Dim vDigits         As Variant
  3.     Dim vGenderDigits   As Variant
  4.     Dim vValue          As Variant
  5.     Dim lIdx            As Long
  6.     Dim lDigit          As Long
  7.     Dim sResult         As String
  8.    
  9.     '--- fix optional params default values
  10.    If IsMissing(Gender) Then
  11.         Gender = vbNullString
  12.     End If
  13.     If IsMissing(NumScale) Then
  14.         NumScale = 2
  15.     End If
  16.     '--- init digits (incl. gender ones)
  17.    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))
  18.     vGenderDigits = Split(Join(vDigits))
  19.     Select Case Left$(Gender, 1)
  20.     Case vbNullString, ChrW(&H4D), ""
  21.         vGenderDigits(1) = ChrW(&H435) & ChrW(&H434) & ChrW(&H438) & ChrW(&H43D)
  22.         vGenderDigits(2) = ChrW(&H434) & ChrW(&H432) & ChrW(&H430)
  23.     Case ChrW(&H46)
  24.         vGenderDigits(1) = ChrW(&H435) & ChrW(&H434) & ChrW(&H43D) & ChrW(&H430)
  25.     End Select
  26.     '--- split input value on decimal point and pad w/ zeroes
  27.    vValue = Mid$(Format$(0, ChrW(&H30) & ChrW(&H2E) & ChrW(&H30)), 2, 1)
  28.     vValue = Split(Format$(Abs(dblValue), ChrW(&H30) & ChrW(&H2E) & String(NumScale, ChrW(&H30))), vValue)
  29.     vValue(0) = Right$(String$(18, ChrW(&H30)) & vValue(0), 18)
  30.     '--- loop input digits from right to left
  31.    For lIdx = 1 To Len(vValue(0))
  32.         If lIdx <= 3 Then
  33.             lDigit = Mid$(vValue(0), Len(vValue(0)) - lIdx + 1, 1)
  34.         Else
  35.             lDigit = Mid$(vValue(0), Len(vValue(0)) - lIdx - 1, 3)
  36.             lIdx = lIdx + 2
  37.         End If
  38.         If lDigit <> 0 Then
  39.             '--- separate by space (first time prepend ChrW(&H438) too)
  40.            If LenB(sResult) <> 0 And (lIdx <> 2 Or lDigit <> 1) Then
  41.                 If InStr(sResult, ChrW(&H20) & ChrW(&H438) & ChrW(&H20)) = 0 Then
  42.                     sResult = ChrW(&H20) & ChrW(&H438) & ChrW(&H20) & sResult
  43.                 Else
  44.                     sResult = ChrW(&H20) & sResult
  45.                 End If
  46.             End If
  47.             Select Case lIdx
  48.             Case 1
  49.                 sResult = vGenderDigits(lDigit) & sResult
  50.             Case 2
  51.                 If lDigit = 1 Then
  52.                     '--- 11 to 19 special wordforms
  53.                    If LenB(sResult) <> 0 Then
  54.                         sResult = Replace(LTrim$(sResult), vGenderDigits(1), ChrW(&H435) & ChrW(&H434) & ChrW(&H438))
  55.                         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)
  56.                     Else
  57.                         sResult = ChrW(&H434) & ChrW(&H435) & ChrW(&H441) & ChrW(&H435) & ChrW(&H442)
  58.                     End If
  59.                 Else
  60.                     sResult = IIf(lDigit = 2, ChrW(&H434) & ChrW(&H432) & ChrW(&H430), vDigits(lDigit)) & ChrW(&H434) & ChrW(&H435) & ChrW(&H441) & ChrW(&H435) & ChrW(&H442) & sResult
  61.                 End If
  62.             Case 3
  63.                 '--- hundreds have special suffixes for 2 and 3
  64.                Select Case lDigit
  65.                 Case 1
  66.                     sResult = ChrW(&H441) & ChrW(&H442) & ChrW(&H43E) & sResult
  67.                 Case 2, 3
  68.                     sResult = vDigits(lDigit) & ChrW(&H441) & ChrW(&H442) & ChrW(&H430) & sResult
  69.                 Case Else
  70.                     sResult = vDigits(lDigit) & ChrW(&H441) & ChrW(&H442) & ChrW(&H43E) & ChrW(&H442) & ChrW(&H438) & ChrW(&H43D) & sResult
  71.                 End Select
  72.             Case 6
  73.                 '--- thousands are in feminine gender
  74.                Select Case lDigit
  75.                 Case 1
  76.                     sResult = ChrW(&H445) & ChrW(&H438) & ChrW(&H43B) & ChrW(&H44F) & ChrW(&H434) & ChrW(&H430) & sResult
  77.                 Case Else
  78.                     sResult = ToWords(lDigit, vbNullString, Gender:=ChrW(&H46)) & ChrW(&H20) & ChrW(&H445) & ChrW(&H438) & ChrW(&H43B) & ChrW(&H44F) & ChrW(&H434) & ChrW(&H438) & sResult
  79.                 End Select
  80.             Case 9, 12, 15
  81.                 '--- no special cases for bigger values
  82.                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) _
  83.                     & IIf(lDigit <> 1, ChrW(&H430), vbNullString) & sResult
  84.             End Select
  85.         End If
  86.     Next
  87.     '--- handle zero and negative values
  88.    If LenB(sResult) = 0 Then
  89.         sResult = vDigits(0)
  90.     End If
  91.     If dblValue < 0 Then
  92.         sResult = ChrW(&H43C) & ChrW(&H438) & ChrW(&H43D) & ChrW(&H443) & ChrW(&H441) & ChrW(&H20) & sResult
  93.     End If
  94.     '--- apply measure (use Measure:=vbNullString for none)
  95.    If IsMissing(Measure) Then
  96.         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)
  97.         Gender = ChrW(&H4D) & ChrW(&H46)
  98.     End If
  99.     If LenB(Measure) <> 0 Then
  100.         If Right$(sResult, Len(vDigits(0))) = vDigits(0) And Val(vValue(1)) <> 0 And InStr(Measure, ChrW(&H7C)) > 0 Then
  101.             sResult = ToWords(IIf(dblValue < 0, -1, 1) * Val(vValue(1)), Split(Measure, ChrW(&H7C))(1), Mid$(Gender, 2))
  102.         Else
  103.             sResult = sResult & ChrW(&H20) & Split(Measure, ChrW(&H7C))(0)
  104.             If Val(vValue(1)) <> 0 Or InStr(Measure, ChrW(&H7C)) > 0 Then
  105.                 sResult = sResult & ChrW(&H20) & ChrW(&H438) & ChrW(&H20) & vValue(1)
  106.             End If
  107.             If InStr(Measure, ChrW(&H7C)) > 0 Then
  108.                 sResult = sResult & ChrW(&H20) & Split(Measure, ChrW(&H7C))(1)
  109.             End If
  110.             sResult = UCase$(Left$(sResult, 1)) & Mid$(sResult, 2)
  111.         End If
  112.     End If
  113.     ToWords = sResult
  114. End Function
  115.  
  116. Public Function ToAllWords(ByVal dblValue As Double) As String
  117.     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)))
  118. End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement