ورود

View Full Version : كمك در نوشتن يك تابع



happy65_sh
سه شنبه 04 خرداد 1389, 08:52 صبح
سلام
من يه تكه كد به زبان c# دارم كه مي خواهم به تابعي توي sql تبديلش كنم و ازش استفاده كنم كار اين كد تبديل عدد به حروف هست



private static string[] yekan = new string[10] { "صفر", "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه" };
private static string[] dahgan = new string[10] { "", "", "بیست", "سی", "چهل", "پنجاه", "شصت", "هفتاد", "هشتاد", "نود" };
private static string[] dahyek = new string[10] { "ده", "یازده", "دوازده", "سیزده", "چهارده", "پانزده", "شانزده", "هفده", "هجده", "نوزده" };
private static string[] sadgan = new string[10] { "", "یکصد", "دویست", "سیصد", "چهارصد", "پانصد", "ششصد", "هفتصد", "هشتصد", "نهصد" };
private static string[] basex = new string[5] { "", "هزار", "میلیون", "میلیارد", "تریلیون" };

private static string getnum(int num)
{
string s = "";
int d3, d12;
d12 = num3 % 100;
d3 = num3 / 100;
if (d3 != 0)
s = sadgan[d3] + " و ";
if ((d12 >= 10) && (d12 <= 19))
s = s + dahyek[d12 - 10];
else
{
int d2 = d12 / 10;
if (d2 != 0)
s = s + dahgan[d2] + " و ";
int d1 = d12 % 10;
if (d1 != 0)
s = s + yekan[d1] + " و ";
s = s.Substring(0, s.Length - 3);
}
return s;
}

public static string NumToStr(string snum)
{
string stotal = "";
if (snum == "0")
{
return yekan[0];
}
else
{
snum = snum.PadLeft(((snum.Length - 1) / 3 + 1) * 3, '0');
int L = snum.Length / 3 - 1;
for (int i = 0; i <= L; i++)
{
int b = int.Parse(snum.Substring(i * 3, 3));
if (b != 0)
stotal = stotal + getnum(b) + " " + basex[L - i] + " و ";
}
stotal = stotal.Substring(0, stotal.Length - 3);
}//else
return stotal;
}

مشكل من توي قسمت اولشه.چه طور مي تونم كاري كه اينجا آرايه هاي yekan,dahgan,...انجام مي دهند را توي sql انجام بدهم:متفکر:

حسین شهریاری
سه شنبه 04 خرداد 1389, 10:18 صبح
این تابع را دوستان توی همین تالار نوشته اند ازش استفاده کنید.کافیه اون اسکریپت را اجرا کنی تا آبجکت اون ایجاد و به شکل زیر ازش استفاده کنید:


Select dbo.udf_Num_ToWord(2500000)


create FUNCTION dbo.udf_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 varchar(3)
IF @Number = 0 return 'صفر'
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)
RETURN @outputString
END