Microsoft SQL Server
Скрипты
T-SQL

Набор функций для создания суммы пропись

Опубликовано: 22 апр 05
Рейтинг:

Автор: Gleb Oufimtsev (dnkvpb@nm.ru)
Прислал:

/*************************************************************************/
/*                  NumPhrase function for MSSQL2000                     */
/*                   Gleb Oufimtsev (dnkvpb@nm.ru)                       */
/*                       http://www.gvu.newmail.ru                       */
/*                          Moscow  Russia  2001                         */
/*************************************************************************/
CREATE function NumPhrase (@Num BIGINT, @IsMaleGender bit=1)
returns varchar(255)
as
begin
  declare @nword varchar(255), @th tinyint, @gr smallint, @d3 tinyint, @d2
tinyint, @d1 tinyint
  if @Num<0 return '*** Error: Negative value' else if @Num=0 return 'Ноль'
/* особый случай */
  while @Num>0
  begin
    set @th=IsNull(@th,0)+1    set @gr=@Num%1000    set @Num=(@Num-@gr)/1000
    if @gr>0
    begin
      set @d3=(@gr-@gr%100)/100
      set @d1=@gr%10
      set @d2=(@gr-@d3*100-@d1)/10
      if @d2=1 set @d1=10+@d1
      set @nword=case @d3
                  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 ' девятьсот' else '' end
                +case @d2
                  when 2 then ' двадцать' when 3 then ' тридцать' when 4
then ' сорок'
                  when 5 then ' пятьдесят' when 6 then ' шестьдесят' when 7
then ' семьдесят'
                  when 8 then ' восемьдесят' when 9 then ' девяносто' else
'' end
                +case @d1
                  when 1 then (case when @th=2 or (@th=1 and
@IsMaleGender=0) then ' одна' else ' один' end)
                  when 2 then (case when @th=2 or (@th=1 and
@IsMaleGender=0) then ' две' else ' два' end)
                  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 ' девятнадцать'
else '' end
                +case @th
                  when 2 then ' тысяч'     +(case when @d1=1 then 'а' when
@d1 in (2,3,4) then 'и' else ''   end)
                  when 3 then ' миллион' when 4 then ' миллиард' when 5 then
' триллион' when 6 then ' квадрилион' when 7 then ' квинтилион'
                  else '' end
                +case when @th in (3,4,5,6,7) then (case when @d1=1 then ''
when @d1 in (2,3,4) then 'а' else 'ов' end) else '' end
                +IsNull(@nword,'')
    end
  end
  return upper(substring(@nword,2,1))+substring(@nword,3,len(@nword)-2)
end



GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO



/*************************************************************************/
/*                  RubPhrase function for MSSQL2000                     */
/*                   Gleb Oufimtsev (dnkvpb@nm.ru)                       */
/*                       http://www.gvu.newmail.ru                       */
/*                          Moscow  Russia  2001                         */
/*************************************************************************/
CREATE function RubPhrase (@Value money)
returns varchar(255)
as
begin
  declare @rpart bigint, @rattr tinyint,  @cpart tinyint, @cattr tinyint
  set @rpart=floor(@Value)     set @rattr=@rpart%100
  if @rattr>19 set @rattr=@rattr%10
  set @cpart=(@Value-@rpart)*100
  if @cpart>19 set @cattr=@cpart%10 else set @cattr=@cpart
  return dbo.NumPhrase(@rpart,1)+' рубл'
           +case when @rattr=1 then 'ь' when @rattr in (2,3,4) then 'я' else
'ей' end+' '
           +right('0'+cast(@cpart as varchar(2)),2)+' копе'
           +case when @cattr=1 then 'йка' when @cattr in (2,3,4) then 'йки'
else 'ек' end
end



GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO




/*************************************************************************/
/*                  UsdPhrase function for MSSQL2000                     */
/*                   Gleb Oufimtsev (dnkvpb@nm.ru)                       */
/*                       http://www.gvu.newmail.ru                       */
/*                          Moscow  Russia  2001                         */
/*************************************************************************/
CREATE function UsdPhrase (@Value money)
returns varchar(255)
as
begin
  declare @dpart bigint, @dattr tinyint, @cpart tinyint, @cattr tinyint
  set @dpart=floor(@Value)     set @dattr=@dpart%100
  if @dattr>19 set @dattr=@dattr%10
  set @cpart=(@Value-@dpart)*100
  if @cpart>19 set @cattr=@cpart%10 else set @cattr=@cpart
  return dbo.NumPhrase(floor(@Value),1)+' доллар'
           +case when @dattr=1 then '' when @dattr in (2,3,4) then 'а' else
'ов' end
           +' США '+right('0'+cast(@cpart as varchar(2)),2)+' цент'
           +case when @cattr=1 then '' when @cattr in (2,3,4) then 'а' else
'ов' end
end

Комментарии


  • 10 марта 2011, 14:09 Начинающий SQL 2008

    По ссылке ниже дан исправленный вариант.
    http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=834518&msg=10349699

  • 10 марта 2011, 14:04 Начинающий SQL 2008

    Функции хорошие, то, что надо. Правда заметил недочет, который всплыл здесь:
    http://www.sql.ru/forum/actualthread.aspx?tid=834518

    Переносит по словам, если встречается "триста", "пять", "восемь". Оно и понятно, т.к.
    when 1 then ' сто' when 2 then ' двести' when 3 then '
    триста'

    По ссылке ниже дан исправленный вариант.

  • Всё отлично, только квадриллион и квинтиллион пишутся с двумя 'л'. Большое спасибо. Очень помогло.

  • Респект и уважуха !

  • Автору зачет!

  • Еще бы евро, но я сам чёнить придумаю

  • Будем юзать

  • Действительно полезная штука! До того, как залез сюда, сам сваял нечто подобное.

  • Пригодится, спасибо.

  • чуть-чуть изменил: добавил средний род (оно) для единицы:
    when 1 then (case when @th=2 or (@th=1 and
    @IsMaleGender=0) then ' одна' WHEN (@th=1 and
    @IsMaleGender=2) THEN ' одно' else ' один' end)

    ну и понятно @IsMaleGender tynint=1

  • Спасибо!!

    предлагаю вариант для укр. гривен

    Alter function dbo.UAHPhrase (@Value money)
    returns varchar(255)
    as
    begin
    declare @rpart bigint,
    @rattr tinyint,
    @cpart tinyint,
    @cattr tinyint
    set @rpart=floor(@Value)
    set @rattr=@rpart%100
    if @rattr>19 set @rattr=@rattr%10
    set @cpart=(@Value-@rpart)*100
    if @cpart>19 set @cattr=@cpart%10 else set @cattr=@cpart

    return dbo.NumPhrase(@rpart,0)+' гривн'
    +case when @rattr=1 then 'а' when @rattr in (2,3,4) then 'ы' else
    'ен' end+' '
    +right('0'+cast(@cpart as varchar(2)),2)+' копе'
    +case when @cattr=1 then 'йка' when @cattr in (2,3,4) then 'йки'
    else 'ек' end
    end

  • 27 мая 2007, 20:12 Dmitry V. Nechaev

    Классно. Очень помогло.

  • Молодец братан! Теперь взъебу своих программеров за не компетентностью!

  • молодец!!!!

  • Супер! Немного переделал для отрицательных (сторно) значений.

  • Прикольно!!! Мы такую же писали прогу, тока на Си

  • Забыл оценку выставить:)

  • Просто здорово, 5+!

  • Мне вот пришлось решать более сложный случай - спрягать числительные, чтобы грамотно читалось с разными словами, например: одно яблоко, одна гривна, один банковский день и т.п.

  • Все работает



Необходимо войти на сайт, чтобы оставлять комментарии

Раздел FAQ: Microsoft SQL Server / Скрипты / T-SQL / Набор функций для создания суммы пропись