PDA

View Full Version : تبدیل عدد (پول - Float) به رشته به صورت 3تا 3تا با یک کاراکتر خاص مانند ',' در SQLServer



DelphiProgrammer
چهارشنبه 19 بهمن 1390, 17:54 عصر
سلام علیکم
من فیلد عدد به صورت float برای ذخیره مقدار پولی در نظر گرفتم در یک جدول.
الان دارم query میزنم. میخوام بدونم تابعی چیزی هست که من از OnCalculated Field استفاده نکنم و مستقیم توی StoreProcedure توی SQLServer یک فیلد تعری کنم تبدیل رو همونجا بزنم؟
از SQL Server 2008 استفاده میکنم.
الان کاری که میکنم اینه که یک فیلد اضافه از نوع Calculated توی برنامه تعریف کردم و توی Event مربوطه خودم یک تابع تبدیل عدد به پول نوشتم و دارم ازش استفاده میکنم. جواب داره میده. ولی اگر کسی راهی داشته باشه که مستقیم توی SQLServer کارم رو انجام بدم ممنون میشم.
مثلا عدد 1000000 باید بشه رشته 1,000,000
با تشکر

یوسف زالی
چهارشنبه 19 بهمن 1390, 18:07 عصر
سلام.
چرا از cast استفاده نمی کنید؟
cast( F as Money) -- sql

DelphiProgrammer
چهارشنبه 19 بهمن 1390, 18:20 عصر
سلام.
چرا از cast استفاده نمی کنید؟
cast( F as Money) -- sql
به دلیل اینکه فایده ندارد! :D
مثلا 50000 تبدیل میشه به 50000.00
فکر میکنم باید یک تابع برای این کار بنویسم. یعنی اول تبدیل کنم به string و بعد خودم بیام 3تا 3تا جدا کنم. ولی خوب این چه سودی داره؟ همون سمت اپلیکیشن بزنم شاید بهتر باشه

یوسف زالی
چهارشنبه 19 بهمن 1390, 18:32 عصر
از این استفاده کنید:

create function [dbo].[GetSeparatedNumber](@input decimal(20, 3), @separator char)
returns varchar(41)
as
begin
set @input *= 1000
declare @ST varchar(41), @STx varchar(20), @STy varchar(20)
declare @i int
declare @sign int
declare @x decimal, @y decimal
declare @part varchar(3)
set @input =isnull(@input, 0)
if @input < 0 begin
set @sign =-1
set @input =-@input
end
else
set @sign = 1
set @input = @input / 1000
set @y = @input * 1000 % 1000
set @x =floor(@input)
set @i =len(@x)
set @STx =''
while (@i > 3)begin
set @part =cast(@x % 1000 as varchar(3))
iflen(@part)= 1
set @part ='00'+ @part
else iflen(@part)= 2
set @part ='0'+ @part
set @STx = @separator + @part + @STx
set @x =floor(@x / 1000)
set @i = @i - 3
end
set @STx =cast(@x as varchar(3))+ @STx
set @STy =cast(@y as varchar(3))
iflen(@STy)= 1
set @STy ='00'+ @STy
else iflen(@STy)= 2
set @STy ='0'+ @STy
if @STy ='000'
set @ST = @STx
else
set @ST = @STx +'/'+ @STy
if @sign < 0
set @ST ='('+ @ST +')'
return @ST
end


نحوه استفاده :
select dbo.GetSeparatedNumber(12345678,',') -- sql

DelphiProgrammer
چهارشنبه 19 بهمن 1390, 19:17 عصر
بسیار عالی.
تست شد. جواب داد. فقط اون قسمت آخر رو متوجه نشدم. یپرانتز برای عدد منفی هست. اون / برای چی هست؟
(گرچه هنوز مطمئن نیستم که از فیلد Calculated سمت اپلیکیشن استفاده کنیم یا نه. اگر تعداد userها بره بالا بیخودی بار میزاره روی Server)

یوسف زالی
چهارشنبه 19 بهمن 1390, 22:00 عصر
سلام.
در حسابداری اعداد منفی رو در پرانتز نشون می دن.

بهزادصادقی
چهارشنبه 19 بهمن 1390, 23:49 عصر
یک راهش اینه:

SELECT CONVERT(varchar, CAST(987654321 AS money), 1)

یعنی اول عدد مورد نظر خود را به نوع money با استفاده از تابع cast تبدیل کرده، و بعد نتیجه این عمل را با استفاده از تابع convert به نوع varchar تبدیل می‌نمایید. برای اطلاعات بیشتر، به این لینک مراجعه کنید:

http://stackoverflow.com/questions/4377352/how-do-i-format-a-number-with-commas-in-t-sql