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

Γενικές συζητήσεις για SQL και SQL Servers (RDBMS)

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
kdaras
Δημοσιεύσεις: 2
Εγγραφή: 09 Φεβ 2016 09:05
Τοποθεσία: Σερρες
Επικοινωνία:

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

Δημοσίευση από kdaras » 09 Φεβ 2016 09:28

Γείας εχώ μετατρεψεί μια συναρτηση μετατροπής αριθμού σε ολογράφος που βρήκα στο νετ απο αγγλικά σε ελληνικά
το θέμα μου είναι οταν π.χ εχω 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(38)
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(38), @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

Απάντηση

Επιστροφή στο “Βάσεις Δεδομένων και SQL - γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες