سلام دوستان
یک ماژول برای تبدیل عدد به حروف طراحی کردم که برای برنامه های حسابداری خیلی کابرد دارد . دوستان برنامه را ببینید و نظر بدهید تا بهتر شود. برای دانلود کلیک کنید.
http://www.barbod87.blogfa.com/post-7.aspx
سلام دوستان
یک ماژول برای تبدیل عدد به حروف طراحی کردم که برای برنامه های حسابداری خیلی کابرد دارد . دوستان برنامه را ببینید و نظر بدهید تا بهتر شود. برای دانلود کلیک کنید.
http://www.barbod87.blogfa.com/post-7.aspx
می تونی بهترش کنی ، خلاصه تر و مفید تر
شما این عدد را چطور می خوانی 12،345؟
اول از سمت راست 3 رقم 3 رقم جدا می کنی ، با این کار جایگاه اعداد بدست می آید بعدش هر گروه را جدا خوانده و ارزش مکانی آن گروه را در آخر ذکر می کنید.
12 هزار و 345 شما اگر یک تابع داشته باشید که فقط 3 رقم را بخواند کافیست یعنی از عدد 0 تا 999 -
پس یک تابع درست کنید که فقط این اعداد را بگیرد.
یک آرایه درست کنید که این اعداد را سه رقم 3 رقم در آن ذخیره کند .
به ترتیب آرایه را به این تابع فرستاده برگشتی تابع را با توجه به مکان آن هجی کنید
Public Class Heji
Private Shared adad() As String = {"صفر", "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه", "ده", "یازده", "دوازده", "سیزده", "چهارده", "پانزده", "شانزده", "هفده", "هجده", "نوزده"}
Private Shared adad2() As String = {"", "ده", "بیست", "سی", "چهل", "پنجاه", "شصت", "هفتاد", "هشتاد", "نود"}
Private Shared adad3() As String = {"", "صد", "دویست", "سیصد", "چهارصد", "پانصد", "ششصد", "هفتصد", "هشتصد", "نهصد"}
Public Shared Function GetString(ByVal i As Integer)
' باید عدد را 3 رقم 3 رقم به تابع
'h بفرستی
Return Nothing
End Function
Private Shared Function H(ByVal i As Integer) As String
Dim _and As String = "و"
If i < 20 Then
Return adad(i)
End If
Dim yekan As Byte
Dim dahgan As Byte
Dim sadghan As Byte
yekan = i Mod 10
dahgan = Int(i / 10) Mod 10
sadghan = Int(i / 100) Mod 10
If yekan = 0 Then
If dahgan = 0 Then
Return adad3(sadghan)
End If
If sadghan = 0 Then
Return adad2(dahgan)
End If
Return String.Format("{0} {1} {2}", adad3(sadghan), _and, adad2(dahgan))
Else
If dahgan = 0 Or dahgan = 1 Then
Return String.Format("{0} {1} {2}", adad3(sadghan), _and, adad(dahgan * 10 + yekan))
End If
If sadghan = 0 Then
Return String.Format("{0} {1} {2}", adad2(dahgan), _and, adad(yekan))
End If
Return String.Format("{0} {1} {2} {3} {4}", adad3(sadghan), _and, adad2(dahgan), _and, adad(yekan))
End If
End Function
End Class
حوصله ام نکشید که کلاس را تمام کنم یک سال بیشتر بود با ویبی برنامه ننوشته بودم گفتن برای اینکه یادم نرود این را بنویسم
آخرین ویرایش به وسیله linux : چهارشنبه 23 بهمن 1387 در 23:50 عصر
سلام دوستان
ظاهرا فقط جناب linux زحمت نظر دادن را به خودشان دادن . من دارم یک ماژول دیگه طراحی می کنم با کد نویسی خیلی کمتر .
جناب linux من خوب متوجه همه قسمتهای کدی که نوشتید نشدم می شه بیشتر توضیح بدید.
منتظر برنامه کامل تر من باشید
We work in the dark, we do what we can, we give what we have.
Our doubt is our passion and our passion is our task.
The rest is the madness of art
سلام
من این کد رو فکر کنم تو همین سایت دیدم و یک مثال براش ساختم (vs2005) به امتحانش می ارزه
دوست عزيز! ماژول شما مشكل داره! عدد 1000000000 رو به صورت "يك ميليارد ميليون هزار" نشون ميده! در حالي كه بايد يك ميليارد نشون بده!یک ماژول برای تبدیل عدد به حروف طراحی کردم که برای برنامه های حسابداری خیلی کابرد دارد . دوستان برنامه را ببینید و نظر بدهید تا بهتر شود. برای دانلود کلیک کنید.
مهندس! اعداد فارسي كجا و انگليسي كجا!!!
به زودي ماژول خودم رو براتون ميذارم كه بدون مشكله! (انشاءالله)
امیدم به دستان زیبای اوست . آنکه می آید . همان که نامش منجی ست ....
به راستی اگر غرق نبودیم چرا مارا به منجی ای نیازمند کرده اند؟ ... دنیا دریاست ....
دلنوشته های من
دوست عزيز! ببخشيد كه پيش دستي كردم!
اين هم يك كد تبديل عدد به حروف! قابليت تبديل اعداد به فارسي تا 18 رقم!
فعلا كه مشكلي نداره! اگه يافتيد باخبرم كنيد!
با تشكر!
امیدم به دستان زیبای اوست . آنکه می آید . همان که نامش منجی ست ....
به راستی اگر غرق نبودیم چرا مارا به منجی ای نیازمند کرده اند؟ ... دنیا دریاست ....
دلنوشته های من
با امكانات بيشتر Update شد!
https://barnamenevis.org/showpo...9&postcount=22
دوستان اگر در مورد اضافه كردن امكانات بيشتر، نظر يا پيشنهادي دارند بفرمايند!
امیدم به دستان زیبای اوست . آنکه می آید . همان که نامش منجی ست ....
به راستی اگر غرق نبودیم چرا مارا به منجی ای نیازمند کرده اند؟ ... دنیا دریاست ....
دلنوشته های من
سلام دوستان
خواهش می کنم از برنامه ای که دوستان می زارن بیشتر استفاده می کنیم نه ضرر هر چند هنوز برنامه رو ندیدم ولی حتما می بینم. خوب من برنامه جدیدم را با تغییرات عمده برای شما می زارم این برنامه هم برای اعداد فارسی و هم انگلیسی به کار می ره . یعنی دو تا ماژول می شه . من جنبه های مختلف رو امتحان کردم غلط نداشت البته قسمت انگلیسیش دانلود شده با کمی تغییرات که بعضی جاها and نمی زاره اگه دوستان وقت دارن درست کنن اینجا بزارن. منتظر نظرات شما هستم.
برای دانلود به لینک http://www.barbod87.blogfa.com برید
در ضمن اگه دوستان یک سایت فری و خوب که هر چند وقت یک بار اذیت نکونه سراغ دارن برای آپلود به من معرفی کنن ممنون می شم . اگه لینک مستقم باشه بهتر هست.
شما تابع H را مطالعه کنید همه موارد را خواهید فهمید.
'babak bakhshayesh
'babak@bbp.ir
'1387/11/29
'ver 1.0
Imports System.Text
Public Class Heji
Private Shared adad() As String = {"صفر", "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه", "ده", "یازده", "دوازده", "سیزده", "چهارده", "پانزده", "شانزده", "هفده", "هجده", "نوزده"}
Private Shared adad2() As String = {"", "ده", "بیست", "سی", "چهل", "پنجاه", "شصت", "هفتاد", "هشتاد", "نود"}
Private Shared adad3() As String = {"", "صد", "دویست", "سیصد", "چهارصد", "پانصد", "ششصد", "هفتصد", "هشتصد", "نهصد"}
Private Shared adad4() As String = {"", "هزار", "میلیون", "میلیارد", "تریلیارد"}
Private Shared _and As String = "و"
Public Shared Function GetString(ByVal i As Integer)
' باید عدد را 3 رقم 3 رقم به تابع
'h بفرستی
Dim nums(5) As Short
Dim sb As New StringBuilder
Dim m As Short
Dim f As Boolean
Dim Counter As Byte = 0
Do While (i > 0)
m = i Mod 1000
nums(Counter) = m
i = i \ 1000
Counter += 1
Loop
For n As Short = 5 To 0 Step -1
If nums(n) <> 0 Then
f = True
If n > 0 Then
sb.Append(String.Format("{0} {1}", H(nums(n)), adad4(n)))
If nums(n - 1) <> 0 Then
sb.Append(" ") : sb.Append(_and) : sb.Append(" ")
End If
Else
If f And nums(1) = 0 Then
sb.Append(" ")
sb.Append(_and)
sb.Append(" ")
End If
sb.Append(String.Format("{0} {1}", H(nums(n)), adad4(n)))
End If
End If
Next
Return sb.ToString()
End Function
Private Shared Function H(ByVal i As Integer) As String
If i < 20 Then
Return adad(i)
End If
Dim yekan As Byte
Dim dahgan As Byte
Dim sadghan As Byte
yekan = i Mod 10
dahgan = Int(i / 10) Mod 10
sadghan = Int(i / 100) Mod 10
If yekan = 0 Then
If dahgan = 0 Then
Return adad3(sadghan)
End If
If sadghan = 0 Then
Return adad2(dahgan)
End If
Return String.Format("{0} {1} {2}", adad3(sadghan), _and, adad2(dahgan))
Else
If dahgan = 0 Or dahgan = 1 Then
Return String.Format("{0} {1} {2}", adad3(sadghan), _and, adad(dahgan * 10 + yekan))
End If
If sadghan = 0 Then
Return String.Format("{0} {1} {2}", adad2(dahgan), _and, adad(yekan))
End If
Return String.Format("{0} {1} {2} {3} {4}", adad3(sadghan), _and, adad2(dahgan), _and, adad(yekan))
End If
End Function
End Class
دوستان سلام
خواهش می کنم این مطلب را تمام شده فرض نکنید. اگه در مورد برنامه ای که گزاشتم نظری دارید بفرمائید اعمال کنم.
برای ادامه کار می تونیم روی اعداد اعشاری کار کنیم یعنی چطور عدد اعشاری را به حروف تبدیل کنیم . در ضمن اون کدی که برای قسمت انگلیسی برنامه نوشتم یک کمی ایراد داره اگه می شه یکی زحمت شو بکشه .ایرادش اینه که بعضی وقتا یه جاهای که باید and بزاره نمی زاره. برای راحتی کار شما لینک برنامه را دوباره می زارم تا بهتر بهش دسترسی داشته باشید.http://www.barbod87.blogfa.com/
در ضمن اگه دوستان یک سایت فری و خوب که هر چند وقت یک بار اذیت نکونه سراغ دارن برای آپلود به من معرفی کنن ممنون می شم . اگه لینک مستقم باشه بهتر هست.
دوست عزيز! وبلاگت باز نميشه! چيكار كنيم!
پيشنهاد خوبيه! من كه به زودي دست بكار ميشم!برای ادامه کار می تونیم روی اعداد اعشاری کار کنیم یعنی چطور عدد اعشاری را به حروف تبدیل کنیم .
اگر جيميل (Gmail) داريد ميتونيد در اونجا آپلود كنيد! لينكش هم مستقيمه!در ضمن اگه دوستان یک سایت فری و خوب که هر چند وقت یک بار اذیت نکونه سراغ دارن برای آپلود به من معرفی کنن ممنون می شم . اگه لینک مستقم باشه بهتر هست.
امیدم به دستان زیبای اوست . آنکه می آید . همان که نامش منجی ست ....
به راستی اگر غرق نبودیم چرا مارا به منجی ای نیازمند کرده اند؟ ... دنیا دریاست ....
دلنوشته های من
سلام دوستان من
منهم قبلا كلاسي براي تبديل اعداد به حروف نوشته بودم كه در كامپوترم داشت خاك ميخورد ، تلاش دوستان رو ديدم گفتم اينجا بزارمش شايد به درد دوستان بخوره. بيشتر سعي كردم مختصر بنويسمش كه كمتر از 70 خط كد نشد. اميدوارم به دردتون بخوره و مشكلي نداشته باشه :
Public Class NumToStr
Private Class Numbers
Public intNum As Integer
Public strNum As String
Sub New(ByVal int As Integer, ByVal str As String)
intNum = int
strNum = str
End Sub
End Class
Private listOFNumbers() As Numbers = {New Numbers(1, "يك"), New Numbers(2, "دو"), New Numbers(3, "سه"), New Numbers(4, "چهار"), New Numbers(5, "پنج"), New Numbers(6, "شش") _
, New Numbers(7, "هفت"), New Numbers(8, "هشت"), New Numbers(9, "نه"), New Numbers(10, "ده"), New Numbers(11, "يازده"), New Numbers(12, "دوازده") _
, New Numbers(13, "سيزده"), New Numbers(14, "چهارده"), New Numbers(15, "پانزده"), New Numbers(16, "شانزده"), New Numbers(17, "هفده"), New Numbers(18, "هجده") _
, New Numbers(19, "نوزده"), New Numbers(20, "بيست"), New Numbers(30, "سي"), New Numbers(40, "چهل"), New Numbers(50, "پنجاه"), New Numbers(60, "شصت"), New Numbers(70, "هفتاد") _
, New Numbers(80, "هشتاد"), New Numbers(90, "نود"), New Numbers(100, "صد"), New Numbers(200, "دويست"), New Numbers(300, "سيصد"), New Numbers(400, "چهارصد"), New Numbers(500, "پانصد") _
, New Numbers(600, "ششصد"), New Numbers(700, "هفتصد"), New Numbers(800, "هشتصد"), New Numbers(900, "نهصد")}
Public Function GetStringOfNumber(ByVal num As Long) As String
Dim Part() As String = Split(FormatNumber(num, 0), ",")
Select Case Part.Length
Case Is = 1 And Not CInt(Part(0)) = 0
Return GetThree(Part(0))
Case Is = 2
If CInt(Part(1)) = 0 Then
Return GetThree(Part(0)) & " هزار " : Else
Return GetThree(Part(0)) & " هزار و " & GetThree(Part(1))
End If
Case Is = 3
If CInt(Part(1)) + CInt(Part(2)) = 0 Then
Return GetThree(Part(0)) & " ميليون " : Else
Return GetThree(Part(0)) & " ميليون و " & GetStringOfNumber(Part(1) & Part(2))
End If
Case Is = 4
If CInt(Part(1)) + CInt(Part(2)) + CInt(Part(3)) = 0 Then
Return GetThree(Part(0)) & " ميليارد " : Else
Return GetThree(Part(0)) & " ميليارد و " & GetStringOfNumber(Part(1) & Part(2) & Part(3))
End If
Case Is = 5
If CInt(Part(1)) + CInt(Part(2)) + CInt(Part(3)) + CInt(Part(4)) = 0 Then
Return GetThree(Part(0)) & " بيليارد " : Else
Return GetThree(Part(0)) & " بيليارد و " & GetStringOfNumber(Part(1) & Part(2) & Part(3) & Part(4))
End If
End Select
Return Nothing
End Function
Private Function GetThree(ByVal Num As Integer) As String
Dim Str As String = Num.ToString
Select Case Str.Length
Case Is = 1
Return Search(Num)
Case Is = 2
If Str.Substring(0, 1) = 1 Or Str.Substring(1, 1) = "0" Then
Return Search(Num) : Else
Return Search(Str.Substring(0, 1) & "0") & " و " & Search(Str.Substring(1, 1))
End If
Case Is = 3
If Str.Substring(1, 2) = "00" Then
Return Search(Num) : Else
Return Search(Str.Substring(0, 1) & "00") & " و " & GetThree(Str.Substring(1, 2))
End If
End Select
Return Nothing
End Function
Private Function Search(ByVal Num As Integer) As String
For i As Integer = 0 To listOFNumbers.Length - 1
If listOFNumbers(i).intNum = Num Then Return listOFNumbers(i).strNum
Next
Return Nothing
End Function
End Class
يا علي
آخرین ویرایش به وسیله mostafaaa : جمعه 02 اسفند 1387 در 18:28 عصر دلیل: اصلاح بخشي از كد
سلام دوست من
در این نمونه خاص فرقی نمیکه!چکاری هست که عدد را تبدیل به استرینگ کنید و بعدش روش پردازش انجام بدهید!
کار کردن رو اعداد که به مراتب سریعتر و راحتر هست.
پردازش به قدری پایینه که عملا فرقی نمیکنه!
من بیشتر به جنبه راحتی و کم بودن کد توجه کرده بودم، علاوه بر اون اینکه ، همانطور که گفتم من این کلاس رو خیلی وقت پیش نوشته بودم.
شما اگه دوست داری میتونی اصلاحش کنی بزاری دوستان استفاده کنند
یا علی
سلام دوست من
اینم ریاضیش :
Public Class NumToStr
Private Class Numbers
Public intNum As Integer
Public strNum As String
Sub New(ByVal int As Integer, ByVal str As String)
intNum = int
strNum = str
End Sub
End Class
Private listOFNumbers() As Numbers = {New Numbers(1, "يك"), New Numbers(2, "دو"), New Numbers(3, "سه"), New Numbers(4, "چهار"), New Numbers(5, "پنج"), New Numbers(6, "شش") _
, New Numbers(7, "هفت"), New Numbers(8, "هشت"), New Numbers(9, "نه"), New Numbers(10, "ده"), New Numbers(11, "يازده"), New Numbers(12, "دوازده") _
, New Numbers(13, "سيزده"), New Numbers(14, "چهارده"), New Numbers(15, "پانزده"), New Numbers(16, "شانزده"), New Numbers(17, "هفده"), New Numbers(18, "هجده") _
, New Numbers(19, "نوزده"), New Numbers(20, "بيست"), New Numbers(30, "سي"), New Numbers(40, "چهل"), New Numbers(50, "پنجاه"), New Numbers(60, "شصت"), New Numbers(70, "هفتاد") _
, New Numbers(80, "هشتاد"), New Numbers(90, "نود"), New Numbers(100, "صد"), New Numbers(200, "دويست"), New Numbers(300, "سيصد"), New Numbers(400, "چهارصد"), New Numbers(500, "پانصد") _
, New Numbers(600, "ششصد"), New Numbers(700, "هفتصد"), New Numbers(800, "هشتصد"), New Numbers(900, "نهصد")}
Public Function GetStringOfNumber(ByVal num As Long) As String
Dim Part() As String = Split(FormatNumber(num, 0), ",")
Select Case Part.Length
Case Is = 1 And Not CInt(Part(0)) = 0
Return GetThree(Part(0))
Case Is = 2
If CInt(Part(1)) = 0 Then
Return GetThree(Part(0)) & " هزار " : Else
Return GetThree(Part(0)) & " هزار و " & GetThree(Part(1))
End If
Case Is = 3
If CInt(Part(1)) + CInt(Part(2)) = 0 Then
Return GetThree(Part(0)) & " ميليون " : Else
Return GetThree(Part(0)) & " ميليون و " & GetStringOfNumber(Part(1) & Part(2))
End If
Case Is = 4
If CInt(Part(1)) + CInt(Part(2)) + CInt(Part(3)) = 0 Then
Return GetThree(Part(0)) & " ميليارد " : Else
Return GetThree(Part(0)) & " ميليارد و " & GetStringOfNumber(Part(1) & Part(2) & Part(3))
End If
Case Is = 5
If CInt(Part(1)) + CInt(Part(2)) + CInt(Part(3)) + CInt(Part(4)) = 0 Then
Return GetThree(Part(0)) & " بيليارد " : Else
Return GetThree(Part(0)) & " بيليارد و " & GetStringOfNumber(Part(1) & Part(2) & Part(3) & Part(4))
End If
End Select
Return Nothing
End Function
Private Function GetThree(ByVal Num As Integer) As String
Select Case Num
Case Is < 10
Return Search(Num)
Case Is < 100
If Num <= 20 Or (Num Mod 10) = 0 Then
Return Search(Num) : Else
Return Search((Math.Floor(Num / 10)) * 10) & " و " & Search(Num - ((Math.Floor(Num / 10)) * 10))
End If
Case Is < 1000
If Num Mod 100 = 0 Then
Return Search(Num) : Else
Return Search((Math.Floor(Num / 100)) * 100) & " و " & GetThree(Num - ((Math.Floor(Num / 100)) * 100))
End If
End Select
Return Nothing
End Function
Private Function Search(ByVal Num As Integer) As String
For i As Integer = 0 To listOFNumbers.Length - 1
If listOFNumbers(i).intNum = Num Then Return listOFNumbers(i).strNum
Next
Return Nothing
End Function
End Class
سلام دوستان!
من كه به كلي گيج شدم!
ترتيب درست پسوندهاي عددي به چه صورت هست؟
- هزار - ميليون - ميليارد - بيليون - بيليارد - تريليون - تيليارد - ...
- هزار - ميليون - ميليارد - بيليارد - بيليون - ...
- هزار - ميليون - ميليارد - بيليون - تريليون - ...
امیدم به دستان زیبای اوست . آنکه می آید . همان که نامش منجی ست ....
به راستی اگر غرق نبودیم چرا مارا به منجی ای نیازمند کرده اند؟ ... دنیا دریاست ....
دلنوشته های من
از اینجا می توانی ببینی http://en.wikipedia.org/wiki/SI_prefix
سلام دوستان
البته یک چیز رو فراموش نکنید!!
milliard, billion, number equal to a thousand millions, 1 000 000 000 (in the USA and France); number equal to a million millions, 1 000 000 000 000 (in Britain)
billion,number equal to a thousand millions, 1 000 000 000 (in the USA and France); number equal to a million millions, 1 000 000 000 000 (in Britain)و الا آخر ...trillion, number equaling one thousand billions; one followed by 12 zeros (in the U.S. and France); one followed by 18 zeros (in Great Britain and Germany)
تقریبا تمامی این نام ها هم در سیستم انگلیسی و هم آمریکایی مشابه هستند ولی مقادیر متفاوته!!
یا علی
دوست عزيز! سيستم آمريكا و انگليس رو بي خيال! سيستم فارسي چه جوريه؟!!تقریبا تمامی این نام ها هم در سیستم انگلیسی و هم آمریکایی مشابه هستند ولی مقادیر متفاوته!!
امیدم به دستان زیبای اوست . آنکه می آید . همان که نامش منجی ست ....
به راستی اگر غرق نبودیم چرا مارا به منجی ای نیازمند کرده اند؟ ... دنیا دریاست ....
دلنوشته های من
سلام دوست من
ما چیزی به اسم سیستم فارسی نداریم ولی در اکثر مواقع توی ایران ملاک سیستم آمریکایی هستش.
سلام دوستان چرا داین قد به سیستم امریکای انگلیسی گیر دادید اگه یکی وقت داره برنامه را برای اعداد با اعشاری تکمیل کنه فکر کنم بهتره اون موضوعی شما راجع بهش بحث می کنید در صلاحیت یک استاد زبان انگلیسی و ریاضی هست که با یک پرسش حل می شه دوستان اگه یک منبع قابل اعتماد دارند بپرسن و اینجا بزارن تا پرونده امریکای انگلیسی بسته بشه.
بد میگم؟؟
آقا linux کسی انجامش نداده.خودت زحمتشو بکش
سلام دوستان
راستی کسی برای اعداد اعشاری نمی خواد کاری انجام بده.
سلام دوستان عزيز
براي خواندن اعداد خيلي بزرگ بايد از استاندارد رايج بين المللي استفاده كنيم.اين استاندارد از ريشه هاي واژه هاي لاتيني ، يا زبانهاي ديگر اروپايي براي اعداد يزرگ انتخاب گرديده است.
استاندارد زير رايجترين استاندارد نامگذاري حروف در جهان است كه فرهنگستان زبان پارسي نيز آن را پذيرفته است . در ذيل نوع خواندن صحيح اعداد و چرايي اينگونه نامگذاري را توضيح داده ام.
اميدوارم كه مورد استفاده دوستان قرار گيرد.
يك ميليون Million 1,000,000
در زبان لاتين mile به معني هزار به كار رفته است. يك ميليون يك دسته سه تايي صفر بيشتر از هزار دارد.
يك بيليون Billion 1,000,000,000
در بعضي از كشورها اين عدد را ميليارد (Milliard ) مي نامند. در زبان لاتين bi به معناي دو است. يك بيليون دو دسته سه تايي صفر بيشتر از هزار دارد.
يك تريليون Trillion 1,000,000,000,000
در زبان لاتين tri به معناي سه است. يك تريليون سه دسته سه تايي صفر بيشتر از هزار دارد.
و به همين ترتيب :
كادريليون Quadrillion , quad = 4
كنتيليون Quintillion , quint = 5
سيكستيليون Sixtillion , six = 6
سپتيليون Septillion , sept = 7
اَُكتيليون Octillion , oct = 8
نونيليون Nonillion , non = 9
دسيليون Decillion , dec = 10
این نمونه رو هم ببینید،
کسی نتوانست تبدیل عدد اعشاری به حروف را بدست بیاورد .
با سلام به دوستان جدید و قدیم
در طی این 5 سال گذشته کمتر فرصت شد که به سایت سر بزنم. چند روز پیش که این کد رو دیدم تصمیم گرفتم برای نیاز خودم هم که شده قسمت اعشار رو بهش اضافه کنم. البته سورس دیگری نیز از دوست خوبم آقای بابک بخشایش هست که اونم با کمی تغییر این قابلیت رو دارد.
کد زیر را می توان بهینه تر نیز کرد. مثلا کنترل عدم وجود دو علامت "." برای ارقام اعشاری
انشالله که مفید واقع شود
Public Class NumToStr1
Private Class Numbers
Public intNum As Integer
Public strNum As String
Sub New(ByVal int As Integer, ByVal str As String)
intNum = int
strNum = str
End Sub
End Class
Private listOFNumbers() As Numbers = {New Numbers(0, "صفر"), New Numbers(1, "يك"), New Numbers(2, "دو"), New Numbers(3, "سه"), New Numbers(4, "چهار"), New Numbers(5, "پنج"), New Numbers(6, "شش") _
, New Numbers(7, "هفت"), New Numbers(8, "هشت"), New Numbers(9, "نه"), New Numbers(10, "ده"), New Numbers(11, "يازده"), New Numbers(12, "دوازده") _
, New Numbers(13, "سيزده"), New Numbers(14, "چهارده"), New Numbers(15, "پانزده"), New Numbers(16, "شانزده"), New Numbers(17, "هفده"), New Numbers(18, "هجده") _
, New Numbers(19, "نوزده"), New Numbers(20, "بيست"), New Numbers(30, "سي"), New Numbers(40, "چهل"), New Numbers(50, "پنجاه"), New Numbers(60, "شصت"), New Numbers(70, "هفتاد") _
, New Numbers(80, "هشتاد"), New Numbers(90, "نود"), New Numbers(100, "یکصد"), New Numbers(200, "دويست"), New Numbers(300, "سيصد"), New Numbers(400, "چهارصد"), New Numbers(500, "پانصد") _
, New Numbers(600, "ششصد"), New Numbers(700, "هفتصد"), New Numbers(800, "هشتصد"), New Numbers(900, "نهصد")}
Private listOfDesimals() As String = {" دهم", " صدم", " هزارم"}
Dim isdes As Boolean = False
Public Function GetStringOfNumber(ByVal num) As String
Dim dot As Int32 = 0
Dim des As Int32 = 0
Dim fix As Int64 = 0
If num.ToString.Contains(".") And num.ToString.EndsWith(".") = False Then
isdes = True
dot = num.ToString.IndexOf(".") + 1
des = Convert.ToInt32(num.ToString.Substring(dot))
fix = Convert.ToInt64(num.ToString.Substring(0, dot - 1))
Else
fix = num
End If
If fix.ToString.Length > 15 Then
Return "عدد وارد شده نامتعارف می باشد"
Exit Function
End If
Dim Part() As String = Split(FormatNumber(fix, 0), ",")
Select Case Part.Length
Case Is = 1 'And Not CInt(Part(0)) = 0
Return GetThree(Part(0)) & If(des, " ممیز " & GetThree(des) & searchdes(des), Nothing)
Case Is = 2
If CInt(Part(1)) = 0 Then
Return GetThree(Part(0)) & " هزار " & If(des, " ممیز " & GetThree(des) & searchdes(des), Nothing) : Else
Return GetThree(Part(0)) & " هزار و " & GetThree(Part(1)) & If(des, " ممیز " & GetThree(des) & searchdes(des), Nothing)
End If
Case Is = 3
If CInt(Part(1)) + CInt(Part(2)) = 0 Then
Return GetThree(Part(0)) & " ميليون " & If(des, " ممیز " & GetThree(des) & searchdes(des), Nothing) : Else
Return GetThree(Part(0)) & " ميليون و " & GetStringOfNumber(Part(1) & Part(2)) & If(des, " ممیز " & GetThree(des) & searchdes(des), Nothing)
End If
Case Is = 4
If CInt(Part(1)) + CInt(Part(2)) + CInt(Part(3)) = 0 Then
Return GetThree(Part(0)) & " ميليارد " & If(des, " ممیز " & GetThree(des) & searchdes(des), Nothing) : Else
Return GetThree(Part(0)) & " ميليارد و " & GetStringOfNumber(Part(1) & Part(2) & Part(3)) & If(des, " ممیز " & GetThree(des) & searchdes(des), Nothing)
End If
Case Is = 5
If CInt(Part(1)) + CInt(Part(2)) + CInt(Part(3)) + CInt(Part(4)) = 0 Then
Return GetThree(Part(0)) & " هزار " & If(des, " ممیز " & GetThree(des) & searchdes(des), Nothing) : Else
Return GetThree(Part(0)) & " هزار و " & GetStringOfNumber(Part(1) & Part(2) & Part(3) & Part(4)) & If(des, " ممیز " & GetThree(des) & searchdes(des), Nothing)
End If
End Select
Return Nothing
End Function
Private Function GetThree(ByVal Num As Integer) As String
Select Case Num
Case Is < 10
Return Search(Num)
Case Is < 100
If Num <= 20 Or (Num Mod 10) = 0 Then
Return Search(Num) : Else
Return Search((Math.Floor(Num / 10)) * 10) & " و " & Search(Num - ((Math.Floor(Num / 10)) * 10))
End If
Case Is < 1000
If Num Mod 100 = 0 Then
Return Search(Num) : Else
Return Search((Math.Floor(Num / 100)) * 100) & " و " & GetThree(Num - ((Math.Floor(Num / 100)) * 100))
End If
End Select
Return Nothing
End Function
Private Function Search(ByVal Num As Integer) As String
For i As Integer = 0 To listOFNumbers.Length - 1
If listOFNumbers(i).intNum = Num Then Return listOFNumbers(i).strNum
Next
Return Nothing
End Function
Private Function searchdes(ByVal dess As Integer) As String
Select Case dess
Case Is < 10
Return listOfDesimals(0)
Case Is < 100
Return listOfDesimals(1)
Case Is < 1000
Return listOfDesimals(2)
End Select
Return Nothing
End Function
End Class
خط 22 تا 34 را با کدهای زیر عوض کنید
If num.ToString.Length > 15 Or num.ToString.EndsWith(".") = TrueOr num.ToString.StartsWith(".") = TrueThen
Return"عدد وارد شده نامتعارف می باشد"
Exit Function
EndIf
If num Mod 1 <> 1 Then
isdec = True
dot = num.ToString.IndexOf(".") + 1
dec = Convert.ToInt32(num.ToString.Substring(dot))
fix = Math.Truncate(Convert.ToDecimal(num))
Else
fix = Convert.ToInt64(num)
EndIf