kaldata.com - Форуми: Преобразуване от "цифром" в "словом" - kaldata.com - Форуми

Към съдържанието



Страници 1 от 1
  • Нямате права да създавате теми
  • Нямате права да пишете в темата

Преобразуване от "цифром" в "словом" Оцени темата: ***** 1 Гласа

#1 Потребителят е офлайн   cecov 

  • kaldata маниак
  • PipPipPipPipPipPip
  • Група: Потребители
  • Мнения: 1827
  • Регистрация: 15 сеп 2005
  • Пол:Мъжки
  • Град:Габрово

Публикувано 04 май 2006 - 14:00

Колега от форума ме помоли за код, преобразуващ числова стойност на валута в текст.
Тъй като може да бъде от полза и за някой друг, реших да го публикувам тук.
Кода е на VBA и в момента се използва в MS Access, но може да се използва и в другите приложения на MS Office.
За да преобразувате число в текст, на функцията Num2TXT се подава, като параметър числото, а тя връща текста. Например, ако имате две текстови полета върху формата и искате в полето Text2 да получите текстовото представяне на числото, въведено в полето Text0 (формат Currency) то трябва да напишете :

Text2.Value = Num2Txt(Text0.Value)

в кода за събитие на даден бутон, или в ControlSource на второто поле да зададете

= Num2Txt(Text0.Value)

За десетичен разделител се използва запетая (,), но ако желаете можете да го промените.

Option Compare Database
Option Explicit
Dim warray(9) As String
Dim edin, edna, dwa, dwe, sto, dwesta, trista, stotin, deset, mil, mila, hil, hili, lw, st, i, jn, na
Dim C1

Sub Init()
	warray(1) = "ед"
	warray(2) = "дв"
	warray(3) = "три"
	warray(4) = "четири"
	warray(5) = "пет"
	warray(6) = "шест"
	warray(7) = "седем"
	warray(8) = "осем"
	warray(9) = "девет"

	jn = "ин"
	na = "на"
	sto = "сто"
	dwesta = "двеста"
	trista = "триста"
	stotin = "стотин"
	deset = "десет"
	mil = "милион"
	mila = " милиона"
	hil = "хиляда"
	hili = " хиляди"
	lw = " лв"
	st = " ст"
	i = " и "
End Sub

Function Conv(sstr As String) As String
Dim rstr, astrc, bstrc, cstrc
Dim apos, bpos, cpos

   If Len(sstr) = 3 Then
	 apos = Asc(Mid(sstr, 3, 1)) - Asc("0")
	 bpos = Asc(Mid(sstr, 2, 1)) - Asc("0")
	 cpos = Asc(Mid(sstr, 1, 1)) - Asc("0")
   Else
	 apos = Asc(Mid(sstr, 2, 1)) - Asc("0")
	 bpos = Asc(Mid(sstr, 1, 1)) - Asc("0")
	 cpos = 0
   End If

   If apos = 1 Then
	 If Len(sstr) = 3 Then
		 If C1 = 1 Then
		   astrc = warray(1) + na
		 Else
		   astrc = warray(1) + jn
		 End If
	 Else
	   astrc = warray(1) + na
	 End If
   Else
	 If apos = 2 Then
	   If Len(sstr) = 3 Then
		 If (C1 = 1) And (bpos <> 1) Then
		   astrc = warray(2) + "е"
		 Else
		   astrc = warray(2) + "а"
		 End If
	   Else
		 astrc = warray(2) + "e"
	   End If
	 Else
	   If (apos >= 3) And (apos <= 9) Then astrc = warray(apos)
	 End If
   End If
   
   If bpos = 1 Then
	  If apos = 1 Then
		 bstrc = astrc + "а" + deset
		 astrc = ""
	  Else
		 If apos = 0 Then
			bstrc = deset
			astrc = ""
		 Else
			If (apos >= 2) And (apos <= 9) Then bstrc = astrc + na + deset
			astrc = ""
		 End If
	  End If
   Else
	  If bpos = 2 Then
		bstrc = warray(bpos) + "а" + deset
	  Else
		If (bpos >= 3) And (bpos <= 9) Then bstrc = warray(bpos) + deset
	  End If
   End If
	
  Select Case cpos
	  Case 1
		cstrc = sto
	  Case 2
		cstrc = dwesta
	  Case 3
		cstrc = trista
   Case Else
	  If (cpos >= 4) And (cpos <= 9) Then cstrc = warray(cpos) + stotin
   End Select
 
   rstr = astrc
   If Len(cstrc) > 0 Then
	  If Len(astrc) > 0 Then
		 If Len(bstrc) > 0 Then
			rstr = cstrc + " " + bstrc + i + rstr
		 Else
			rstr = cstrc + i + rstr
		 End If
	  Else
		 If Len(bstrc) > 0 Then
			rstr = cstrc + i + bstrc
		 Else
			rstr = cstrc
		 End If
	  End If
   Else
	  If Len(bstrc) > 0 Then
		 If Len(astrc) > 0 Then
			rstr = bstrc + i + rstr
		 Else
			rstr = bstrc
		 End If
	  End If
   End If

   Conv = rstr
   
End Function

Function Num2Txt(instring As String) As String
Dim LastDelimiter As String, wstr As String, fstr As String, ostring As String, cstrc As String, tstr As String

Init

wstr = instring
LastDelimiter = InStr(1, wstr, ",")

If LastDelimiter > 0 Then
  fstr = Mid(wstr, LastDelimiter + 1, 2)
  wstr = Mid(wstr, 1, LastDelimiter - 1)
End If

If Len(fstr) < 2 Then
  fstr = fstr + Mid("00", 1, 2 - Len(fstr))
End If

ostring = ""
C1 = 0
Do While wstr <> ""

  If Len(wstr) < 3 Then
	wstr = Mid("000", 1, 3 - Len(wstr)) + wstr
  End If
  tstr = Mid(wstr, Len(wstr) - 2, 3)
  cstrc = Conv(tstr)

  Select Case C1
  Case 1
	 If (tstr = "001") Then
	   cstrc = hil
	 ElseIf cstrc <> "" Then
		cstrc = cstrc + hili
	 End If
  Case 2
	 If (tstr = "001") Then
	   cstrc = warray(1) + jn + " " + mil
	 ElseIf cstrc <> "" Then
	   cstrc = cstrc + mila
	 End If
  End Select
  
  If Len(wstr) >= 3 Then
	wstr = Mid(wstr, 1, Len(wstr) - 3)
  Else
	wstr = ""
  End If
  
  If cstrc <> "" Then
	  If (C1 = 0) Then
		If (wstr <> "") And (InStr(1, cstrc, i) = 0) Then
		  ostring = i + cstrc
		Else
		  ostring = cstrc
		End If
	  Else
		ostring = cstrc + " " + ostring
	  End If
  End If

  C1 = C1 + 1
  
Loop

  If Len(fstr) > 0 Then
'	cstrc = Conv(fstr)
	If ostring <> "" Then
	  Num2Txt = ostring + lw + "," + fstr + st
	Else
	  Num2Txt = fstr + st
	End If
  Else
	Num2Txt = ostring + lw
  End If

End Function


Коригирани са някои грешки.
Съществуват 10 вида хора. Такива, които знаят какво е двоично число, и такива които не знаят.
0

#2 Потребителят е офлайн   bti 

  • Новобранец
  • Pip
  • Група: Потребители
  • Мнения: 1
  • Регистрация: 19 дек 2007

Иконки  Публикувано 19 декември 2007 - 20:31

Супер.Пробвах работи отлично.
А дали може да се намери и преобразуване на английски / немскитекст
0

#3 Потребителят е офлайн   maxim4o 

  • Пингвин
  • PipPipPipPipPipPip
  • Група: Потребители
  • Мнения: 1140
  • Регистрация: 12 юли 2005
  • Пол:Мъжки
  • Град:Перник
  • Интереси:разнообразни

Публикувано 24 декември 2007 - 11:26

Ако имаш време сложи коментари, че ми стана интересен кода ама така не го разбирам Публикувано изображение
It is a tale of trysts and game of graciousness. It is a stronghold of sanity and a marvel of madness. It is a congregation of civility in a bastion of barbarity. It is a derailment of discussion in an arrangement of anarchy. It is an enigma of energy led by a legion of lethargy. It is an influx of idiocy and a gathering of genius. It is a freak of flaws and the paragon of perfection. It is the Internet, and I love it.

-- source: I forgot it :) but it isn't me
0

Сподели темата:


Страници 1 от 1
  • Нямате права да създавате теми
  • Нямате права да пишете в темата

1 Потребител(и) четат тази тема
0 потребители, 1 гости, 0 анонимни