create FUNCTION dbo.Num_ToWords (
@Number Numeric (38, 0) -- Input number with as many as 18 digits
) RETURNS VARCHAR(8000)
AS BEGIN
DECLARE @inputNumber VARCHAR(38)
DECLARE @NumbersTable TABLE (number int, word VARCHAR(10))
DECLARE @outputString VARCHAR(8000)
DECLARE @length INT
DECLARE @counter INT
DECLARE @loops INT
DECLARE @position INT
DECLARE @chunk CHAR(3)
DECLARE @tensones CHAR(2)
DECLARE @hundreds CHAR(1)
DECLARE @tens CHAR(1)
DECLARE @ones CHAR(1)
DECLARE @And nvarchar(3)
DECLARE @Neg nvarchar(10)
IF @Number = 0 return 'صفر'
IF Left(@Number ,1) <> '-'
SET @Neg = ' '
ELSE
BEGIN
SET @Neg = 'منفی '
SET @Number = @Number * -1
END
SELECT @inputNumber = CONVERT(varchar(38), @Number)
, @outputString = ''
, @counter = 1
SELECT @length = LEN(@inputNumber)
, @position = LEN(@inputNumber) - 2
, @loops = LEN(@inputNumber)/3
IF LEN(@inputNumber) % 3 <> 0 SET @loops = @loops + 1
INSERT INTO @NumbersTable SELECT 0, ''
UNION ALL SELECT 1, ' یک ' UNION ALL SELECT 2, ' دو '
UNION ALL SELECT 3, ' سه ' UNION ALL SELECT 4, ' چهار '
UNION ALL SELECT 5, ' پنج ' UNION ALL SELECT 6, ' شش '
UNION ALL SELECT 7, ' هفت ' UNION ALL SELECT 8, ' هشت '
UNION ALL SELECT 9, ' نه ' 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, ' نود ' UNION ALL SELECT 100, ' صد '
UNION ALL SELECT 200, ' دویست ' UNION ALL SELECT 300, ' سیصد '
UNION ALL SELECT 400, ' چهارصد ' UNION ALL SELECT 500, ' پانصد '
UNION ALL SELECT 600, ' ششصد ' UNION ALL SELECT 700, ' هفتصد '
UNION ALL SELECT 800, ' هشتصد ' UNION ALL SELECT 900, ' نهصد '
WHILE @counter <= @loops BEGIN
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 CONVERT(INT, @tensones) <= 20 OR @Ones='0' BEGIN
if len(@outputString)>0
begin
set @And='و '
end
else
begin
set @And=''
end
SET @outputString = (SELECT word
FROM @NumbersTable
WHERE @hundreds+'00' = number)
+ case @hundreds when '0' then '' else
case @tensones when '00' then '' else 'و' end end+
(
SELECT word
FROM @NumbersTable
WHERE @tensones = number)
+ CASE @counter WHEN 1 THEN '' -- No name
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 ' اندسیلیون '
ELSE '' END
+ @And + @outputString
END
ELSE BEGIN
if len(@outputString)>0
begin
set @And='و '
end
else
begin
set @And=''
end
SET @outputString = ' '
+ (SELECT word
FROM @NumbersTable
WHERE @hundreds+'00' = number)
+ case @hundreds when '0' then '' else 'و' end
+ (SELECT word
FROM @NumbersTable
WHERE @tens+'0' = number)
+ 'و'
+ (SELECT word
FROM @NumbersTable
WHERE @ones = number)
+ CASE @counter WHEN 1 THEN '' -- No name
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 ' اندسیلیون '
ELSE '' END
+ @And + @outputString
END
END
SELECT @counter = @counter + 1
, @position = @position - 3
END
SET @outputString = LTRIM(RTRIM(REPLACE(@outputString, ' ', ' ')))
SET @outputstring = UPPER(LEFT(@outputstring, 1)) + SUBSTRING(@outputstring, 2, 8000)
SET @outputstring = @Neg + @outputstring
RETURN @outputString
END
GO
GRANT EXEC on dbo.Num_ToWords TO PUBLIC
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
سلام. ممنون از وبلاگ خوبتون. یک سوال داشتم! من توی دلفی برای تغییر دادن جهت فرم، یعنی راست به چپ کردن فرم راحت میتونم bidimode رو تغییر بدم و فرم راست به چپ میشه. اما مکان آبجکت ها هم میخوام تغییر بکنه. آیا راهی هست که مکان آبجکت ها بطور خودکار تغییر بکنه یا اینکه باید top و left تک تک آبجکت ها رو تغییر بدم؟ ممنون. منتظر پاسخ شما هستم
سلام. واقعا برنامه جالبی بود. لذت بردم. نمی دونستم توی SQL هم میشه از این کارا کرد.
راستی یه وبلاگ زدم می خوام تجربیات 15 ساله کار با دلفی رو توش بذارم. اگه ممکنه منو یاری کنید.
آدرسشم این زیر برات گذاشتم. تولیت دوستات اضافه کن.
http://delphihelp.mihanblog.com
با عرض سلام و احترام
در صورتی که با تبادل لینک با ما موافق هستید ما را با نام "سی شارپ!" لینک کنید و در بخش نظرات به ما خبر دهید.
با تشکر
C-Sharp.Ir
درود برشما
خیلی کارم راه افتاد خدا کارتون رو راه بندازه.
عالی بود
ممنون
سلام.ممنون. اما وقتی تابع رو اجرا میکنم به من علامت سوال نشون میده...چرا؟
حتما سیستم با فونت فارسی مشکل داره . تنظیمات سیستم رو چک کن و زبان فارسی و ایران انتخاب کن .
عالی بود تشکر
با سلام ممنون از وبلاگتون
حالا از این تابع گونه باید استفاده کنیم (مخصوصاً در کریستال ریپورت)
عالی بود پسر
مشکل فونت فارسی حل شده. با تشکر
create FUNCTION dbo.FN_Num_ToWords (
@Number Numeric (38, 0) -- Input number with as many as 18 digits
) RETURNS NVARCHAR(4000)
AS BEGIN
DECLARE @inputNumber NVARCHAR(38)
DECLARE @NumbersTable TABLE (number int, word NVARCHAR(10))
DECLARE @outputString NVARCHAR(4000)
DECLARE @length INT
DECLARE @counter INT
DECLARE @loops INT
DECLARE @position INT
DECLARE @chunk CHAR(3)
DECLARE @tensones CHAR(2)
DECLARE @hundreds CHAR(1)
DECLARE @tens CHAR(1)
DECLARE @ones CHAR(1)
DECLARE @And Nvarchar(3)
DECLARE @Neg Nvarchar(10)
IF @Number = 0 return N'صفر'
IF Left(@Number ,1) <> N'-'
SET @Neg = ' '
ELSE
BEGIN
SET @Neg = N'منفی '
SET @Number = @Number * -1
END
SELECT @inputNumber = CONVERT(Nvarchar(38), @Number)
, @outputString = ''
, @counter = 1
SELECT @length = LEN(@inputNumber)
, @position = LEN(@inputNumber) - 2
, @loops = LEN(@inputNumber)/3
IF LEN(@inputNumber) % 3 <> 0 SET @loops = @loops + 1
INSERT INTO @NumbersTable SELECT 0, ''
UNION ALL SELECT 1, N' یک ' UNION ALL SELECT 2, N' دو '
UNION ALL SELECT 3, N' سه ' UNION ALL SELECT 4, N' چهار '
UNION ALL SELECT 5, N' پنج ' UNION ALL SELECT 6, N' شش '
UNION ALL SELECT 7, N' هفت ' UNION ALL SELECT 8, N' هشت '
UNION ALL SELECT 9, N' نه ' UNION ALL SELECT 10, N' ده '
UNION ALL SELECT 11, N' یازده ' UNION ALL SELECT 12, N' دوازده '
UNION ALL SELECT 13, N' سیزده ' UNION ALL SELECT 14, N' چهارده '
UNION ALL SELECT 15, N' پانزده ' UNION ALL SELECT 16, N' شانزده '
UNION ALL SELECT 17, N' هفده ' UNION ALL SELECT 18, N' هیجده '
UNION ALL SELECT 19, N' نوزده ' UNION ALL SELECT 20, N' بیست '
UNION ALL SELECT 30, N' سی ' UNION ALL SELECT 40, N' چهل '
UNION ALL SELECT 50, N' پنجاه ' UNION ALL SELECT 60, N' شصت '
UNION ALL SELECT 70, N' هفتاد ' UNION ALL SELECT 80, N' هشتاد '
UNION ALL SELECT 90, N' نود ' UNION ALL SELECT 100, N' صد '
UNION ALL SELECT 200, N' دویست ' UNION ALL SELECT 300, N' سیصد '
UNION ALL SELECT 400, N' چهارصد ' UNION ALL SELECT 500, N' پانصد '
UNION ALL SELECT 600, N' ششصد ' UNION ALL SELECT 700, N' هفتصد '
UNION ALL SELECT 800, N' هشتصد ' UNION ALL SELECT 900, N' نهصد '
WHILE @counter <= @loops BEGIN
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 CONVERT(INT, @tensones) <= 20 OR @Ones='0' BEGIN
if len(@outputString)>0
begin
set @And=N'و '
end
else
begin
set @And=''
end
SET @outputString = (SELECT word
FROM @NumbersTable
WHERE @hundreds+'00' = number)
+ case @hundreds when '0' then '' else
case @tensones when '00' then '' else N'و' end end+
(
SELECT word
FROM @NumbersTable
WHERE @tensones = number)
+ CASE @counter WHEN 1 THEN '' -- No name
WHEN 2 THEN N' هزار ' WHEN 3 THEN N' میلیون '
WHEN 4 THEN N' میلیارد ' WHEN 5 THEN N' بیلیون '
WHEN 6 THEN N' بیلیارد ' WHEN 7 THEN N' کوانتیلیون '
WHEN 8 THEN N' سکستیلیون ' WHEN 9 THEN N' سپتیلیون '
WHEN 10 THEN N' اکتیلیون ' WHEN 11 THEN N' نونیلیون '
WHEN 12 THEN N' دسیلیون ' WHEN 13 THEN N' اندسیلیون '
ELSE '' END
+ @And + @outputString
END
ELSE BEGIN
if len(@outputString)>0
begin
set @And=N'و '
end
else
begin
set @And=''
end
SET @outputString = ' '
+ (SELECT word
FROM @NumbersTable
WHERE @hundreds+'00' = number)
+ case @hundreds when '0' then '' else N'و' end
+ (SELECT word
FROM @NumbersTable
WHERE @tens+'0' = number)
+ N'و'
+ (SELECT word
FROM @NumbersTable
WHERE @ones = number)
+ CASE @counter WHEN 1 THEN '' -- No name
WHEN 2 THEN N' هزار ' WHEN 3 THEN N' میلیون '
WHEN 4 THEN N' میلیارد ' WHEN 5 THEN N' بیلیون '
WHEN 6 THEN N' بیلیارد ' WHEN 7 THEN N' کوانتیلیون '
WHEN 8 THEN N' سکستیلیون ' WHEN 9 THEN N' سپتیلیون '
WHEN 10 THEN N' اکتیلیون ' WHEN 11 THEN N' نونیلیون '
WHEN 12 THEN N' دسیلیون ' WHEN 13 THEN N' اندسیلیون '
ELSE '' END
+ @And + @outputString
END
END
SELECT @counter = @counter + 1
, @position = @position - 3
END
SET @outputString = LTRIM(RTRIM(REPLACE(@outputString, ' ', ' ')))
SET @outputstring = UPPER(LEFT(@outputstring, 1)) + SUBSTRING(@outputstring, 2, 8000)
SET @outputstring = @Neg + @outputstring
RETURN @outputString
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON