Bài này mình giới thiệu hàm đọc số thành chữ bằng cách lập trình trong SQL. Các bài viết cùng chức năng Hàm đọc số bằng chữ bằng C#; Hàm đọc số bằng chữ bằng Javascript
1. Hàm SplitString
Trước tiên bạn cần viết hàm SplitString, Hàm này tương tự như hàm Split như các ngôn ngữ lập trình khác, nhưng kết quả trả về là 1 bảng.
--CREATE BY webmaster@hmweb.com.vn
-- Split function
CREATE FUNCTION [dbo].[SplitString]
(
@myString varchar(500),
@deliminator varchar(10)
)
RETURNS
@ReturnTable TABLE
(
[id] [int] IDENTITY(1,1) NOT NULL,
[part] [varchar](50) NULL
)
AS
BEGIN
Declare @iSpaces int
Declare @part varchar(50)
--initialize spaces
Select @iSpaces = charindex(@deliminator,@myString,0)
While @iSpaces > 0
BEGIN
Select @part =
substring(@myString,0,charindex(@deliminator,@myString,0))
Insert Into @ReturnTable(part)
Select @part
Select @myString =
substring(@mystring,charindex(@deliminator,@myString,0)+
len(@deliminator),len(@myString)- charindex(' ',@myString,0))
Select @iSpaces = charindex(@deliminator,@myString,0)
END
If len(@myString) > 0
Insert Into @ReturnTable
Select @myString
RETURN
END
2. Hàm đọc số có 3 chữ số.
Tiếp theo bạn cần viết hàm để đọc số có 3 chữ số. Hàm được viết như sau
CREATE FUNCTION [dbo].[fuDocBaSo]
(
@BaSo int
)
RETURNS NVARCHAR(500)
AS
BEGIN
DECLARE @KetQua nvarchar(500)
SET @KetQua=''
DECLARE @TBSo_Chu TABLE
(So int, ChuSo nvarchar(20))
INSERT INTO @TBSo_Chu
SELECT 0, N' không' UNION
SELECT 1, N' một'UNION
SELECT 2, N' hai' UNION
SELECT 3, N' ba' UNION
SELECT 4, N' bốn' UNION
SELECT 5, N' năm' UNION
SELECT 6, N' sáu' UNION
SELECT 7, N' bảy' UNION
SELECT 8, N' tám' UNION
SELECT 9, N' chín'
DECLARE @Tram int
DECLARE @Chuc int
DECLARE @DonVi int
DECLARE @nStr nvarchar(20)
SET @Tram =cast(@BaSo/100 AS int)
SET @Chuc=cast((@BaSo%100)/10 AS int);
SET @DonVi=@BaSo%10
IF (@Tram=0 AND @Chuc=0 AND @DonVi=0) SET @KetQua=''
IF @Tram<>0
BEGIN
SELECT @nStr = ChuSo FROM @TBSo_Chu WHERE So = @Tram
SET @KetQua = @nStr + N' trăm '
IF @Chuc=0 AND @DonVi<>0 SET @KetQua=@KetQua+ ' linh '
END
IF @Chuc <>0 AND @Chuc<>1
BEGIN
SELECT @nStr = ChuSo FROM @TBSo_Chu WHERE So=@Chuc
SET @KetQua = @KetQua + @nStr + N' mươi '
IF @Chuc=0 AND @DonVi<>0
SET @KetQua=@KetQua+ ' linh '
END
IF @Chuc=1 SET @KetQua=@KetQua+ N' mười '
IF @DonVi=1
BEGIN
IF @Chuc<>0 AND @Chuc<>1
SET @KetQua =@KetQua +N' mốt'
ELSE
BEGIN
SELECT @nStr = ChuSo FROM @TBSo_Chu WHERE So=@DonVi
SET @KetQua=@KetQua+@nStr
END
END
ELSE
BEGIN
IF @DonVi=5
BEGIN
IF @Chuc=0
BEGIN
SELECT @nStr = ChuSo FROM @TBSo_Chu WHERE So=@DonVi
SET @KetQua=@KetQua+@nStr
END
ELSE
SET @KetQua=@KetQua+N' lăm'
END
ELSE
BEGIN
IF @DonVi<>0
BEGIN
SELECT @nStr = ChuSo FROM @TBSo_Chu WHERE So=@DonVi
SET @KetQua=@KetQua+@nStr
END
END
END
RETURN @KetQua
END
3. Hàm đọc số có 3 số có thể hàng trăm hoặc hàng chục bằng 0
CREATE FUNCTION [dbo].[fuDocBaSo_Ben]
(
@BaSo int
)
RETURNS NVARCHAR(500)
AS
BEGIN
DECLARE @KetQua nvarchar(500)
SET @KetQua=''
DECLARE @TBSo_Chu TABLE
(So int, ChuSo nvarchar(20))
INSERT INTO @TBSo_Chu
SELECT 0, N' không' UNION
SELECT 1, N' một'UNION
SELECT 2, N' hai' UNION
SELECT 3, N' ba' UNION
SELECT 4, N' bốn' UNION
SELECT 5, N' năm' UNION
SELECT 6, N' sáu' UNION
SELECT 7, N' bảy' UNION
SELECT 8, N' tám' UNION
SELECT 9, N' chín'
DECLARE @Tram int
DECLARE @Chuc int
DECLARE @DonVi int
DECLARE @nStr nvarchar(20)
SET @Tram =cast(@BaSo/100 AS int)
SET @Chuc=cast((@BaSo%100)/10 AS int);
SET @DonVi=@BaSo%10
IF (@Tram=0 AND @Chuc=0 AND @DonVi=0) SET @KetQua=''
IF @Tram<>0
BEGIN
SELECT @nStr = ChuSo FROM @TBSo_Chu WHERE So = @Tram
SET @KetQua = @nStr + N' trăm '
IF @Chuc=0 AND @DonVi<>0 SET @KetQua=@KetQua+ ' linh '
END
if @Tram=0
BEGIN
if @Chuc=0
BEGIN
if @DonVi=0
SET @KetQua = @KetQua + N' '
else
SET @KetQua = @KetQua + N' không trăm linh'
END
if @Chuc<>0
SET @KetQua = @KetQua + N' không trăm'
END
IF @Chuc <>0 AND @Chuc<>1
BEGIN
SELECT @nStr = ChuSo FROM @TBSo_Chu WHERE So=@Chuc
SET @KetQua = @KetQua + @nStr + N' mươi '
IF @Chuc=0 AND @DonVi<>0
SET @KetQua=@KetQua+ ' linh '
END
IF @Chuc=1 SET @KetQua=@KetQua+ N' mười '
IF @DonVi=1
BEGIN
IF @Chuc<>0 AND @Chuc<>1
SET @KetQua =@KetQua +N' mốt'
ELSE
BEGIN
SELECT @nStr = ChuSo FROM @TBSo_Chu WHERE So=@DonVi
SET @KetQua=@KetQua+@nStr
END
END
ELSE
BEGIN
IF @DonVi=5
BEGIN
IF @Chuc=0
BEGIN
SELECT @nStr = ChuSo FROM @TBSo_Chu WHERE So=@DonVi
SET @KetQua=@KetQua+@nStr
END
ELSE
SET @KetQua=@KetQua+N' lăm'
END
ELSE
BEGIN
IF @DonVi<>0
BEGIN
SELECT @nStr = ChuSo FROM @TBSo_Chu WHERE So=@DonVi
SET @KetQua=@KetQua+@nStr
END
END
END
RETURN @KetQua
END
4. Hàm đọc số thành chữ
Tiếp theo chúng ta sẽ sử dụng 3 hàm trên vào việc viết hàm đọc số thành chữ.
CREATE FUNCTION [dbo].[fuDocSoThanhChu](@SoCanDoc bigint)
RETURNS nvarchar(200)
AS
BEGIN
DECLARE @DocThanhChu nvarchar(200)
DECLARE @String nvarchar(50)
IF len(@SoCanDoc)>15
BEGIN
SET @DocThanhChu=N'Số quá lớn, Tôi không biết đọc'
END
ELSE
SET @String =Replace(Convert(VARCHAR,CAST(@SoCanDoc AS MONEY),1 ),'.00','')
BEGIN
DECLARE @Count int
SELECT @Count = COUNT(*) FROM dbo.SplitString(@String,',')
DECLARE @tram nvarchar(10)
DECLARE @Nghin nvarchar(10)
DECLARE @Trieu nvarchar(10)
DECLARE @ty nvarchar(10)
DECLARE @nghinty nvarchar(10)
DECLARE @trieuty nvarchar(10)
IF @Count=1
BEGIN
SET @DocThanhChu=dbo.fuDocBaSo(@SoCanDoc)
END
IF @Count=2
BEGIN
SELECT @Nghin=part FROM dbo.SplitString(@String,',') WHERE id=1
SELECT @tram=part FROM dbo.SplitString(@String,',') WHERE id=2
SET @DocThanhChu=dbo.fuDocBaSo(@Nghin)+N' nghìn '+ dbo.fuDocBaSo_Ben(@tram)
END
IF @Count=3
BEGIN
SELECT @Trieu=part FROM dbo.SplitString(@String,',') WHERE id=1
SELECT @Nghin=part FROM dbo.SplitString(@String,',') WHERE id=2
SELECT @tram = part FROM dbo.SplitString(@String,',') WHERE id=3
IF Cast(@Nghin as int)>0
BEGIN
IF Cast(@tram as int)>0
BEGIN
SET @DocThanhChu=dbo.fuDocBaSo(@Trieu) +N' triệu' +
dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn'+ dbo.fuDocBaSo_Ben(@tram)
END
ELSE
BEGIN
SET @DocThanhChu=dbo.fuDocBaSo(@Trieu) +N' triệu' +
dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn'
END
End
ELSE
BEGIN
if Cast(@tram as int) =0
SET @DocThanhChu=dbo.fuDocBaSo(@Trieu) +N' triệu'
else
SET @DocThanhChu=dbo.fuDocBaSo(@Trieu) +N' triệu' +
dbo.fuDocBaSo_Ben(@tram)
END
END
IF @Count=4
BEGIN
SELECT @ty=part FROM dbo.SplitString(@String,',') WHERE id=1
SELECT @Trieu=part FROM dbo.SplitString(@String,',') WHERE id=2
SELECT @Nghin=part FROM dbo.SplitString(@String,',') WHERE id=3
SELECT @tram = part FROM dbo.SplitString(@String,',') WHERE id=4
if cast(@Trieu as int)>0
BEGIN
IF cast(@Nghin as int)>0
BEGIN
if cast(@tram as int)>0
BEGIN
SET @DocThanhChu=dbo.fuDocBaSo(@ty) +N' tỷ'
+ dbo.fuDocBaSo_Ben(@Trieu) + N' triệu '
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn '
+ dbo.fuDocBaSo_Ben(@tram)
END
else
BEGIN
SET @DocThanhChu=dbo.fuDocBaSo(@ty) +N' tỷ'
+ dbo.fuDocBaSo_Ben(@Trieu) + N' triệu'
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn'
END
END
ELSE
BEGIN
IF cast(@tram as int)>0
BEGIN
SET @DocThanhChu=dbo.fuDocBaSo(@ty) +N' tỷ'
+ dbo.fuDocBaSo_Ben(@Trieu) + N' triệu '
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn '
+ dbo.fuDocBaSo_Ben(@tram)
END
ELSE
BEGIN
SET @DocThanhChu=dbo.fuDocBaSo(@ty) +N' tỷ'
+ dbo.fuDocBaSo_Ben(@Trieu) + N' triệu '
END
END
END
ELSE
BEGIN
if cast(@Nghin as int)>0
BEGIN
if Cast(@tram as int)>0
BEGIN
SET @DocThanhChu=dbo.fuDocBaSo(@ty) +N' tỷ'
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn '
+ dbo.fuDocBaSo_Ben(@tram)
END
else
BEGIN
SET @DocThanhChu=dbo.fuDocBaSo(@ty) +N' tỷ'
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn '
END
END
else
if cast(@tram as int)>0
BEGIN
SET @DocThanhChu=dbo.fuDocBaSo(@ty) +N' tỷ'
+ dbo.fuDocBaSo_Ben(@tram)
END
else
BEGIN
SET @DocThanhChu=dbo.fuDocBaSo(@ty) +N' tỷ'
END
END
END
IF @Count=5
BEGIN
SELECT @nghinty =part FROM dbo.SplitString(@String,',') WHERE id=1
SELECT @ty=part FROM dbo.SplitString(@String,',') WHERE id=2
SELECT @Trieu=part FROM dbo.SplitString(@String,',') WHERE id=3
SELECT @Nghin=part FROM dbo.SplitString(@String,',') WHERE id=4
SELECT @tram = part FROM dbo.SplitString(@String,',') WHERE id=5
if cast(@ty as int)>0
BEGIN
if cast(@Trieu as int)>0
BEGIN
if cast(@Nghin as int)>0
BEGIN
if cast(@tram as int)>0
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn'
+dbo.fuDocBaSo_Ben(@ty) +N' tỷ'
+dbo.fuDocBaSo_Ben(@Trieu) + N' triệu'
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn'
+ dbo.fuDocBaSo_Ben(@tram)
else
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn'
+dbo.fuDocBaSo_Ben(@ty) +N' tỷ'
+dbo.fuDocBaSo_Ben(@Trieu) + N' triệu'
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn'
END
else
BEGIN
if cast(@tram as int)>0
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn'
+dbo.fuDocBaSo_Ben(@ty) +N' tỷ'
+dbo.fuDocBaSo_Ben(@Trieu) + N' triệu'
+ dbo.fuDocBaSo_Ben(@tram)
else
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn'
+dbo.fuDocBaSo_Ben(@ty) +N' tỷ'
+dbo.fuDocBaSo_Ben(@Trieu) + N' triệu'
END
END
else
BEGIN
if cast(@Nghin as int)>0
BEGIN
if cast(@tram as int)>0
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn'
+dbo.fuDocBaSo_Ben(@ty) +N' tỷ'
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn'
+ dbo.fuDocBaSo_Ben(@tram)
else
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn'
+dbo.fuDocBaSo_Ben(@ty) +N' tỷ'
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn'
END
else
BEGIN
if cast(@tram as int)>0
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn'
+dbo.fuDocBaSo_Ben(@ty) +N' tỷ'
+ dbo.fuDocBaSo_Ben(@tram)
else
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn'
+dbo.fuDocBaSo_Ben(@ty) +N' tỷ'
END
END
END
else
BEGIN
if cast(@Trieu as int)>0
BEGIN
if cast(@Nghin as int)>0
BEGIN
if cast(@tram as int)>0
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn tỷ'
+dbo.fuDocBaSo_Ben(@Trieu) + N' triệu'
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn'
+ dbo.fuDocBaSo_Ben(@tram)
else
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn tỷ'
+dbo.fuDocBaSo_Ben(@Trieu) + N' triệu'
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn'
END
else
BEGIN
if cast(@tram as int)>0
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn tỷ'
+dbo.fuDocBaSo_Ben(@Trieu) + N' triệu'
+ dbo.fuDocBaSo_Ben(@tram)
else
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn tỷ'
+dbo.fuDocBaSo_Ben(@Trieu) + N' triệu'
END
END
else
BEGIN
if cast(@Nghin as int)>0
BEGIN
if cast(@tram as int)>0
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn tỷ'
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn'
+ dbo.fuDocBaSo_Ben(@tram)
else
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn tỷ'
+ dbo.fuDocBaSo_Ben(@Nghin) + N' nghìn'
END
else
BEGIN
if cast(@tram as int)>0
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn tỷ'
+ dbo.fuDocBaSo_Ben(@tram)
else
SET @DocThanhChu= dbo.fuDocBaSo(@nghinty) +N' nghìn tỷ'
END
END
END
END
END
RETURN @DocThanhChu
END