Welcome to Sign in | Join | Help
in Search

functie care transforma numere in litere

Last post 08-01-2008, 9:13 AM by B_gd_n[ ]Sahlean. 11 replies.
Sort Posts: Previous Next
  •  07-30-2008, 11:05 AM 5395

    functie care transforma numere in litere

    salut,

    are cineva o functie care transforma numere in litere?

    123  - una suta douazeci si trei

    sau ceva de genul?

    alex.

  •  07-30-2008, 11:16 AM 5396 in reply to 5395

    Re: functie care transforma numere in litere

    Discuţie sqlserver.ro
  •  07-30-2008, 1:19 PM 5397 in reply to 5396

    Re: functie care transforma numere in litere

    multumesc mult.

    alex.

  •  07-30-2008, 4:10 PM 5398 in reply to 5396

    Re: functie care transforma numere in litere

    dar nu stie sa citeasca si dupa virgula :(

    alex.

  •  07-30-2008, 6:27 PM 5399 in reply to 5398

    Re: functie care transforma numere in litere

    Aş putea face o trimitere la clasici, adică la Ion Creangă Wink !

    Bogdan
  •  07-31-2008, 10:16 AM 5400 in reply to 5399

    Re: functie care transforma numere in litere

    afiseaza si ce e dupa virgula...doar ca numeric


    CREATE FUNCTION OriceNume( @nr varchar(50) )
    RETURNS VARCHAR(255)
    AS
    BEGIN

    declare @Sute table
    (
          Cifra int,
          Text VARCHAR(25),
          Biti SMALLINT
    )

    INSERT INTO @Sute (Cifra,Text) VALUES (0,'')
    INSERT INTO @Sute (Cifra,Text) VALUES (1,'UnaSuta')
    INSERT INTO @Sute (Cifra,Text) VALUES (2,'DouaSute')
    INSERT INTO @Sute (Cifra,Text) VALUES (3,'TreiSute')
    INSERT INTO @Sute (Cifra,Text) VALUES (4,'PatruSute')
    INSERT INTO @Sute (Cifra,Text) VALUES (5,'CinciSute')
    INSERT INTO @Sute (Cifra,Text) VALUES (6,'SaseSute')
    INSERT INTO @Sute (Cifra,Text) VALUES (7,'SapteSute')
    INSERT INTO @Sute (Cifra,Text) VALUES (8,'OptSute')
    INSERT INTO @Sute (Cifra,Text) VALUES (9,'NouaSute')
    UPDATE @Sute SET Biti = POWER(2,Cifra)

    declare @Zeci table
    (
          Cifra int,
          Text VARCHAR(25),
          Biti SMALLINT
    )
    INSERT INTO @Zeci (Cifra,Text) VALUES (0,'')
    INSERT INTO @Zeci (Cifra,Text) VALUES (1,NULL)
    INSERT INTO @Zeci (Cifra,Text) VALUES (2,'DouaZeci')
    INSERT INTO @Zeci (Cifra,Text) VALUES (3,'TreiZeci')
    INSERT INTO @Zeci (Cifra,Text) VALUES (4,'PatruZeci')
    INSERT INTO @Zeci (Cifra,Text) VALUES (5,'CinciZeci')
    INSERT INTO @Zeci (Cifra,Text) VALUES (6,'Saizeci')
    INSERT INTO @Zeci (Cifra,Text) VALUES (7,'SapteZeci')
    INSERT INTO @Zeci (Cifra,Text) VALUES (8,'OptZeci')
    INSERT INTO @Zeci (Cifra,Text) VALUES (9,'NouaZeci')
    UPDATE @Zeci SET Biti = POWER(2,Cifra)


    declare @Unitati table
    (
          Cifra int PRIMARY KEY,
          Text VARCHAR(25),
          Biti SMALLINT
    )
    INSERT INTO @Unitati (Cifra,Text) VALUES (0,'') --daca nivelul este 0 atunci Text='Zero' altfel Text=''
    INSERT INTO @Unitati (Cifra,Text) VALUES (1,'Unu')
    INSERT INTO @Unitati (Cifra,Text) VALUES (2,'Doi')
    INSERT INTO @Unitati (Cifra,Text) VALUES (3,'Trei')
    INSERT INTO @Unitati (Cifra,Text) VALUES (4,'Patru')
    INSERT INTO @Unitati (Cifra,Text) VALUES (5,'Cinci')
    INSERT INTO @Unitati (Cifra,Text) VALUES (6,'Sase')
    INSERT INTO @Unitati (Cifra,Text) VALUES (7,'Sapte')
    INSERT INTO @Unitati (Cifra,Text) VALUES (8,'Opt')
    INSERT INTO @Unitati (Cifra,Text) VALUES (9,'Noua')
    UPDATE @Unitati SET Biti = POWER(2,Cifra)


    declare @Nivele table
    (
          Cifra int,
          Nr int, --1-singular, 2-plural
          Text VARCHAR(25),
          PRIMARY KEY (Cifra,Nr)
    )
    INSERT INTO @Nivele (Cifra,Nr,Text) VALUES (0,1|2,'')
    INSERT INTO @Nivele (Cifra,Nr,Text) VALUES (1,1,'UnaMie')
    INSERT INTO @Nivele (Cifra,Nr,Text) VALUES (1,2,'Mii')
    INSERT INTO @Nivele (Cifra,Nr,Text) VALUES (2,1,'UnMilion')
    INSERT INTO @Nivele (Cifra,Nr,Text) VALUES (2,2,'Milioane')
    INSERT INTO @Nivele (Cifra,Nr,Text) VALUES (3,1,'UnMiliard')
    INSERT INTO @Nivele (Cifra,Nr,Text) VALUES (3,2,'Miliarde')
    INSERT INTO @Nivele (Cifra,Nr,Text) VALUES (4,1,'UnBilion') --conform DEX http://dexonline.ro/search.php?cuv=bilioane
    INSERT INTO @Nivele (Cifra,Nr,Text) VALUES (4,2,'Bilioane')
    INSERT INTO @Nivele (Cifra,Nr,Text) VALUES (5,1,'UnTrilion') --conform DEX http://dexonline.ro/search.php?cuv=trilion
    INSERT INTO @Nivele (Cifra,Nr,Text) VALUES (5,2,'Triloane')


    declare @SuteZeciUnitati table
    (
          BitiSute    SMALLINT,
          BitiZeci    SMALLINT,
          BitiUnitati SMALLINT,  
          Text              VARCHAR(25),
          TextX             VARCHAR(25),
          PRIMARY KEY (BitiSute,BitiZeci,BitiUnitati)
    )
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,POWER(2,0),32767,NULL)
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,POWER(2,1),POWER(2,0),'Zece')
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,POWER(2,1),POWER(2,1),'Unsprezece')
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,POWER(2,1),POWER(2,2),'Doisprezece')
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,POWER(2,1),POWER(2,3),'Treisprezece')
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,POWER(2,1),POWER(2,4),'Patrusprezece')
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,POWER(2,1),POWER(2,5),'Cincisprezece')
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,POWER(2,1),POWER(2,6),'Saisprezece')
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,POWER(2,1),POWER(2,7),'Saptesprezece')
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,POWER(2,1),POWER(2,8),'Optsprezece')
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,POWER(2,1),POWER(2,9),'Nouasprezece')
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text) VALUES (32767,32767^POWER(2,0)^POWER(2,1),POWER(2,0),NULL)
    INSERT INTO @SuteZeciUnitati(BitiSute,BitiZeci,BitiUnitati,Text,TextX) VALUES (32767,32767^POWER(2,0)^POWER(2,1),32767^POWER(2,0),NULL,'Si')

          DECLARE @text VARCHAR(255)
          SET @text = ''
          --<procesare intreg>
          DECLARE @intreg VARCHAR(25),@i int
      if CHARINDEX('.', @nr) = 0 begin set @nr = @nr + '.00' end
          SET @intreg = case when CHARINDEX('.', @nr) = 0 then cast(SUBSTRING(@nr, 1, NULLIF(CHARINDEX('.', @nr) - 1, -1)) as varchar(50))
       else cast(SUBSTRING(@nr, 1, CHARINDEX('.', @nr) - 1) as varchar(50)) end
          SET @intreg = CASE WHEN LEN(@intreg) % 3 <> 0 THEN  REPLICATE('0',3-(LEN(@intreg) % 3))+@intreg ELSE @intreg END
          SET @i = 1

          WHILE @i < LEN(@intreg)
          BEGIN
                --<procesare parte>
                DECLARE @parte CHAR(3),@nr_nivel int
                SET @parte = SUBSTRING(@intreg,@i,3)
                SET @nr_nivel = LEN(@intreg)/3 - @i/3 - 1
                IF ( @parte = '000' )
                      SET @text = @text + CASE WHEN @nr_nivel = 0 AND LEN(@intreg)=3 THEN 'Zero'ELSE '' END
                ELSE
                      IF ( @parte = '001' AND @nr_nivel <> 0 )
                            SET @text = @text + (SELECT TOP 1 N.Text FROM @Nivele N WHERE N.Cifra = @nr_nivel AND Nr & 1 = 1)
                      ELSE
                            BEGIN
                                  DECLARE @s SMALLINT, @z SMALLINT, @u SMALLINT
                                  SET @s = POWER(2,CAST(SUBSTRING(@parte,1,1) AS int))
                                  SET @z = POWER(2,CAST(SUBSTRING(@parte,2,1) AS int))
                                  SET @u = POWER(2,CAST(SUBSTRING(@parte,3,1) AS int))
                                  SET @text = @text + (SELECT TOP 1 S.Text + ISNULL(Z.Text,'') + COALESCE(SZU.Text,ISNULL(SZU.TextX,'')+U.Text) + N.Text AS Descriere
                                  FROM @Sute AS S, @SuteZeciUnitati AS SZU, @Zeci AS Z, @Unitati AS U, @Nivele AS N
                                  WHERE S.Biti & @s = @s
                                        AND SZU.BitiZeci & @z = @z
                                        AND SZU.BitiUnitati & @u = @u
                                        AND Z.Biti & @z = @z
                                        AND U.Biti & @u = @u
                                        AND N.Cifra = @nr_nivel
                                        AND N.Nr & 2 = 2)
                            END
                --</procesare parte>
                SET @i = @i + 3
          END
          --</procesare intreg>
          RETURN @text + cast('.' as varchar(1)) + SUBSTRING(@Nr, CHARINDEX('.', @Nr) + 1, LEN(@Nr))
    END
    GO

    multumesc.

    alex.

     

  •  07-31-2008, 11:36 AM 5401 in reply to 5400

    Re: functie care transforma numere in litere

    Ar fi oarece probleme cu genul:

    SELECT dbo.OriceNume(2000) -- DoiMii.00 ?

    În mod normal, ar trebui să fie "o mie", "două mii", "unsprezece mii", "douăsprezece mii", "douăzeci şi una mii", "douăzeci şi două mii", dar "un milion", "două milioane", "unsprezece milioane", "douăsprezece milioane", "douăzeci şi unu milioane", "douăzeci şi două milioane". Vezi http://en.wikipedia.org/wiki/Romanian_numbers#Agreement_between_number_name_and_modified_noun ("mie" este de genul feminin, iar "milion" este de genul neutru).

    Dar sunt ceva probleme şi cu alte valori ciudate:

    SELECT dbo.OriceNume('   2000') -- MilioaneDoiMii ??
    SELECT dbo.OriceNume('------2000.abc') -- MiliardeMilioaneDoiMii.abc ???

    Răzvan
  •  07-31-2008, 6:39 PM 5407 in reply to 5401

    Re: functie care transforma numere in litere

    rsocol:
    Ar fi oarece probleme cu genul:
    ...
    SELECT dbo.OriceNume('   2000') -- MilioaneDoiMii ??
    SELECT dbo.OriceNume('------2000.abc') -- MiliardeMilioaneDoiMii.abc ???
    ...

    Codul sursă poate fi modificat dupa bunul plac.
    Solutia corecta vine din proiectare.
    Contextul nu include ipoteza validarii.
  •  07-31-2008, 9:15 PM 5410 in reply to 5407

    Re: functie care transforma numere in litere

    B_gd_n[ ]Sahlean:
    rsocol:
    Ar fi oarece probleme cu genul:
    ...
    SELECT dbo.OriceNume('   2000') -- MilioaneDoiMii ??
    SELECT dbo.OriceNume('------2000.abc') -- MiliardeMilioaneDoiMii.abc ???
    ...

    Codul sursă poate fi modificat dupa bunul plac.

    Sunt de acord... totusi, daca nu merge, e mai bine ca autorul initial sa il corecteze...
    B_gd_n[ ]Sahlean:

    Solutia corecta vine din proiectare.
    Contextul nu include ipoteza validarii.

    Evident, desi ar trebui...

    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  08-01-2008, 9:11 AM 5411 in reply to 5401

    Re: functie care transforma numere in litere

    rsocol:
    Ar fi oarece probleme cu genul:

    SELECT dbo.OriceNume(2000) -- DoiMii.00 ?

    ...

    Dar sunt ceva probleme şi cu alte valori ciudate:

    SELECT dbo.OriceNume('   2000') -- MilioaneDoiMii ??
    SELECT dbo.OriceNume('------2000.abc') -- MiliardeMilioaneDoiMii.abc ???

    Răzvan
  •  08-01-2008, 9:11 AM 5412 in reply to 5410

    Re: functie care transforma numere in litere

    ignatandrei:
    B_gd_n[ ]Sahlean:
    rsocol:
    Ar fi oarece probleme cu genul:
    ...
    SELECT dbo.OriceNume('   2000') -- MilioaneDoiMii ??
    SELECT dbo.OriceNume('------2000.abc') -- MiliardeMilioaneDoiMii.abc ???
    ...

    Codul sursă poate fi modificat dupa bunul plac.

    Sunt de acord... totusi, daca nu merge, e mai bine ca autorul initial sa il corecteze...
    B_gd_n[ ]Sahlean:

    Solutia corecta vine din proiectare.
    Contextul nu include ipoteza validarii.

    Evident, desi ar trebui...
  •  08-01-2008, 9:13 AM 5413 in reply to 5412

    Re: functie care transforma numere in litere

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems