הבלוג של גרי רשף

14/10/2010

מספרים במילים

Filed under: Uncategorized — תגיות: , — גרי רשף @ 21:50

הנה פרוצדורה רקורסיבית ההופכת מספרים – עד מיליון – למילים (נניח- 999 = תשע מאות תשעים ותשע):

Create Function F_Num2Text(@N Int,@ZN Bit=0) Returns Varchar(Max)

As

Begin

Return(Case

            When @N=1 And @ZN=1 Then 'אחד'

            When @N=2 And @ZN=1 Then 'שנים'

            When @N=3 And @ZN=1 Then 'שלושה'

            When @N=4 And @ZN=1 Then 'ארבעה'

            When @N=5 And @ZN=1 Then 'חמישה'

            When @N=6 And @ZN=1 Then 'שישה'

            When @N=7 And @ZN=1 Then 'שבעה'

            When @N=8 And @ZN=1 Then 'שמונה'

            When @N=9 And @ZN=1 Then 'תשעה'

            When @N=10 And @ZN=1 Then 'עשרה'

            When @N=11 And @ZN=1 Then 'אחד עשר'

            When @N=12 And @ZN=1 Then 'שנים עשר'

            When @N=13 And @ZN=1 Then 'שלושה עשר'

            When @N=14 And @ZN=1 Then 'ארבעה עשר'

            When @N=15 And @ZN=1 Then 'חמישה עשר'

            When @N=16 And @ZN=1 Then 'שישה עשר'

            When @N=17 And @ZN=1 Then 'שבעה עשר'

            When @N=18 And @ZN=1 Then 'שמונה עשר'

            When @N=19 And @ZN=1 Then 'תשעה עשר'

            When @N=1 Then 'אחת'

            When @N=2 Then 'שתיים'

            When @N=3 Then 'שלוש'

            When @N=4 Then 'ארבע'

            When @N=5 Then 'חמש'

            When @N=6 Then 'שש'

            When @N=7 Then 'שבע'

            When @N=8 Then 'שמונה'

            When @N=9 Then 'תשע'

            When @N=10 Then 'עשר'

            When @N=11 Then 'אחת עשרה'

            When @N=12 Then 'שתיים עשרה'

            When @N=13 Then 'שלוש עשרה'

            When @N=14 Then 'ארבע עשרה'

            When @N=15 Then 'חמש עשרה'

            When @N=16 Then 'שש עשרה'

            When @N=17 Then 'שבע עשרה'

            When @N=18 Then 'שמונה עשרה'

            When @N=19 Then 'תשע עשרה'

            When @N=20 Then 'עשרים'

            When @N=30 Then 'שלושים'

            When @N=40 Then 'ארבעים'

            When @N=50 Then 'חמישים'

            When @N=60 Then 'שישים'

            When @N=70 Then 'שבעים'

            When @N=80 Then 'שמונים'

            When @N=90 Then 'תשעים'

            When @N=100 Then 'מאה'

            When @N=200 Then 'מאתיים'

            When @N=1000 Then 'אלף'

            When @N=2000 Then 'אלפיים'

            When @N=3000 Then 'שלושת אלפים'

            When @N=4000 Then 'ארבעת אלפים'

            When @N=5000 Then 'חמשת אלפים'

            When @N=6000 Then 'ששת אלפים'

            When @N=7000 Then 'שבעת אלפים'

            When @N=8000 Then 'שמונת אלפים'

            When @N=9000 Then 'תשעת אלפים'

            When @N=10000 Then 'עשרת אלפים'

            Else Case When @N>1000 Then

                        Case When @N/1000<10 Then dbo.F_Num2Text(1000*(@N/1000),@ZN)+Case When @N%1000=0 Then '' When @N%1000<20 Then ' ו' Else ' ' End+dbo.F_Num2Text(@N%1000,@ZN)

                            Else dbo.F_Num2Text(@N/1000,1)+' אלף'+Case When @N%1000>0 Then Case When @N%1000<20 Then ' ו' Else '' End+Case When @N%1000<20 Then '' Else ' ' End+dbo.F_Num2Text(@N%1000,@ZN) Else '' End

                            End

                    When @N>=300 Then dbo.F_Num2Text(@N/100,0)+' מאות'+Case When @N%100=0 Then '' When @N%100 Between 1 And 20 Then ' ו' Else ' ' End+dbo.F_Num2Text(@N%100,@ZN)

                    When @N>100 Then dbo.F_Num2Text(100*(@N/100),@ZN)+' '+Case When @N%100=0 Then '' When @N%100 Between 1 And 20 Then ' ו' Else ' ' End+dbo.F_Num2Text(@N%100,@ZN)

                    When @N>0 Then dbo.F_Num2Text(10*(@N/10),@ZN)+Case When @N%10>0 Then ' ו' Else '' End+ dbo.F_Num2Text(@N%10,@ZN)

                    Else ''

                    End

            End);

End

Go

יש להפעיל אותה כך:

Select dbo.F_Num2Text(999,0);

את המספרים הבאים יש לכתוב במפורש: 1..19, 10..90 (מספרי העשרות), 100..200 (מספרי המאות), 1000..10000 (מספרי האלפים).

כל השאר מחושב רקורסיבית, למשל- 999: ה-900 הוא "תשע" + "מאות" (ורווח בינהם), ולהם משורשר הפלט הרקורסיבי של הפעלת הפונקציה על 99, שזה תשעים + ו' החיבור + הפעלה רקורסיבית נוספת שמחזירה תשע.

עבור האלפים יש לכתוב את שמות המספרים 1..19 בזכר (17000 = שבעה עשר אלף), ולשם כך הפונקציה מקבלת פרמטר נוסף – ZN@ – שמציין אם הפלט בזכר או בנקבה (ברירת מחדל = 0), ובמקרה הצורך ניתן "לעטוף" את הפונקציה שלי בפונקציה חיצונית בת פרמטר אחד שתפעיל את שלי עם 0=ZN@ (בהפעלה של פונקציות בניגוד לפרוצדורות- לא ניתן לוותר על ציון מפורש של פרמטרים שיש להם ברירת מחדל).

עם עוד קצת הסתבכות אפשר לחשב גם את המספרים 11..19, 20..90, 2000..10000; אבל לי זה נראה מיותר וציינתי אותם במפורש.

חוץ מזה קצת התעסקות עם רווחים ועם ו' החיבור במקומות המתאימים (אני כמעט בטוח שעברתי על כמה מחוקי האקדמיה בתום לב), ובאופן כללי היא עובדת בסדר גמור.

מודעות פרסומת

2 תגובות »

  1. […] End יצר הרע השיא אותי להשתמש ברקורסיה שכן ערכה הגימטרי של מחרוזת הוא ערך האות הראשונה ועוד הערך הרקורסיבי של זנבה, דא עקא ש-SQL Server מאפשר עד 32 רמות רקורסיה, וזה מגביל אותנו למחרוזות באורך של עד 32 תווים.. חבל! יתכן ויהיו בעיות אצל מי שה-Collation שלו אינו עברי או שהוא Case Sensitive (כלומר- מבחין בין אות רגילה לסופית), אבל ככלל הפונקציה תקינה. למה היא שימושית? למשל לחידה זו בה אנו נדרשים למצוא מספרים ששווים לערכם הגימטרי, ולשם כך נעשה שימוש בפונקציה מפוסט קודם שלי מספרים במילים: […]

    פינגבאק של גימטריה - גרי רשף — 19/01/2012 @ 19:36

  2. […] למה היא שימושית? למשל לחידה זו בה אנו נדרשים למצוא מספרים ששווים לערכם הגימטרי, ולשם כך נעשה שימוש בפונקציה מפוסט קודם שלי מספרים במילים: […]

    פינגבאק של גימטריה « הבלוג של גרי רשף — 15/10/2010 @ 09:19


RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: