Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Function ολογραφως σε mssql

Îåêßíçóå áðü ôï ìÝëïò kdaras. Τελευταία δημοσίευση από το μέλος kdaras στις 10-02-2016, 08:23. Υπάρχουν 0 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  10-02-2016, 08:23 77595

    Function ολογραφως σε mssql

    Visit posters website

    Απάντηση με παράθεση Edit/Delete this post Αναφορά Μηνύματος Mark this post and the followings unread

    Γείας εχώ μετατρεψεί μια συναρτηση μετατροπής αριθμού σε ολογράφος που βρήκα στο νετ απο αγγλικά σε ελληνικά .
    Tο θέμα μου είναι οταν π.χ εχω 3000 να λέει τρεις και οχι τρια το αντιστοιχό και για το
    τέσσερα .Επίσης οταν έχω 1000 να λέει χίλια και όχι ενα χιλίαδες.
    Εχει κάποιος καποια παρόμοια συνάρτηση ή μπορεί να βοηθήσει με την υπάρχουσα;
    Ευχαριστώ

    ALTER FUNCTION [dbo].[Currency_ToWords] (
    @Input Numeric (38, 3) -- Input number with as many as 18 digits

    ) RETURNS VARCHAR(8000)

    /*
    * Converts a integer number as large as 34 digits into the
    * equivalent words. The first letter is capitalized.
    *
    * Attribution: Based on NumberToWords by Srinivas Sampath
    * as revised by Nick Barclay
    *
    * Example:
    select dbo.udf_Num_ToWords (1234567890) + CHAR(10)
    + dbo.udf_Num_ToWords (0) + CHAR(10)
    + dbo.udf_Num_ToWords (123) + CHAR(10)
    select dbo.udf_Num_ToWords(76543210987654321098765432109876543210)

    DECLARE @i numeric (38,0)
    SET @i = 0
    WHILE @I <= 1000 BEGIN
    PRINT convert (char(5), @i)
    + convert(varchar(255), dbo.udf_Num_ToWords(@i))
    SET @I = @i + 1
    END
    *
    * Published as the T-SQL UDF of the Week Vol 2 #9 2/17/03
    ****************************************************************/
    AS BEGIN
    Declare @Number INT
    set @Number = @Input
    Declare @Cents as int
    set @Cents = 100*Convert(money,(@Input - convert(Numeric(38,3),@Number)))
    DECLARE @inputNumber VARCHAR(3
    DECLARE @NumbersTable TABLE (number CHAR(2), word VARCHAR(50))
    DECLARE @NumbersTable1 TABLE (number CHAR(2), word VARCHAR(50))
    DECLARE @outputString VARCHAR(8000)
    DECLARE @length INT
    DECLARE @counter INT
    DECLARE @loops INT
    DECLARE @position INT
    DECLARE @chunk CHAR(3) -- for chunks of 3 numbers
    DECLARE @tensones CHAR(2)
    declare @lepta char(200)
    DECLARE @hundreds CHAR(1)
    DECLARE @tens CHAR(1)
    DECLARE @ones CHAR(1)
    DECLARE @xilia CHAR(15)
    declare @cnt int

    IF @Number = 0 Return 'ΜΗΔΕΝ'

    -- initialize the variables
    SELECT @inputNumber = CONVERT(varchar(3, @Number)
    , @outputString = ''
    , @counter = 1
    SELECT @length = LEN(@inputNumber)
    , @position = LEN(@inputNumber) - 2
    , @loops = LEN(@inputNumber)/3

    -- make sure there is an extra loop added for the remaining numbers

    set @cnt=0
    IF LEN(@inputNumber) % 3 <> 0 SET @loops = @loops + 1

    --if charindex('3',right(@inputNumber,3)) > 0 set @xilia='τρια' else
    --set @xilia='τρεις'

    --IF charindex('3',right(@inputNumber,3)) >=1 and len(@inputnumber)<=3 set @xilia='τρια'
    --else iF len(@inputnumber-@cnt)>3 and charindex('3',left(@inputNumber,3)) >=1 set @xilia='τρεις'
    --else set @xilia='τρια'
    --set @cnt=@loops



    -- insert data for the numbers and words
    INSERT INTO @NumbersTable1 SELECT '00', ''
    UNION ALL SELECT '01', 'ενα' UNION ALL SELECT '02', 'Δυο'
    UNION ALL SELECT '03', 'τρεις' UNION ALL SELECT '04', 'Τεσσερις'
    UNION ALL SELECT '05', 'Πεντε' UNION ALL SELECT '06', 'εξι'
    UNION ALL SELECT '07', 'Επτα' UNION ALL SELECT '08', 'Οκτω'
    UNION ALL SELECT '09', 'Εννεα' UNION ALL SELECT '10', 'Δεκα'
    UNION ALL SELECT '11', 'ενδεκα' UNION ALL SELECT '12', 'Δωδεκα'
    UNION ALL SELECT '13', 'Δεκατρεις' UNION ALL SELECT '14', 'Δεκατεσσερις'
    UNION ALL SELECT '15', 'Δεκαπεντε' UNION ALL SELECT '16', 'Δεκαεξι'
    UNION ALL SELECT '17', 'Δεκαεφτα' UNION ALL SELECT '18', 'Δεκαοχτω'
    UNION ALL SELECT '19', 'Δεκαεννιά' UNION ALL SELECT '20', 'Εικοσι'
    UNION ALL SELECT '30', 'Τριαντα' UNION ALL SELECT '40', 'Σαραντα'
    UNION ALL SELECT '50', 'Πενηντα' UNION ALL SELECT '60', 'Εξηντα'
    UNION ALL SELECT '70', 'Εβδομηντα' UNION ALL SELECT '80', 'Ογδοντα'
    UNION ALL SELECT '90', 'Ενενηντα'


    INSERT INTO @NumbersTable SELECT '00', ''
    UNION ALL SELECT '01', 'ενα' UNION ALL SELECT '02', 'Δυο'
    UNION ALL SELECT '03','τρια' UNION ALL SELECT '04', 'Τεσσερα'
    UNION ALL SELECT '05', 'Πεντε' UNION ALL SELECT '06', 'εξι'
    UNION ALL SELECT '07', 'Επτα' UNION ALL SELECT '08', 'Οκτω'
    UNION ALL SELECT '09', 'Εννεα' UNION ALL SELECT '10', 'Δεκα'
    UNION ALL SELECT '11', 'ενδεκα' UNION ALL SELECT '12', 'Δωδεκα'
    UNION ALL SELECT '13', 'Δεκατρια' UNION ALL SELECT '14', 'Δεκατεσσερα'
    UNION ALL SELECT '15', 'Δεκαπεντε' UNION ALL SELECT '16', 'Δεκαεξι'
    UNION ALL SELECT '17', 'Δεκαεφτα' UNION ALL SELECT '18', 'Δεκαοχτω'
    UNION ALL SELECT '19', 'Δεκαεννιά' UNION ALL SELECT '20', 'Εικοσι'
    UNION ALL SELECT '30', 'Τριαντα' UNION ALL SELECT '40', 'Σαραντα'
    UNION ALL SELECT '50', 'Πενηντα' UNION ALL SELECT '60', 'Εξηντα'
    UNION ALL SELECT '70', 'Εβδομηντα' UNION ALL SELECT '80', 'Ογδοντα'
    UNION ALL SELECT '90', 'Ενενηντα'


    WHILE @counter <= @loops BEGIN
    iF len(@inputnumber-@cnt)>3 and charindex('3',right(@inputNumber,3)) >=1
    begin
    set @cnt=@cnt+1

    IF @chunk <> '000' BEGIN
    SELECT @tensones = SUBSTRING(@chunk, 2, 2)
    , @hundreds = SUBSTRING(@chunk, 1, 1)
    , @tens = SUBSTRING(@chunk, 2, 1)
    , @ones = SUBSTRING(@chunk, 3, 1)

    -- If twenty or less, use the word directly from @NumbersTable
    IF CONVERT(INT, @tensones) <= 20 OR @Ones='0' BEGIN
    SET @outputString = (SELECT word
    FROM @NumbersTable
    WHERE @tensones = number)
    + CASE @counter WHEN 1 THEN '' -- No name
    WHEN 2 THEN ' χιλιαδες ' WHEN 3 THEN ' ΕΚΑΤΟΜΜΥΡΙΑ '
    WHEN 4 THEN ' billion ' WHEN 5 THEN ' trillion '
    WHEN 6 THEN ' quadrillion ' WHEN 7 THEN ' quintillion '
    WHEN 8 THEN ' sextillion ' WHEN 9 THEN ' septillion '
    WHEN 10 THEN ' octillion ' WHEN 11 THEN ' nonillion '
    WHEN 12 THEN ' decillion ' WHEN 13 THEN ' undecillion '
    ELSE '' END

    + @outputString
    end
    END
    END
    -- get chunks of 3 numbers at a time, padded with leading zeros
    SET @chunk = RIGHT('000' + SUBSTRING(@inputNumber, @position, 3), 3)

    IF @chunk <> '000' BEGIN
    SELECT @tensones = SUBSTRING(@chunk, 2, 2)
    , @hundreds = SUBSTRING(@chunk, 1, 1)
    , @tens = SUBSTRING(@chunk, 2, 1)
    , @ones = SUBSTRING(@chunk, 3, 1)

    -- If twenty or less, use the word directly from @NumbersTable
    IF CONVERT(INT, @tensones) <= 20 OR @Ones='0' BEGIN

    SET @outputString = (SELECT word
    FROM @NumbersTable
    WHERE @tensones = number)
    + CASE @counter WHEN 1 THEN '' -- No name
    WHEN 2 THEN ' χιλιαδες ' WHEN 3 THEN ' ΕΚΑΤΟΜΜΥΡΙΑ '
    WHEN 4 THEN ' billion ' WHEN 5 THEN ' trillion '
    WHEN 6 THEN ' quadrillion ' WHEN 7 THEN ' quintillion '
    WHEN 8 THEN ' sextillion ' WHEN 9 THEN ' septillion '
    WHEN 10 THEN ' octillion ' WHEN 11 THEN ' nonillion '
    WHEN 12 THEN ' decillion ' WHEN 13 THEN ' undecillion '
    ELSE '' END

    + @outputString

    END
    ELSE BEGIN -- break down the ones and the tens separately

    SET @outputString = ' '
    + (SELECT word
    FROM @NumbersTable1
    WHERE @tens + '0' = number)
    + ''
    + (SELECT word
    FROM @NumbersTable
    WHERE '0'+ @ones = number)
    + CASE @counter WHEN 1 THEN '' -- No name
    WHEN 2 THEN ' ΧΙΛΙΑΔΕΣ ' WHEN 3 THEN ' ΕΚΑΤΟΜΜΥΡΙΑ '
    WHEN 4 THEN ' billion ' WHEN 5 THEN ' trillion '
    WHEN 6 THEN ' quadrillion ' WHEN 7 THEN ' quintillion '
    WHEN 8 THEN ' sextillion ' WHEN 9 THEN ' septillion '
    WHEN 10 THEN ' octillion ' WHEN 11 THEN ' nonillion '
    WHEN 12 THEN ' decillion ' WHEN 13 THEN ' undecillion '
    ELSE '' END
    + @outputString
    END

    -- now get the hundreds
    IF @hundreds <> '0' BEGIN
    SET @outputString = CASE @hundreds
    WHEN 1 THEN 'ΕΚΑΤΟΝ' + @outputString
    WHEN 2 THEN 'ΔΙΑΚΟΣΙΑ' + @outputString
    WHEN 3 THEN 'ΤΡΙΑΚΟΣΙΑ' + @outputString
    WHEN 4 THEN 'ΤΕΤΡΑΚΟΣΙΑ' + @outputString
    WHEN 5 THEN 'ΠΕΝΤΑΚΟΣΙΑ' + @outputString
    WHEN 6 THEN 'ΕΞΑΚΟΣΙΑ' + @outputString
    WHEN 7 THEN 'ΕΠΤΑΚΟΣΙΑ' + @outputString
    WHEN 8 THEN 'ΟΚΤΑΚΟΣΙΑ' + @outputString
    WHEN 9 THEN 'εννιαΚΟΣΙΑ' + @outputString
    ELSE @hundreds +' '+ @outputString END
    END
    END

    SELECT @counter = @counter + 1
    , @position = @position - 3

    END

    -- Remove any double spaces
    SET @outputString = LTRIM(RTRIM(REPLACE(@outputString, ' ', ' ')))
    SET @outputstring = UPPER(LEFT(@outputstring, 1)) + SUBSTRING(@outputstring, 2, 8000)
    set @lepta=convert(Varchar(200),@Cents )

    set @lepta=CASE @lepta
    WHEN 1 THEN ' Ενα ' +' '+'ΛΕΠΤΑ'
    WHEN 2 THEN ' ΔΥο ' +' '+'ΛΕΠΤΑ'
    WHEN 3 THEN ' ΤρΙα ' +' '+'ΛΕΠΤΑ'
    WHEN 4 THEN ' ΤΕσσερα ' +' '+'ΛΕΠΤΑ'
    WHEN 5 THEN ' ΠΕντε ' +' '+'ΛΕΠΤΑ'
    WHEN 6 THEN ' Εξι ' +' '+'ΛΕΠΤΑ'
    WHEN 7 THEN ' ΕπτΑ ' +' '+'ΛΕΠΤΑ'
    WHEN 8 THEN ' ΟκτΩ ' +' '+'ΛΕΠΤΑ'
    WHEN 9 THEN ' ΕννΕα ' +' '+'ΛΕΠΤΑ'
    WHEN 10 THEN ' ΔΕκα ' +' '+'ΛΕΠΤΑ'
    WHEN 11 THEN ' Εντεκα ' +' '+'ΛΕΠΤΑ'
    WHEN 12 THEN ' ΔΩδεκα ' +' '+'ΛΕΠΤΑ'
    WHEN 13 THEN ' ΔεκαΤΡΙΑ ' +' '+'ΛΕΠΤΑ'
    WHEN 14 THEN ' Δεκατεσσερα ' +' '+'ΛΕΠΤΑ'
    WHEN 15 THEN ' Δεκαπεντε ' +' '+'ΛΕΠΤΑ'
    WHEN 16 THEN ' Δεκαεξι ' +' '+'ΛΕΠΤΑ'
    WHEN 17 THEN ' Δεκαεπτα ' +' '+'ΛΕΠΤΑ'
    WHEN 18 THEN ' Δεκαοκτω ' +' '+'ΛΕΠΤΑ'
    WHEN 19 THEN ' Δεκαεννεα ' +' '+'ΛΕΠΤΑ'
    WHEN 20 THEN ' Εικοσι ' +' '+'ΛΕΠΤΑ'
    WHEN 21 THEN ' Εικοσι ενα ' +' '+'ΛΕΠΤΑ'
    WHEN 22 THEN ' Εικοσι Δυο ' +' '+'ΛΕΠΤΑ'
    WHEN 23 THEN ' Εικοσι ΤΡΙΑ ' +' '+'ΛΕΠΤΑ'
    WHEN 24 THEN ' Εικοσι τεσσερα ' +' '+'ΛΕΠΤΑ'
    WHEN 25 THEN ' Εικοσι πεντε ' +' '+'ΛΕΠΤΑ'
    WHEN 26 THEN ' Εικοσι εξι ' +' '+'ΛΕΠΤΑ'
    WHEN 27 THEN ' Εικοσι επτα ' +' '+'ΛΕΠΤΑ'
    WHEN 28 THEN ' Εικοσι οκτω ' +' '+'ΛΕΠΤΑ'
    WHEN 29 THEN ' Εικοσι εννεα ' +' '+'ΛΕΠΤΑ'
    WHEN 30 THEN ' Τριαντα ' +' '+'ΛΕΠΤΑ'
    WHEN 31 THEN ' Τριαντα ενα ' +' '+'ΛΕΠΤΑ'
    WHEN 32 THEN ' Τριαντα Δυο ' +' '+'ΛΕΠΤΑ'
    WHEN 33 THEN ' Τριαντα ΤΡΙΑ ' +' '+'ΛΕΠΤΑ'
    WHEN 34 THEN ' Τριαντα τεσσερα ' +' '+'ΛΕΠΤΑ'
    WHEN 35 THEN ' Τριαντα πεντε ' +' '+'ΛΕΠΤΑ'
    WHEN 36 THEN ' Τριαντα εξι ' +' '+'ΛΕΠΤΑ'
    WHEN 37 THEN ' Τριαντα επτα ' +' '+'ΛΕΠΤΑ'
    WHEN 38 THEN ' Τριαντα οκτω ' +' '+'ΛΕΠΤΑ'
    WHEN 39 THEN ' Τριαντα εννεα ' +' '+'ΛΕΠΤΑ'
    WHEN 40 THEN ' Σαραντα ' +' '+'ΛΕΠΤΑ'
    WHEN 41 THEN ' Σαραντα ενα ' +' '+'ΛΕΠΤΑ'
    WHEN 42 THEN ' Σαραντα Δυο ' +' '+'ΛΕΠΤΑ'
    WHEN 43 THEN ' Σαραντα ΤΡΙΑ ' +' '+'ΛΕΠΤΑ'
    WHEN 44 THEN ' Σαραντα τεσσερα ' +' '+'ΛΕΠΤΑ'
    WHEN 45 THEN ' Σαραντα πεντε ' +' '+'ΛΕΠΤΑ'
    WHEN 46 THEN ' Σαραντα εξι ' +' '+'ΛΕΠΤΑ'
    WHEN 47 THEN ' Σαραντα επτα ' +' '+'ΛΕΠΤΑ'
    WHEN 48 THEN ' Σαραντα οκτω ' +' '+'ΛΕΠΤΑ'
    WHEN 49 THEN ' Σαραντα εννεα ' +' '+'ΛΕΠΤΑ'
    WHEN 50 THEN ' Πενηντα ' +' '+'ΛΕΠΤΑ'
    WHEN 51 THEN ' Πενηντα ενα ' +' '+'ΛΕΠΤΑ'
    WHEN 52 THEN ' Πενηντα Δυο ' +' '+'ΛΕΠΤΑ'
    WHEN 53 THEN ' Πενηντα ΤΡΙΑ ' +' '+'ΛΕΠΤΑ'
    WHEN 54 THEN ' Πενηντα τεσσερα ' +' '+'ΛΕΠΤΑ'
    WHEN 55 THEN ' Πενηντα πεντε ' +' '+'ΛΕΠΤΑ'
    WHEN 56 THEN ' Πενηντα εξι ' +' '+'ΛΕΠΤΑ'
    WHEN 57 THEN ' Πενηντα επτα ' +' '+'ΛΕΠΤΑ'
    WHEN 58 THEN ' Πενηντα οκτω ' +' '+'ΛΕΠΤΑ'
    WHEN 59 THEN ' Πενηντα εννεα ' +' '+'ΛΕΠΤΑ'
    WHEN 60 THEN ' Εξηντα ' +' '+'ΛΕΠΤΑ'
    WHEN 61 THEN ' Εξηντα ενα ' +' '+'ΛΕΠΤΑ'
    WHEN 62 THEN ' Εξηντα Δυο ' +' '+'ΛΕΠΤΑ'
    WHEN 63 THEN ' Εξηντα ΤΡΙΑ ' +' '+'ΛΕΠΤΑ'
    WHEN 64 THEN ' Εξηντα τεσσερα ' +' '+'ΛΕΠΤΑ'
    WHEN 65 THEN ' Εξηντα πεντε ' +' '+'ΛΕΠΤΑ'
    WHEN 66 THEN ' Εξηντα εξι ' +' '+'ΛΕΠΤΑ'
    WHEN 67 THEN ' Εξηντα επτα ' +' '+'ΛΕΠΤΑ'
    WHEN 68 THEN ' Εξηντα οκτω ' +' '+'ΛΕΠΤΑ'
    WHEN 69 THEN ' Εξηντα εννεα ' +' '+'ΛΕΠΤΑ'
    WHEN 70 THEN ' Εβδομηντα ' +' '+'ΛΕΠΤΑ'
    WHEN 71 THEN ' Εβδομηντα ενα ' +' '+'ΛΕΠΤΑ'
    WHEN 72 THEN ' Εβδομηντα Δυο ' +' '+'ΛΕΠΤΑ'
    WHEN 73 THEN ' Εβδομηντα ΤΡΙΑ ' +' '+'ΛΕΠΤΑ'
    WHEN 74 THEN ' Εβδομηντα τεσσερα ' +' '+'ΛΕΠΤΑ'
    WHEN 75 THEN ' Εβδομηντα πεντε ' +' '+'ΛΕΠΤΑ'
    WHEN 76 THEN ' Εβδομηντα εξι ' +' '+'ΛΕΠΤΑ'
    WHEN 77 THEN ' Εβδομηντα επτα ' +' '+'ΛΕΠΤΑ'
    WHEN 78 THEN ' Εβδομηντα οκτω ' +' '+'ΛΕΠΤΑ'
    WHEN 79 THEN ' Εβδομηντα εννεα ' +' '+'ΛΕΠΤΑ'
    WHEN 80 THEN ' Ογδοντα ' +' '+'ΛΕΠΤΑ'
    WHEN 81 THEN ' Ογδοντα ενα ' +' '+'ΛΕΠΤΑ'
    WHEN 82 THEN ' Ογδοντα Δυο ' +' '+'ΛΕΠΤΑ'
    WHEN 83 THEN ' Ογδοντα ΤΡΙΑ ' +' '+'ΛΕΠΤΑ'
    WHEN 84 THEN ' Ογδοντα τεσσερα ' +' '+'ΛΕΠΤΑ'
    WHEN 85 THEN ' Ογδοντα πεντε ' +' '+'ΛΕΠΤΑ'
    WHEN 86 THEN ' Ογδοντα εξι ' +' '+'ΛΕΠΤΑ'
    WHEN 87 THEN ' Ογδοντα επτα ' +' '+'ΛΕΠΤΑ'
    WHEN 88 THEN ' Ογδοντα οκτω ' +' '+'ΛΕΠΤΑ'
    WHEN 89 THEN ' Ογδοντα εννεα ' +' '+'ΛΕΠΤΑ'
    WHEN 90 THEN ' Ενενηντα ' +' '+'ΛΕΠΤΑ'
    WHEN 91 THEN ' Ενενηντα ενα ' +' '+'ΛΕΠΤΑ'
    WHEN 92 THEN ' Ενενηντα Δυο ' +' '+'ΛΕΠΤΑ'
    WHEN 93 THEN ' Ενενηντα ΤΡΙΑ ' +' '+'ΛΕΠΤΑ'
    WHEN 94 THEN ' Ενενηντα τεσσερα ' +' '+'ΛΕΠΤΑ'
    WHEN 95 THEN ' Ενενηντα πεντε ' +' '+'ΛΕΠΤΑ'
    WHEN 96 THEN ' Ενενηντα εξι ' +' '+'ΛΕΠΤΑ'
    WHEN 97 THEN ' Ενενηντα επτα ' +' '+'ΛΕΠΤΑ'
    WHEN 98 THEN ' Ενενηντα οκτω ' +' '+'ΛΕΠΤΑ'
    WHEN 99 THEN ' Ενενηντα εννεα ' +' '+'ΛΕΠΤΑ'

    ELSE @lepta END


    RETURN UPPER(@outputString) + ' ΕΥΡΩ KAI '+UPPER(@LEPTA) -- return the result
    END
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems