|
Îåêßíçóå áðü ôï ìÝëïò Chris. Τελευταία δημοσίευση από το μέλος YourFriend στις 19-08-2013, 20:26. Υπάρχουν 16 απαντήσεις.
-
11-05-2005, 16:26
|
-
12-05-2005, 15:55
|
|
Public Function GetMoneyVerbage(ByVal Amount As Decimal) As String 'Developed by [email protected] Try Dim PrefixPart As String = String.Empty Dim CentsPart As String = String.Empty Dim CurrencyPart As String = String.Empty Dim SmallPart As String = String.Empty Dim ThousandsPart As String = String.Empty Dim MillionsPart As String = String.Empty Dim BillionsPart As String = String.Empty Dim Cents As Integer Dim Small As Integer Dim Thousands As Integer Dim Millions As Integer Dim Billions As Integer Dim SmallH As Integer Dim ThousandsH As Integer Dim MillionsH As Integer Dim BillionsH As Integer Dim SmallN As Integer Dim ThousandsN As Integer Dim MillionsN As Integer Dim BillionsN As Integer Dim TN(100) As String Dim TF(100) As String Dim HN(10) As String Dim HF(10) As String HN(0) = "" HN(1) = "εκατόν" HN(2) = "διακόσια" HN(3) = "τριακόσια" HN(4) = "τετρακόσια" HN(5) = "πεντακόσια" HN(6) = "εξακόσια" HN(7) = "επτακόσια" HN(8) = "οκτακόσια" HN(9) = "εννιακόσια" HF(0) = "" HF(1) = "εκατόν" HF(2) = "διακόσιες" HF(3) = "τριακόσιες" HF(4) = "τετρακόσιες" HF(5) = "πεντακόσιες" HF(6) = "εξακόσιες" HF(7) = "επτακόσιες" HF(8) = "οκτακόσιες" HF(9) = "εννιακόσιες" TN(0) = "" TN(1) = "ένα" TN(2) = "δύο" TN(3) = "τρία" TN(4) = "τέσσερα" TN(5) = "πέντε" TN(6) = "έξι" TN(7) = "επτά" TN(8) = "οκτώ" TN(9) = "εννέα" TN(10) = "δέκα" TN(11) = "έντεκα" TN(12) = "δώδεκα" TN(13) = "δεκατρία" TN(14) = "δεκατέσσερα" TN(15) = "δεκαπέντε" TN(16) = "δεκαέξι" TN(17) = "δεκαεπτά" TN(18) = "δεκαοκτώ" TN(19) = "δεκαεννέα" TN(20) = "είκοσι" TN(21) = "εικοσιένα" TN(22) = "εικοσιδύο" TN(23) = "εικοσιτρία" TN(24) = "εικοσιτέσσερα" TN(25) = "εικοσιπέντε" TN(26) = "εικοσιέξι" TN(27) = "εικοσιεπτά" TN(28) = "εικοσιοκτώ" TN(29) = "εικοσιεννέα" TN(30) = "τριάντα" TN(31) = "τριανταένα" TN(32) = "τριανταδύο" TN(33) = "τριαντατρία" TN(34) = "τριαντατέσσερα" TN(35) = "τριανταπέντε" TN(36) = "τριανταέξι" TN(37) = "τριανταεπτά" TN(38) = "τριανταοκτώ" TN(39) = "τριανταεννέα" TN(40) = "σαράντα" TN(41) = "σαρανταένα" TN(42) = "σαρανταδύο" TN(43) = "σαραντατρία" TN(44) = "σαραντατέσσερα" TN(45) = "σαρανταπέντε" TN(46) = "σαρανταέξι" TN(47) = "σαρανταεπτά" TN(48) = "σαρανταοκτώ" TN(49) = "σαρανταεννέα" TN(50) = "πενήντα" TN(51) = "πενηνταένα" TN(52) = "πενηνταδύο" TN(53) = "πενηντατρία" TN(54) = "πενηντατέσσερα" TN(55) = "πενηνταπέντε" TN(56) = "πενηνταέξι" TN(57) = "πενηνταεπτά" TN(58) = "πενηνταοκτώ" TN(59) = "πενηνταεννέα" TN(60) = "εξήντα" TN(61) = "εξηνταένα" TN(62) = "εξηνταδύο" TN(63) = "εξηντατρία" TN(64) = "εξηντατέσσερα" TN(65) = "εξηνταπέντε" TN(66) = "εξηνταέξι" TN(67) = "εξηνταεπτά" TN(68) = "εξηνταοκτώ" TN(69) = "εξηνταεννέα" TN(70) = "εβδομήντα" TN(71) = "εβδομηνταένα" TN(72) = "εβδομηνταδύο" TN(73) = "εβδομηντατρία" TN(74) = "εβδομηντατέσσερα" TN(75) = "εβδομηνταπέντε" TN(76) = "εβδομηνταέξι" TN(77) = "εβδομηνταεπτά" TN(78) = "εβδομηνταοκτώ" TN(79) = "εβδομηνταεννέα" TN(80) = "ογδόντα" TN(81) = "ογδονταένα" TN(82) = "ογδονταδύο" TN(83) = "ογδοντατρία" TN(84) = "ογδοντατέσσερα" TN(85) = "ογδονταπέντε" TN(86) = "ογδονταέξι" TN(87) = "ογδονταεπτά" TN(88) = "ογδονταοκτώ" TN(89) = "ογδονταεννέα" TN(90) = "εννενήντα" TN(91) = "ενεννηνταένα" TN(92) = "ενεννηνταδύο" TN(93) = "ενεννηντατρία" TN(94) = "ενεννηντατέσσερα" TN(95) = "ενεννηνταπέντε" TN(96) = "ενεννηνταέξι" TN(97) = "ενεννηνταεπτά" TN(98) = "ενεννηνταοκτώ" TN(99) = "ενεννηνταεννέα" TF(0) = "" TF(1) = "μία" TF(2) = "δύο" TF(3) = "τρείς" TF(4) = "τέσσερις" TF(5) = "πέντε" TF(6) = "έξι" TF(7) = "επτά" TF(8) = "οκτώ" TF(9) = "εννέα" TF(10) = "δέκα" TF(11) = "έντεκα" TF(12) = "δώδεκα" TF(13) = "δεκατρείς" TF(14) = "δεκατέσσερις" TF(15) = "δεκαπέντε" TF(16) = "δεκαέξι" TF(17) = "δεκαεπτά" TF(18) = "δεκαοκτώ" TF(19) = "δεκαεννέα" TF(20) = "είκοσι" TF(21) = "εικοσιμία" TF(22) = "εικοσιδύο" TF(23) = "εικοσιτρείς" TF(24) = "εικοσιτέσσερις" TF(25) = "εικοσιπέντε" TF(26) = "εικοσιέξι" TF(27) = "εικοσιεπτά" TF(28) = "εικοσιοκτώ" TF(29) = "εικοσιεννέα" TF(30) = "τριάντα" TF(31) = "τριανταμία" TF(32) = "τριανταδύο" TF(33) = "τριαντατρείς" TF(34) = "τριαντατέσσερις" TF(35) = "τριανταπέντε" TF(36) = "τριανταέξι" TF(37) = "τριανταεπτά" TF(38) = "τριανταοκτώ" TF(39) = "τριανταεννέα" TF(40) = "σαράντα" TF(41) = "σαρανταμία" TF(42) = "σαρανταδύο" TF(43) = "σαραντατρείς" TF(44) = "σαραντατέσσερις" TF(45) = "σαρανταπέντε" TF(46) = "σαρανταέξι" TF(47) = "σαρανταεπτά" TF(48) = "σαρανταοκτώ" TF(49) = "σαρανταεννέα" TF(50) = "πενήντα" TF(51) = "πενηνταμία" TF(52) = "πενηνταδύο" TF(53) = "πενηντατρείς" TF(54) = "πενηντατέσσερις" TF(55) = "πενηνταπέντε" TF(56) = "πενηνταέξι" TF(57) = "πενηνταεπτά" TF(58) = "πενηνταοκτώ" TF(59) = "πενηνταεννέα" TF(60) = "εξήντα" TF(61) = "εξηνταμία" TF(62) = "εξηνταδύο" TF(63) = "εξηντατρείς" TF(64) = "εξηντατέσσερις" TF(65) = "εξηνταπέντε" TF(66) = "εξηνταέξι" TF(67) = "εξηνταεπτά" TF(68) = "εξηνταοκτώ" TF(69) = "εξηνταεννέα" TF(70) = "εβδομήντα" TF(71) = "εβδομηνταμία" TF(72) = "εβδομηνταδύο" TF(73) = "εβδομηντατρείς" TF(74) = "εβδομηντατέσσερις" TF(75) = "εβδομηνταπέντε" TF(76) = "εβδομηνταέξι" TF(77) = "εβδομηνταεπτά" TF(78) = "εβδομηνταοκτώ" TF(79) = "εβδομηνταεννέα" TF(80) = "ογδόντα" TF(81) = "ογδονταμία" TF(82) = "ογδονταδύο" TF(83) = "ογδοντατρείς" TF(84) = "ογδοντατέσσερις" TF(85) = "ογδονταπέντε" TF(86) = "ογδονταέξι" TF(87) = "ογδονταεπτά" TF(88) = "ογδονταοκτώ" TF(89) = "ογδονταεννέα" TF(90) = "εννενήντα" TF(91) = "ενεννηνταμία" TF(92) = "ενεννηνταδύο" TF(93) = "ενεννηντατρείς" TF(94) = "ενεννηντατέσσερις" TF(95) = "ενεννηνταπέντε" TF(96) = "ενεννηνταέξι" TF(97) = "ενεννηνταεπτά" TF(98) = "ενεννηνταοκτώ" TF(99) = "ενεννηνταεννέα" If Amount = 0 Then Return "μηδέν ευρώ" If Amount < 0 Then Amount = -Amount PrefixPart = "μείον " End If Cents = Math.Round(100 * (Amount - Int(Amount)), 0) If Cents > 0 Then If Amount >= 1 Then If Cents = 1 Then CentsPart = "και ένα λεπτό" Else CentsPart = "και " & TN(Cents) & " λεπτά" End If Else If Cents = 1 Then CentsPart = "ένα λεπτό" Else CentsPart = TN(Cents) & " λεπτά" End If End If End If If Amount >= 1 Then CurrencyPart = " ευρώ" End If Billions = Int(Amount / (10 ^ 9)) Millions = Int(Int(Amount - Billions * (10 ^ 9)) / (10 ^ 6)) Thousands = Int(Int(Amount - Billions * (10 ^ 9) - Millions * (10 ^ 6)) / (10 ^ 3)) Small = Int(Amount - Billions * (10 ^ 9) - Millions * (10 ^ 6) - Thousands * (10 ^ 3)) BillionsH = Int(Billions / 100) MillionsH = Int(Millions / 100) ThousandsH = Int(Thousands / 100) SmallH = Int(Small / 100) SmallN = Small - SmallH * 100 ThousandsN = Thousands - ThousandsH * 100 MillionsN = Millions - MillionsH * 100 BillionsN = Billions - BillionsH * 100 If Small = 100 Then SmallPart = "εκατό" Else SmallPart = HN(SmallH) & " " & TN(SmallN) End If If Thousands = 1 Then ThousandsPart = " χίλια" Else If Thousands = 100 Then ThousandsPart = "εκατό χιλιάδες" Else If Thousands > 0 Then ThousandsPart = HF(ThousandsH) & " " & TF(ThousandsN) & " χιλιάδες" End If End If If Millions = 1 Then MillionsPart = "ένα εκατομμύριο" Else If Millions = 100 Then MillionsPart = "εκατό εκατομύρια" Else If Millions > 0 Then MillionsPart = HN(MillionsH) & " " & TN(MillionsN) & " εκατομμύρια" End If End If If Billions = 1 Then BillionsPart = "ένα δισεκατομμύριο" Else If Billions = 100 Then BillionsPart = "εκατό δισεκατομμύρια" Else If Billions > 0 Then BillionsPart = HN(BillionsH) & " " & TN(BillionsN) & " δισεκατομμύρια" End If End If Return Trim(PrefixPart & BillionsPart & " " & MillionsPart & " " & ThousandsPart & " " & SmallPart & CurrencyPart & " " & CentsPart) Catch Return Trim(Amount.ToString) End Try End Function
Χρήστος Γεωργακόπουλος
|
|
-
18-05-2005, 12:23
|
-
24-05-2007, 13:10
|
-
YiannisF
-
-

-
Μέλος από τις 08-12-2006
-
Athens
-
Δημοσιεύσεις 20
-
-
|
Απ: Re: Function ΟΛΟΓΡΑΦΩΣ
Για όποιον ενδιαφέρεται, ακολουθεί έκδοση σε C# της εξαιρετικής αυτής μεθόδου του Χρήστου Γεωργακόπουλου. public static string GetMoneyVerbage(decimal Amount) { try { string PrefixPart = string.Empty; string CentsPart = string.Empty; string CurrencyPart = string.Empty; string SmallPart = string.Empty; string ThousandsPart = string.Empty; string MillionsPart = string.Empty; string BillionsPart = string.Empty; int Cents; int Small; int Thousands; int Millions; int Billions; int SmallH; int ThousandsH; int MillionsH; int BillionsH; int SmallN; int ThousandsN; int MillionsN; int BillionsN; string[] TN = new string[100]; string[] TF = new string[100]; string[] HN = new string[10]; string[] HF = new string[10]; HN[0] = ""; HN[1] = "εκατόν"; HN[2] = "διακόσια"; HN[3] = "τριακόσια"; HN[4] = "τετρακόσια"; HN[5] = "πεντακόσια"; HN = "εξακόσια"; HN[7] = "επτακόσια"; HN = "οκτακόσια"; HN[9] = "εννιακόσια"; HF[0] = ""; HF[1] = "εκατόν"; HF[2] = "διακόσιες"; HF[3] = "τριακόσιες"; HF[4] = "τετρακόσιες"; HF[5] = "πεντακόσιες"; HF = "εξακόσιες"; HF[7] = "επτακόσιες"; HF = "οκτακόσιες"; HF[9] = "εννιακόσιες"; TN[0] = ""; TN[1] = "ένα"; TN[2] = "δύο"; TN[3] = "τρία"; TN[4] = "τέσσερα"; TN[5] = "πέντε"; TN = "έξι"; TN[7] = "επτά"; TN = "οκτώ"; TN[9] = "εννέα"; TN[10] = "δέκα"; TN[11] = "έντεκα"; TN[12] = "δώδεκα"; TN[13] = "δεκατρία"; TN[14] = "δεκατέσσερα"; TN[15] = "δεκαπέντε"; TN[16] = "δεκαέξι"; TN[17] = "δεκαεπτά"; TN[18] = "δεκαοκτώ"; TN[19] = "δεκαεννέα"; TN[20] = "είκοσι"; TN[21] = "εικοσιένα"; TN[22] = "εικοσιδύο"; TN[23] = "εικοσιτρία"; TN[24] = "εικοσιτέσσερα"; TN[25] = "εικοσιπέντε"; TN[26] = "εικοσιέξι"; TN[27] = "εικοσιεπτά"; TN[28] = "εικοσιοκτώ"; TN[29] = "εικοσιεννέα"; TN[30] = "τριάντα"; TN[31] = "τριανταένα"; TN[32] = "τριανταδύο"; TN[33] = "τριαντατρία"; TN[34] = "τριαντατέσσερα"; TN[35] = "τριανταπέντε"; TN[36] = "τριανταέξι"; TN[37] = "τριανταεπτά"; TN[38] = "τριανταοκτώ"; TN[39] = "τριανταεννέα"; TN[40] = "σαράντα"; TN[41] = "σαρανταένα"; TN[42] = "σαρανταδύο"; TN[43] = "σαραντατρία"; TN[44] = "σαραντατέσσερα"; TN[45] = "σαρανταπέντε"; TN[46] = "σαρανταέξι"; TN[47] = "σαρανταεπτά"; TN[48] = "σαρανταοκτώ"; TN[49] = "σαρανταεννέα"; TN[50] = "πενήντα"; TN[51] = "πενηνταένα"; TN[52] = "πενηνταδύο"; TN[53] = "πενηντατρία"; TN[54] = "πενηντατέσσερα"; TN[55] = "πενηνταπέντε"; TN[56] = "πενηνταέξι"; TN[57] = "πενηνταεπτά"; TN[58] = "πενηνταοκτώ"; TN[59] = "πενηνταεννέα"; TN[60] = "εξήντα"; TN[61] = "εξηνταένα"; TN[62] = "εξηνταδύο"; TN[63] = "εξηντατρία"; TN[64] = "εξηντατέσσερα"; TN[65] = "εξηνταπέντε"; TN[66] = "εξηνταέξι"; TN[67] = "εξηνταεπτά"; TN[68] = "εξηνταοκτώ"; TN[69] = "εξηνταεννέα"; TN[70] = "εβδομήντα"; TN[71] = "εβδομηνταένα"; TN[72] = "εβδομηνταδύο"; TN[73] = "εβδομηντατρία"; TN[74] = "εβδομηντατέσσερα"; TN[75] = "εβδομηνταπέντε"; TN[76] = "εβδομηνταέξι"; TN[77] = "εβδομηνταεπτά"; TN[78] = "εβδομηνταοκτώ"; TN[79] = "εβδομηνταεννέα"; TN[80] = "ογδόντα"; TN[81] = "ογδονταένα"; TN[82] = "ογδονταδύο"; TN[83] = "ογδοντατρία"; TN[84] = "ογδοντατέσσερα"; TN[85] = "ογδονταπέντε"; TN[86] = "ογδονταέξι"; TN[87] = "ογδονταεπτά"; TN[88] = "ογδονταοκτώ"; TN[89] = "ογδονταεννέα"; TN[90] = "εννενήντα"; TN[91] = "ενεννηνταένα"; TN[92] = "ενεννηνταδύο"; TN[93] = "ενεννηντατρία"; TN[94] = "ενεννηντατέσσερα"; TN[95] = "ενεννηνταπέντε"; TN[96] = "ενεννηνταέξι"; TN[97] = "ενεννηνταεπτά"; TN[98] = "ενεννηνταοκτώ"; TN[99] = "ενεννηνταεννέα"; TF[0] = ""; TF[1] = "μία"; TF[2] = "δύο"; TF[3] = "τρείς"; TF[4] = "τέσσερις"; TF[5] = "πέντε"; TF = "έξι"; TF[7] = "επτά"; TF = "οκτώ"; TF[9] = "εννέα"; TF[10] = "δέκα"; TF[11] = "έντεκα"; TF[12] = "δώδεκα"; TF[13] = "δεκατρείς"; TF[14] = "δεκατέσσερις"; TF[15] = "δεκαπέντε"; TF[16] = "δεκαέξι"; TF[17] = "δεκαεπτά"; TF[18] = "δεκαοκτώ"; TF[19] = "δεκαεννέα"; TF[20] = "είκοσι"; TF[21] = "εικοσιμία"; TF[22] = "εικοσιδύο"; TF[23] = "εικοσιτρείς"; TF[24] = "εικοσιτέσσερις"; TF[25] = "εικοσιπέντε"; TF[26] = "εικοσιέξι"; TF[27] = "εικοσιεπτά"; TF[28] = "εικοσιοκτώ"; TF[29] = "εικοσιεννέα"; TF[30] = "τριάντα"; TF[31] = "τριανταμία"; TF[32] = "τριανταδύο"; TF[33] = "τριαντατρείς"; TF[34] = "τριαντατέσσερις"; TF[35] = "τριανταπέντε"; TF[36] = "τριανταέξι"; TF[37] = "τριανταεπτά"; TF[38] = "τριανταοκτώ"; TF[39] = "τριανταεννέα"; TF[40] = "σαράντα"; TF[41] = "σαρανταμία"; TF[42] = "σαρανταδύο"; TF[43] = "σαραντατρείς"; TF[44] = "σαραντατέσσερις"; TF[45] = "σαρανταπέντε"; TF[46] = "σαρανταέξι"; TF[47] = "σαρανταεπτά"; TF[48] = "σαρανταοκτώ"; TF[49] = "σαρανταεννέα"; TF[50] = "πενήντα"; TF[51] = "πενηνταμία"; TF[52] = "πενηνταδύο"; TF[53] = "πενηντατρείς"; TF[54] = "πενηντατέσσερις"; TF[55] = "πενηνταπέντε"; TF[56] = "πενηνταέξι"; TF[57] = "πενηνταεπτά"; TF[58] = "πενηνταοκτώ"; TF[59] = "πενηνταεννέα"; TF[60] = "εξήντα"; TF[61] = "εξηνταμία"; TF[62] = "εξηνταδύο"; TF[63] = "εξηντατρείς"; TF[64] = "εξηντατέσσερις"; TF[65] = "εξηνταπέντε"; TF[66] = "εξηνταέξι"; TF[67] = "εξηνταεπτά"; TF[68] = "εξηνταοκτώ"; TF[69] = "εξηνταεννέα"; TF[70] = "εβδομήντα"; TF[71] = "εβδομηνταμία"; TF[72] = "εβδομηνταδύο"; TF[73] = "εβδομηντατρείς"; TF[74] = "εβδομηντατέσσερις"; TF[75] = "εβδομηνταπέντε"; TF[76] = "εβδομηνταέξι"; TF[77] = "εβδομηνταεπτά"; TF[78] = "εβδομηνταοκτώ"; TF[79] = "εβδομηνταεννέα"; TF[80] = "ογδόντα"; TF[81] = "ογδονταμία"; TF[82] = "ογδονταδύο"; TF[83] = "ογδοντατρείς"; TF[84] = "ογδοντατέσσερις"; TF[85] = "ογδονταπέντε"; TF[86] = "ογδονταέξι"; TF[87] = "ογδονταεπτά"; TF[88] = "ογδονταοκτώ"; TF[89] = "ογδονταεννέα"; TF[90] = "εννενήντα"; TF[91] = "ενεννηνταμία"; TF[92] = "ενεννηνταδύο"; TF[93] = "ενεννηντατρείς"; TF[94] = "ενεννηντατέσσερις"; TF[95] = "ενεννηνταπέντε"; TF[96] = "ενεννηνταέξι"; TF[97] = "ενεννηνταεπτά"; TF[98] = "ενεννηνταοκτώ"; TF[99] = "ενεννηνταεννέα"; if (Amount == 0) { return "μηδέν ευρώ"; } if (Amount < 0) { Amount = -Amount; PrefixPart = "μείον "; } Cents = Convert.ToInt32(Math.Round(100 * (Amount - Convert.ToInt32(Math.Floor(Convert.ToDouble(Amount)))), 0)); if (Cents > 0) { if (Amount >= 1) { if (Cents == 1) { CentsPart = "και ένα λεπτό"; } else { CentsPart = "και " + TN[Cents] + " λεπτά"; } } else { if (Cents == 1) { CentsPart = "ένα λεπτό"; } else { CentsPart = TN[Cents] + " λεπτά"; } } } if (Amount >= 1) { CurrencyPart = " ευρώ"; } Billions = Convert.ToInt32(Math.Floor(Convert.ToDouble(Convert.ToDouble(Amount) / (Math.Pow(10, 9))))); Millions = Convert.ToInt32(Math.Floor(Convert.ToDouble(Convert.ToInt32(Convert.ToDouble(Amount) - Billions * (Math.Pow(10, 9))) / (Math.Pow(10, 6))))); Thousands = Convert.ToInt32(Math.Floor(Convert.ToDouble(Convert.ToInt32(Convert.ToDouble(Amount) - Billions * (Math.Pow(10, 9)) - Millions * (Math.Pow(10, 6))) / (Math.Pow(10, 3))))); Small = Convert.ToInt32(Math.Floor(Convert.ToDouble(Convert.ToDouble(Amount) - Billions * (Math.Pow(10, 9)) - Millions * (Math.Pow(10, 6)) - Thousands * (Math.Pow(10, 3))))); BillionsH = Convert.ToInt32(Billions / 100); MillionsH = Convert.ToInt32(Millions / 100); ThousandsH = Convert.ToInt32(Thousands / 100); SmallH = Convert.ToInt32(Small / 100); SmallN = Small - SmallH * 100; ThousandsN = Thousands - ThousandsH * 100; MillionsN = Millions - MillionsH * 100; BillionsN = Billions - BillionsH * 100; if (Small == 100) { SmallPart = "εκατό"; } else { SmallPart = HN[SmallH] + " " + TN[SmallN]; } if (Thousands == 1) { ThousandsPart = " χίλια"; } else { if (Thousands == 100) { ThousandsPart = "εκατό χιλιάδες"; } else { if (Thousands > 0) { ThousandsPart = HF[ThousandsH] + " " + TF[ThousandsN] + " χιλιάδες"; } } } if (Millions == 1) { MillionsPart = "ένα εκατομμύριο"; } else { if (Millions == 100) { MillionsPart = "εκατό εκατομύρια"; } else { if (Millions > 0) { MillionsPart = HN[MillionsH] + " " + TN[MillionsN] + " εκατομμύρια"; } } } if (Billions == 1) { BillionsPart = "ένα δισεκατομμύριο"; } else { if (Billions == 100) { BillionsPart = "εκατό δισεκατομμύρια"; } else { if (Billions > 0) { BillionsPart = HN[BillionsH] + " " + TN[BillionsN] + " δισεκατομμύρια"; } } } string verbage = (PrefixPart + BillionsPart + " " + MillionsPart + " " + ThousandsPart + " " + SmallPart + CurrencyPart + " " + CentsPart); return verbage.Trim(); } catch (Exception exc) { return Amount.ToString().Trim(); } }
.::yf::.
|
|
-
18-06-2007, 16:26
|
-
Panos Kousidis
-
-

-
Μέλος από τις 07-12-2005
-
London, UK
-
Δημοσιεύσεις 80
-
-
|
Ιδού και η δική μου υλοποίηση σε vb.net που χρησιμοποιεί λιγότερη μνήμη, είναι μικρότερη και φτάνει στο άπειρο (καλά μη τρελαθούμε κι όλας, μέχρι εκεί που φθάνει ο double όπως είναι τώρα, αλλά με πολύ μικρή τροποποίηση μπορεί να φθάσει περισσότερο, το μόνο που έχεις να κάνεις είναι να προσθέσεις στο idx() τις κατάλληλες λέξεις μετά το πεντάκις ).
Public Class Money Shared ReadOnly m() As String = {"", "ΕΝΑ ", "ΔΥΟ ", "ΤΡΙΑ ", "ΤΕΣΣΕΡΑ ", "ΠΕΝΤΕ ", "ΕΞΙ ", "ΕΠΤΑ ", "ΟΚΤΩ ", "ΕΝΝΕΑ "} Shared ReadOnly mF() As String = {"", "ΜΙΑ ", "", "ΤΡΕΙΣ ", "ΤΕΣΣΕΡΙΣ "} Shared ReadOnly d() As String = {"", "ΔΕΚΑ", "ΕΙΚΟΣΙ ", "ΤΡΙΑΝΤΑ ", "ΣΑΡΑΝΤΑ ", "ΠΕΝΗΝΤΑ ", "ΕΞΗΝΤΑ ", "ΕΒΔΟΜΗΝΤΑ ", "ΟΓΔΟΝΤΑ ", "ΕΝΕΝΗΝΤΑ "} Shared ReadOnly e() As String = {"", "ΕΚΑΤΟ", "ΔΙΑΚΟΣΙ", "ΤΡΙΑΚΟΣΙ", "ΤΕΤΡΑΚΟΣΙ", "ΠΕΝΤΑΚΟΣΙ", "ΕΞΑΚΟΣΙ", "ΕΠΤΑΚΟΣΙ", "ΟΚΤΑΚΟΣΙ", "ΕΝΝΙΑΚΟΣΙ"} Shared ReadOnly idx() As String = {"ΛΕΠΤΑ", "ΕΥΡΩ ", "ΧΙΛΙΑΔΕΣ ", "ΕΚΑΤΟΜΜΥΡΙA ", "ΔΙΣ ", "ΤΡΙΣ ", "ΤΕΤΡΑΚΙΣ ", "ΠΕΝΤΑΚΙΣ "}
Public Shared Function GetVerbalMoney(ByVal money As Double) As String Dim str As String = "" Dim index As Byte = 0 If Not money = Int(money) Then str = "ΚΑΙ " & GetValue(Int(Math.Round(money - Int(money), 2) * 100, index) Do While money >= 1 money /= 1000 index += 1 str = GetValue(Int(Math.Round(money - Int(money), 3) * 1000), index) & str 'Για έναν περίεργο λόγο χρειάζεται το Math.Round γιατί οι πράξεις 'δε γίνονται σωστά. Δηλ. 2.15-2.0=0.14999999.Μπορεί να μου το εξηγήσει κάποιος; 'Είναι feature της VB μάλλον... Loop Return str End Function
Private Shared Function GetValue(ByVal money As Short, ByVal index As Byte) Dim str As String = "" Dim ekatontades As Byte = Int(money / 100) Dim dekades As Byte = Int((money - ekatontades * 100) / 10) Dim monades As Byte = money - ekatontades * 100 - dekades * 10 'EKATONTADES If Not ekatontades = 0 Then If ekatontades = 1 Then If dekades = 0 AndAlso monades = 0 Then str = e(1) & " " Else str = e(1) & "Ν " End If Else If index = 2 Then str = e(ekatontades) & "ΕΣ " Else str = e(ekatontades) & "Α " End If End If 'DEKADES If dekades = 1 Then Select Case monades Case 0 : str += " " Case 1 : str += "ΕΝΤΕΚΑ " Case 2 : str += "ΔΩΔΕΚΑ " Case Else : str += d(dekades) End Select Else str += d(dekades) End If 'MONADES If index = 2 AndAlso monades = 1 Then str += "ΧΙΛΙΑ " ElseIf index = 3 AndAlso monades = 1 Then str += "ΕΝΑ ΕΚΑΤΟΜΜΥΡΙΟ " Else If index = 2 AndAlso (monades = 1 Or monades = 3 Or monades = 4) Then str += mF(monades) Else If Not (dekades = 1 And (monades = 1 Or monades = 2)) Then str += m(monades) End If End If If str <> "" Or index = 1 Then str += idx(index) End If Return str End Function End ClassΤην έχω φτιάξει να είναι αυτόνομη κλάση με μία Public Shared Function και δουλεύει πολύ απλά: πχ. MsgBox(Money.GetVerbalMoney(123456789))
Panos
|
|
-
18-06-2007, 19:28
|
|
panos_sniper: 'Για έναν περίεργο λόγο χρειάζεται το Math.Round γιατί οι πράξεις 'δε γίνονται σωστά. Δηλ. 2.15-2.0=0.14999999.Μπορεί να μου το εξηγήσει κάποιος; 'Είναι feature της VB μάλλον...
Στην πραγματικότητα είναι "feature" της αναπαράστασης του double κατά το πρότυπο IEEE 954 με κινητή υποδιαστολή. Στην παράσταση αυτή, οι δεκαδικοί αριθμοί δεν παριστάνονται με ακρίβεια, και μάλιστα η ακρίβειά τους μειώνεται όσο αυξάνεται το (απόλυτο) μέγεθός τους. Αυτό έχει το μειονέκτημα που παρατήρησες, αλλά την ίδια στιγμή δίνει τη δυνατότητα της παράστασης πολύ μικρών κατ' απόλυτη τιμή αριθμών και πολύ μεγάλων χρησιμοποιώντας σταθερό αριθμό bits. Όπου απαιτείται ακρίβεια στις δεκαδικές πράξεις (π.χ. αξιακά δεδομένα) χρησιμοποιούνται τύποι σαν τον decimal που έχουν δεκαδική ακρίβεια.
Νατάσα Μανουσοπούλου
|
|
-
19-06-2007, 09:52
|
-
29-05-2008, 02:29
|
-
dva
-
-

-
Μέλος από τις 11-11-2006
-
-
Δημοσιεύσεις 25
-
-
|
Μετά από 1 χρόνο περίπου είπα κι εγώ να χρησιμοποιήσω τον κώδικα του panos_sniper. Οπότε έριξα μια μετάφραση σε C# (αλλά μάλλον θα πέσει και 2η μετάφραση για να γίνει Win32 dll), έριξα και... "τρία κιλά κώδικα" ...για να εμφανίζει το ΜΗΔΕΝ ΕΥΡΩ, να παίρνει αρνητικά ποσά, να μην εμφανίζει νομίσματα (ευρώ και λεπτά, παρά μόνο το ποσό), λίγο debugging (για τα μάτια του κόσμου) γιατί με κάποια ποσά (π.χ. το 1,101,101.10 του αξέχαστου Χόρν) δεν τα πήγαινε πολύ καλά, και το τελικό αποτέλεσμα είναι το εξής:
System.Diagnostics.Debug.Print(Money.GetVerbal(1101101.10)); ΕΝΑ ΕΚΑΤΟΜΜΥΡΙΟ ΕΚΑΤΟΝ ΜΙΑ ΧΙΛΙΑΔΕΣ ΕΚΑΤΟΝ ΕΝΑ ΕΥΡΩ ΚΑΙ ΔΕΚΑ ΛΕΠΤΑ
System.Diagnostics.Debug.Print(Money.GetVerbal(1101101101100.11)); ΕΝΑ ΤΡΙΣΕΚΑΤΟΜΜΥΡΙΟ ΕΚΑΤΟΝ ΕΝΑ ΔΙΣΕΚΑΤΟΜΜΥΡΙΑ ΕΚΑΤΟΝ ΕΝΑ ΕΚΑΤΟΜΜΥΡΙΑ ΕΚΑΤΟΝ ΜΙΑ ΧΙΛΙΑΔΕΣ ΕΚΑΤΟ ΕΥΡΩ ΚΑΙ ΕΝΤΕΚΑ ΛΕΠΤΑ
System.Diagnostics.Debug.Print(Money.GetVerbal(0)); ΜΗΔΕΝ ΕΥΡΩ
System.Diagnostics.Debug.Print(Money.GetVerbal(-987654321.23, true, false)); //Να μην βγάλει ευρώ και λεπτά MEION ΕΝΝΙΑΚΟΣΙΑ ΟΓΔΟΝΤΑ ΕΠΤΑ ΕΚΑΤΟΜΜΥΡΙΑ ΕΞΑΚΟΣΙΕΣ ΠΕΝΗΝΤΑ ΤΕΣΣΕΡΙΣ ΧΙΛΙΑΔΕΣ ΤΡΙΑΚΟΣΙΑ ΕΙΚΟΣΙ ΕΝΑ ΚΑΙ ΕΙΚΟΣΙ ΤΡΙΑ
public class Money {
private static string[] mF = { "", "ΜΙΑ ", "", "ΤΡΕΙΣ ", "ΤΕΣΣΕΡΙΣ " };
private static string[] m = { "", "ΕΝΑ ", "ΔΥΟ ", "ΤΡΙΑ ", "ΤΕΣΣΕΡΑ ", "ΠΕΝΤΕ ", "ΕΞΙ ", "ΕΠΤΑ ", "ΟΚΤΩ ", "ΕΝΝΕΑ " }; private static string[] d1 = { "ΔΕΚΑ ", "ΕΝΤΕΚΑ ", "ΔΩΔΕΚΑ " }; //Διαφοροποίησεις των 11,12 ως προς τα 13, 14, 15, ... private static string[] d = { "", "ΔΕΚΑ", "ΕΙΚΟΣΙ ", "ΤΡΙΑΝΤΑ ", "ΣΑΡΑΝΤΑ ", "ΠΕΝΗΝΤΑ ", "ΕΞΗΝΤΑ ", "ΕΒΔΟΜΗΝΤΑ ", "ΟΓΔΟΝΤΑ ", "ΕΝΕΝΗΝΤΑ " }; private static string[] e = { "", "ΕΚΑΤΟ", "ΔΙΑΚΟΣΙ", "ΤΡΙΑΚΟΣΙ", "ΤΕΤΡΑΚΟΣΙ", "ΠΕΝΤΑΚΟΣΙ", "ΕΞΑΚΟΣΙ", "ΕΠΤΑΚΟΣΙ", "ΟΚΤΑΚΟΣΙ", "ΕΝΝΙΑΚΟΣΙ" }; private static string[] idx = { "ΛΕΠΤΑ", "ΕΥΡΩ ", "ΧΙΛΙΑΔΕΣ ", "ΕΚΑΤΟΜΜΥΡΙ", "ΔΙΣ", "ΤΡΙΣ", "ΤΕΤΡΑΚΙΣ ", "ΠΕΝΤΑΚΙΣ " };
public static double Round(double value) { return Round(value, 0); }
public static double Round(double value, short precision) { return (double)Math.Round((decimal)value, precision); }
public static string GetVerbal(double money) { return GetVerbal(money, true); }
public static string GetVerbal(double money, bool showZero) { return GetVerbal(money, showZero, true); }
public static string GetVerbal(double money, bool showZero, bool showCurrency) { string tmpStr; string retStr; string str; short index = 0; bool isZero = true; bool isNegative = false;
retStr = tmpStr = str = "";
if (money < 0) { money = -money; isNegative = true; }
if (money != (long)money) { short value = (short)Round(100 * money - 100 * Math.Floor(money), 0); if (value >= 100) { value -= 100; money += 1.0; }
money = (long)money; if (value > 0) { isZero = false;
tmpStr = GetValue(value, index, showCurrency); if (money >= 1 && value > 0) { str += "ΚΑΙ "; } str += tmpStr; } }
while (money >= 1) { isZero = false; money /= 1000; index += 1; short value = (short)(Round(money - (long)money, 3) * 1000); tmpStr = GetValue(value, index, showCurrency); money = (long)money; tmpStr += str; str = tmpStr; }
if (isZero) { if (showZero) { str = "ΜΗΔΕΝ "; if (showCurrency) { str += idx[1]; } } } else { if (isNegative) retStr = "MEION "; }
retStr += str; return retStr; }
static string GetValue(short money, short index, bool showCurrency) { if (index == 2 && money == 1) { return "ΧΙΛΙΑ "; }
string str = ""; int ekatontades = (int)(money / 100); int dekmon = money - ekatontades * 100; int dekades = (int)(dekmon / 10); int monades = dekmon - dekades *10;
//EKATONTADES if (ekatontades == 1) { if (dekmon == 0) { str = e[1] + " "; } else { str = e[1] + "Ν "; } } else if (ekatontades > 1) { if (index == 2) { str = e[ekatontades] + "ΕΣ "; } else { str = e[ekatontades] + "Α "; } }
//DEKADES switch (dekmon) { case 10: str += d1[monades]; //"ΔΕΚΑ " με κενό στο τέλος break; case 11: str += d1[monades]; monades = 0; break; case 12: str += d1[monades]; monades = 0; break; default: str += d[dekades]; break; }
//MONADES if (index == 2 && (monades == 1 || monades == 3 || monades == 4)) { str += mF[monades]; } else { if (dekmon < 10 || dekmon >12) { str += m[monades]; } }
if (str.Length > 0 || index == 1) { if (index == 0 && money == 1/*monades == 1 && dekades == 0 && ekatontades == 0*/) { if (showCurrency) { str += "ΛΕΠΤΟ"; } } else { if (index > 1 || showCurrency) { str += idx[index]; if (index > 2) { if (index > 3) { str += idx[3]; } if (money > 1) { str += "Α "; } else { str += "Ο "; } } } } } return str; } }
|
|
-
29-05-2008, 03:30
|
|
Νομίζω ότι ο κώδικας θέλει λίγη προσοχή παραπάνω. Καταρχήν, καλό είναι να χρησιμοποιείς τον τύπο decimal και όχι τον double όταν χειρίζεσαι χρηματικά ποσά, γιατί ο double είναι κινητής υποδιαστολής και μπορεί να χάσει δεκαδικά λόγω στρογγυλοποίησης.
Επίσης, οι μεταβλητές καλό είναι να ορίζονται στο σημείο ακριβώς όπου χρησιμοποιούνται και όχι στην αρχή της μεθόδου. Έτσι αποφεύγεις μία μεταβλητή να έχει μεγαλύτερο scope από αυτό που χρειάζεται. Στην περίπτωση του κώδικα σου για παράδειγμα, η tmpStr έχει scope σε ολόκληρη την μέθοδο, αν και χρησιμοποιείται μόνο σε δύο ανεξάρτητα σημεία. Ουσιαστικά έχεις μία global tmpStr ενώ χρειάζεσαι μόνο δύο τοπικά temporary strings. Επίσης, κάνοντας string concatenation δημιουργείς συνέχεια temporary strings τα οποία μετά είναι άχρηστα και πρέπει να καθαριστούν από τον garbage collector. Καλύτερα θα ήταν να χρησιμοποιήσεις ένα StringBuilder και την String.Format() για να αποφύγεις τα temporary strings. Τέλος, μπορείς να αποφύγεις τις διαιρέσεις και το recursion μετατρέποντας το money σε string και παίροντας ένα-ένα τους αριθμούς.
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
21-06-2008, 16:53
|
-
25-06-2008, 10:34
|
-
saslanis
-
-

-
Μέλος από τις 27-02-2008
-
Neo Iraklio
-
Δημοσιεύσεις 4
-
-
|
Χαίρετε
Διάβαζα τις πολύ όμορφες συναρτήσεις για την μετατροπή αριθμών σε Ευρώ και Λεπτά και θυμήθηκα ότι στο παρελθόν είχα φτιάξει κάτι αντίστοιχο. Ίσως να παραθέσω και τα δικά μου κιλά του κώδικα μιας και είχα μια εντελώς διαφορετική προσέγγιση στο θέμα. Όμως γράφω γιατί τότε και έως και σήμερα μου έχει μείνει μια αναπάντητη απορία.
Πώς μεταφράζεται σε ολογράφως η πχ τιμή της βενζίνης 150.0314 που θα βλέπουμε στα βενζινάδικα σε κανα δυο μήνες;
το ΕΚΑΤΟΝ ΠΕΝΗΝΤΑ ΕΥΡΩ ΚΑΙ ΜΗΔΕΝ ΤΡΙΑΚΟΣΙΑ ΔΕΚΑΤΕΣΣΕΡΑ ΛΕΠΤΑ είναι σωστή απάντη;
το 150.314 πάντως αν γίνει ΕΚΑΤΟΝ ΠΕΝΗΝΤΑ ΕΥΡΩ ΚΑΙ ΤΡΙΑΚΟΣΙΑ ΔΕΚΑΤΕΣΣΕΡΑ ΛΕΠΤΑ είναι λάθος διότι 314 λεπτά είναι 3 Ευρώ και 14 Λεπτά. Το πιο σωστό θα ήταν ΤΡΙΑΚΟΣΙΑ ΔΕΚΑ ΤΕΣΣΕΡΑ ΧΙΛΙΟΣΤΑ ΤΟΥ ΕΥΡΩ ή ΤΡΙΑΝΤΑ ΕΝΑ ΚΑΙ ΤΕΣΣΕΡΑ ΛΕΠΤΑ.
Αν και φαντάζομαι ότι ένα τέτοιο σενάριο είναι επιστημονικής φαντασίας, ευτυχώς που οι λογιστές κυρίως στρογγυλοποιούν στα δύο δεκαδικά.
Καμιά πρόταση;
Stefanos Aslanis
|
|
-
25-06-2008, 21:12
|
|
saslanis:Αν και φαντάζομαι ότι ένα τέτοιο σενάριο είναι επιστημονικής φαντασίας, ευτυχώς που οι λογιστές κυρίως στρογγυλοποιούν στα δύο δεκαδικά.
Καμιά πρόταση;
Αν και το σενάριο είναι αληθινό, από τον καιρό που έχει καθιερωθεί το ευρώ, έχει επιβληθεί η στρογγυλοποίηση στα δύο δεκαδικά ψηφία - σε αυτό οι βασίζονται λογιστές και δρουν έτσι, είναι οδηγία από το υπουργείο εμπορείου.
Οπότε το "χιλιοστά του ευρώ" και το "λεπτά του λεπτού ευρώ" δεν είναι αποδεκτά, τουλάχιστον νομικά...
Γιατί να αγχωνόμαστε; 
George J.
|
|
-
26-06-2008, 20:09
|
-
dva
-
-

-
Μέλος από τις 11-11-2006
-
-
Δημοσιεύσεις 25
-
-
|
Δεν υπάρχει υποδιαίρεση του ευρώ μικρότερη του λεπτού.
http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CELEX:51996PC0499(01):EL:HTML
http://www.moi.gov.cy/moi/pio/pio.nsf/All/0BF8BFA414168E4DC22573B1004C5753?Opendocument Σε κάποια άλλη σελίδα (http://www.gge.gr/09diadsystasis/Documents/Entypa/N_2842.doc) αναφερόταν ότι ακρίβεια μεγαλύτερη των δύο δεκαδικών μπορεί να χρησιμοποιηθεί για ενδιάμεσους υπολογισμούς. Το τελικό ποσό σε ευρώ εκφράζεται πάντα με στρογγυλοποίηση στα 2 δεκαδικά.
|
|
-
27-06-2008, 08:48
|
-
15-08-2008, 11:50
|
|
Προσωπικά πιστεύω πως μια πολύ καλή λύση είναι να χρησιμοποιείς fixed point αριθμούς των 64bit με το ακέραιο κομμάτι στα 48bit και το δεκαδικό στα 16bit όταν ασχολείσαι με χρηματικά ποσά (όπου μπορείς να φτιάξεις μια "Currency" κλάση με overloaded operators μάλλον θα βολεύει).
~bs~
|
|
Σελίδα 1 από 2 (17 εγγραφές)
1
|
|
|