Results 1 to 6 of 6

Thread: Creating A CLR Function (SQL SERVER 2005)

Threaded View

  1. #2

    Thread Starter
    Superbly Moderated NeedSomeAnswers's Avatar
    Join Date
    Jun 2002
    Location
    Manchester uk
    Posts
    2,657

    Re: Creating A CLR Function (SQL SERVER 2005)

    Your final code should now look like this –

    vb Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Data;
    4. using System.Data.SqlClient;
    5. using System.Data.SqlTypes;
    6. using Microsoft.SqlServer.Server;
    7. using System.Text;
    8.  
    9. public partial class UserDefinedFunctions
    10. {
    11.     [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
    12.     public static String convertNumericToWords(double numb)
    13.     {
    14.  
    15.         String num = numb.ToString();
    16.  
    17.         return changeToWords(num, false);
    18.  
    19.     }
    20.  
    21.     public static String convertCurrencyToWords(double numb)
    22.     {
    23.  
    24.         return changeToWords(numb.ToString(), true);
    25.  
    26.     }
    27.  
    28.     private static String changeToWords(String numb, bool isCurrency)
    29.     {
    30.  
    31.         String val = "", wholeNo = numb, points = "", andStr = "", pointStr = "";
    32.  
    33.         String endStr = (isCurrency) ? ("Only") : ("");
    34.  
    35.         try
    36.         {
    37.  
    38.             int decimalPlace = numb.IndexOf(".");
    39.  
    40.             if (decimalPlace > 0)
    41.             {
    42.  
    43.                 wholeNo = numb.Substring(0, decimalPlace);
    44.  
    45.                 points = numb.Substring(decimalPlace + 1);
    46.  
    47.                 if (Convert.ToInt32(points) > 0)
    48.                 {
    49.  
    50.                     andStr = (isCurrency) ? ("Pounds and") : ("point");// just to separate whole numbers from points/pence
    51.  
    52.                     endStr = (isCurrency) ? ("Pence " + endStr) : ("");
    53.  
    54.                     if (isCurrency == true)
    55.                     {
    56.                         pointStr = translatePence(points);
    57.                     }
    58.                     else
    59.                     {
    60.                         pointStr = translatePoints(points);
    61.                     }
    62.  
    63.                 }
    64.  
    65.             }
    66.  
    67.             val = String.Format("{0} {1}{2} {3}", translateWholeNumber(wholeNo).Trim(), andStr, pointStr, endStr);
    68.  
    69.         }
    70.  
    71.         catch
    72.         {
    73.  
    74.             ;
    75.         }
    76.  
    77.         return val;
    78.  
    79.     }
    80.  
    81.     private static String translateWholeNumber(String number)
    82.     {
    83.  
    84.         string word = "";
    85.  
    86.         try
    87.         {
    88.  
    89.             bool beginsZero = false;//tests for 0XX
    90.  
    91.             bool isDone = false;//test if already translated
    92.  
    93.             double dblAmt = (Convert.ToDouble(number));
    94.  
    95.             //if ((dblAmt > 0) && number.StartsWith("0"))
    96.  
    97.             if (dblAmt > 0)
    98.             {//test for zero or digit zero in a nuemric
    99.  
    100.                 beginsZero = number.StartsWith("0");
    101.  
    102.                 int numDigits = number.Length;
    103.  
    104.                 int pos = 0;//store digit grouping
    105.  
    106.                 String place = "";//digit grouping name:hundres,thousand,etc...
    107.  
    108.                 switch (numDigits)
    109.                 {
    110.  
    111.                     case 1://ones' range
    112.  
    113.                         word = ones(number);
    114.  
    115.                         isDone = true;
    116.  
    117.                         break;
    118.  
    119.                     case 2://tens' range
    120.  
    121.                         word = tens(number);
    122.  
    123.                         isDone = true;
    124.  
    125.                         break;
    126.  
    127.                     case 3://hundreds' range
    128.  
    129.                         pos = (numDigits % 3) + 1;
    130.  
    131.                         place = " Hundred ";
    132.  
    133.                         break;
    134.  
    135.                     case 4://thousands' range
    136.  
    137.                     case 5:
    138.  
    139.                     case 6:
    140.  
    141.                         pos = (numDigits % 4) + 1;
    142.  
    143.                         place = " Thousand ";
    144.  
    145.                         break;
    146.  
    147.                     case 7://millions' range
    148.  
    149.                     case 8:
    150.  
    151.                     case 9:
    152.  
    153.                         pos = (numDigits % 7) + 1;
    154.  
    155.                         place = " Million ";
    156.  
    157.                         break;
    158.  
    159.                     case 10://Billions's range
    160.  
    161.                         pos = (numDigits % 10) + 1;
    162.  
    163.                         place = " Billion ";
    164.  
    165.                         break;
    166.  
    167.                     //add extra case options for anything above Billion...
    168.  
    169.                     default:
    170.  
    171.                         isDone = true;
    172.  
    173.                         break;
    174.  
    175.                 }
    176.  
    177.                 if (!isDone)
    178.                 {//if transalation is not done, continue...(Recursion comes in now!!)
    179.  
    180.                     word = translateWholeNumber(number.Substring(0, pos)) + place + translateWholeNumber(number.Substring(pos));
    181.  
    182.                     //check for trailing zeros
    183.  
    184.                     if (beginsZero) word = " and " + word.Trim();
    185.  
    186.                 }
    187.  
    188.                 //ignore digit grouping names
    189.  
    190.                 if (word.Trim().Equals(place.Trim())) word = "";
    191.  
    192.             }
    193.  
    194.         }
    195.  
    196.         catch { ;}
    197.  
    198.         return word.Trim();
    199.  
    200.     }
    201.  
    202.     private static String tens(String digit)
    203.     {
    204.  
    205.         int digt = Convert.ToInt32(digit);
    206.  
    207.         String name = null;
    208.  
    209.         switch (digt)
    210.         {
    211.  
    212.             case 10:
    213.  
    214.                 name = "Ten";
    215.  
    216.                 break;
    217.  
    218.             case 11:
    219.  
    220.                 name = "Eleven";
    221.  
    222.                 break;
    223.  
    224.             case 12:
    225.  
    226.                 name = "Twelve";
    227.  
    228.                 break;
    229.  
    230.             case 13:
    231.  
    232.                 name = "Thirteen";
    233.  
    234.                 break;
    235.  
    236.             case 14:
    237.  
    238.                 name = "Fourteen";
    239.  
    240.                 break;
    241.  
    242.             case 15:
    243.  
    244.                 name = "Fifteen";
    245.  
    246.                 break;
    247.  
    248.             case 16:
    249.  
    250.                 name = "Sixteen";
    251.  
    252.                 break;
    253.  
    254.             case 17:
    255.  
    256.                 name = "Seventeen";
    257.  
    258.                 break;
    259.  
    260.             case 18:
    261.  
    262.                 name = "Eighteen";
    263.  
    264.                 break;
    265.  
    266.             case 19:
    267.  
    268.                 name = "Nineteen";
    269.  
    270.                 break;
    271.  
    272.             case 20:
    273.  
    274.                 name = "Twenty";
    275.  
    276.                 break;
    277.  
    278.             case 30:
    279.  
    280.                 name = "Thirty";
    281.  
    282.                 break;
    283.  
    284.             case 40:
    285.  
    286.                 name = "Fourty";
    287.  
    288.                 break;
    289.  
    290.             case 50:
    291.  
    292.                 name = "Fifty";
    293.  
    294.                 break;
    295.  
    296.             case 60:
    297.  
    298.                 name = "Sixty";
    299.  
    300.                 break;
    301.  
    302.             case 70:
    303.  
    304.                 name = "Seventy";
    305.  
    306.                 break;
    307.  
    308.             case 80:
    309.  
    310.                 name = "Eighty";
    311.  
    312.                 break;
    313.  
    314.             case 90:
    315.  
    316.                 name = "Ninety";
    317.  
    318.                 break;
    319.  
    320.             default:
    321.  
    322.                 if (digt > 0)
    323.                 {
    324.  
    325.                     name = tens(digit.Substring(0, 1) + "0") + " " + ones(digit.Substring(1));
    326.  
    327.                 }
    328.  
    329.                 break;
    330.  
    331.         }
    332.  
    333.         return name;
    334.  
    335.     }
    336.  
    337.     private static String ones(String digit)
    338.     {
    339.  
    340.         int digt = Convert.ToInt32(digit);
    341.  
    342.         String name = "";
    343.  
    344.         switch (digt)
    345.         {
    346.  
    347.             case 1:
    348.  
    349.                 name = "One";
    350.  
    351.                 break;
    352.  
    353.             case 2:
    354.  
    355.                 name = "Two";
    356.  
    357.                 break;
    358.  
    359.             case 3:
    360.  
    361.                 name = "Three";
    362.  
    363.                 break;
    364.  
    365.             case 4:
    366.  
    367.                 name = "Four";
    368.  
    369.                 break;
    370.  
    371.             case 5:
    372.  
    373.                 name = "Five";
    374.  
    375.                 break;
    376.  
    377.             case 6:
    378.  
    379.                 name = "Six";
    380.  
    381.                 break;
    382.  
    383.             case 7:
    384.  
    385.                 name = "Seven";
    386.  
    387.                 break;
    388.  
    389.             case 8:
    390.  
    391.                 name = "Eight";
    392.  
    393.                 break;
    394.  
    395.             case 9:
    396.  
    397.                 name = "Nine";
    398.  
    399.                 break;
    400.  
    401.         }
    402.  
    403.         return name;
    404.  
    405.     }
    406.  
    407.     private static String translatePence(String Pence)
    408.     {
    409.         String cts = "", digit = "", engOne = "";
    410.         int i = 0;
    411.         char[] delimiterChars = { '.' };
    412.  
    413.             digit = Pence[i].ToString();
    414.  
    415.             if (digit.Equals("0"))
    416.             {
    417.                 engOne = "Zero";
    418.             }
    419.             else
    420.             {
    421.                 if (Pence.Length == 1)
    422.                 {
    423.                     engOne = ones(digit);
    424.                 }
    425.                 else if (Pence.Length == 2)
    426.                 {
    427.                     engOne = tens(Pence);
    428.                 }
    429.                 else
    430.                 {
    431.                     Pence = "0." + Pence;
    432.                     digit = Convert.ToString(Math.Round(Convert.ToDouble(Pence), 2));
    433.                     String[] words = digit.Split(delimiterChars);
    434.                     engOne = tens(words[1]);
    435.                 }
    436.             }
    437.             cts += " " + engOne;
    438.             return cts;
    439.         }
    440.  
    441.     private static String translatePoints(String Points)
    442.     {
    443.  
    444.         String cts = "", digit = "", engOne = "";
    445.  
    446.         for (int i = 0; i < Points.Length; i++)
    447.         {
    448.  
    449.             digit = Points[i].ToString();
    450.  
    451.             if (digit.Equals("0"))
    452.             {
    453.  
    454.                 engOne = "Zero";
    455.  
    456.             }
    457.  
    458.             else
    459.             {
    460.  
    461.                 engOne = ones(digit);
    462.  
    463.             }
    464.  
    465.             cts += " " + engOne;
    466.  
    467.         }
    468.  
    469.         return cts;
    470.     }
    471. }

    Build your project, navigate to the created .dll and grab the path.

    Edited - the convert to Currency did not deal with decimal places very well, this has now been fixed to work properly for 2 decimal places. It will round any decimal number over 2 digits.
    e.g 123.456 = 123.46
    Last edited by NeedSomeAnswers; Feb 19th, 2009 at 08:41 AM.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width