Đọc số thành chữ bằng MsSql

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

Hàm đọc số bằng chữ bằng C#

Khi lập trình có liên quan đến số liệu phải tính toán và yêu cầu phải đọc được số thành chữ như đọc tiền bằng chữ, Bài này sẽ hướng dẫn bạn viết hàm bằng C#

Để thực hiện đọc số thành chữ bạn cần viết hàm đọc số có 3 chữ số trước, Bạn hãy thực hiện theo các hàm dưới đây.
Bạn đọc và hiểu được thuật toán thì không khó khăn để chuyển đổi bằng các ngôn ngữ lập trình khác nhau. Bài sau mình sẽ giới thiệu hàm "đọc tiền bằng chữ bằng javascript" dùng thuật toán trên

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace hmweb.Services
{
    public class cCommonFunction
    {
        private string[] ChuSo = new string[10] { " không", " một", " hai", " ba", " bốn", " năm", " sáu", " bẩy", " tám", " chín" };
        private string[] Tien = new string[6] { "", " nghìn", " triệu", " tỷ", " nghìn tỷ", " triệu tỷ" };
        // Hàm đọc số thành chữ
        public string DocTienBangChu(long SoTien, string strTail)
        {
            int lan, i;
            long so;
            string KetQua = "", tmp = "";
            int[] ViTri = new int[6];
            if (SoTien < 0) return "Số tiền âm !";
            if (SoTien == 0) return "Không đồng !";
            if (SoTien > 0)
            {
                so = SoTien;
            }
            else
            {
                so = -SoTien;
            }
            //Kiểm tra số quá lớn
             if (SoTien > 8999999999999999)
            {
                SoTien = 0;
             return "";
            }
            ViTri[5] = (int)(so / 1000000000000000);
            so = so - long.Parse(ViTri[5].ToString()) * 1000000000000000;
            ViTri[4] = (int)(so / 1000000000000);
            so = so - long.Parse(ViTri[4].ToString()) * +1000000000000;
            ViTri[3] = (int)(so / 1000000000);
            so = so - long.Parse(ViTri[3].ToString()) * 1000000000;
            ViTri[2] = (int)(so / 1000000);
            ViTri[1] = (int)((so % 1000000) / 1000);
            ViTri[0] = (int)(so % 1000);
            if (ViTri[5] > 0)
            {
                lan = 5;
            }
            else if (ViTri[4] > 0)
            {
                lan = 4;
            }
            else if (ViTri[3] > 0)
            {
                lan = 3;
            }
            else if (ViTri[2] > 0)
            {
                lan = 2;
            }
            else if (ViTri[1] > 0)
            {
                lan = 1;
            }
            else
            {
                lan = 0;
            }
            for (i = lan; i >= 0; i--)
            {
                tmp = DocSo3ChuSo(ViTri[i]);
                KetQua += tmp;
                if (ViTri[i] != 0) KetQua += Tien[i];
                if ((i > 0) && (!string.IsNullOrEmpty(tmp))) KetQua += ",";//&& (!string.IsNullOrEmpty(tmp))
            }
            if (KetQua.Substring(KetQua.Length - 1, 1) == ",") KetQua = KetQua.Substring(0, KetQua.Length - 1);
            KetQua = KetQua.Trim() + strTail;
            return KetQua.Substring(0, 1).ToUpper() + KetQua.Substring(1);
        }

        // Hàm đọc số có 3 chữ số
        private string DocSo3ChuSo(int baso)
        {
            int tram, chuc, donvi;
            string KetQua = "";
            tram = (int)(baso / 100);
            chuc = (int)((baso % 100) / 10);
            donvi = baso % 10;
            if ((tram == 0) && (chuc == 0) && (donvi == 0)) return "";
            if (tram != 0)
            {
                KetQua += ChuSo[tram] + " trăm";
                if ((chuc == 0) && (donvi != 0)) KetQua += " linh";
            }
            if ((chuc != 0) && (chuc != 1))
            {
                KetQua += ChuSo[chuc] + " mươi";
                if ((chuc == 0) && (donvi != 0)) KetQua = KetQua + " linh";
            }
            if (chuc == 1) KetQua += " mười";
            switch (donvi)|
            {
                case 1:
                    if ((chuc != 0) && (chuc != 1))
                    {
                        KetQua += " mốt";
                    }
                    else
                    {
                        KetQua += ChuSo[donvi];
                    }
                    break;
                case 5:
                    if (chuc == 0)
                    {
                        KetQua += ChuSo[donvi];
                    }
                    else
                    {
                        KetQua += " lăm";
                    }
                    break;
                default:
                    if (donvi != 0)
                    {
                        KetQua += ChuSo[donvi];
                    }
                    break;
            }
            return KetQua;
        }
    }
}

 

Hàm đọc số bằng chữ bằng Javascript

Khi lập trình có liên quan đến số liệu phải tính toán và yêu cầu phải đọc được số thành chữ như đọc tiền thành chữ. Bạn có thể dùng ngôn ngữ lập trình như C#, VB, hay php để thực hiện, Ở bài này mình sẽ viết hàm đọc số thành chữ bằng javascript

Khi bạn dùng javascript bạn sẽ hạn chế được việt dùng AutoPostback của trang. Và nếu chương trình có yêu cầu chỉ dùng các phím số và phím Enter để tính toán, khi nhập xong ở 1 ô con trỏ sẽ tự động sang ô kế tiếp và đọc tiền bằng chữ cho dữ liệu vừa nhập. Giải pháp tốt nhất là dùng Javascript.

Bài viết sau sẽ mô tả việc ứng dụng của hàm đọc số thành chữ trong javascript
Tương tự bạn hoàn toàn có thể sử dụng thuật toán này để đọc số bằng các ngôn ngữ lập trình khác nhau. Mình cũng đã viết hàm tương ứng bằng C#

Bạn thực hiện hàm như sau:

var ChuSo=new Array(" không "," một "," hai "," ba "," bốn "," năm "," sáu "," bảy "," tám "," chín ");
var Tien=new Array( "", " nghìn", " triệu", " tỷ", " nghìn tỷ", " triệu tỷ");

//1. Hàm đọc số có ba chữ số;
function DocSo3ChuSo(baso)
{
    var tram;
    var chuc;
    var donvi;
    var KetQua="";
    tram=parseInt(baso/100);
    chuc=parseInt((baso%100)/10);
    donvi=baso%10;
    if(tram==0 && chuc==0 && donvi==0) return "";
    if(tram!=0)
    {
        KetQua += ChuSo[tram] + " trăm ";
        if ((chuc == 0) && (donvi != 0)) KetQua += " linh ";
    }
    if ((chuc != 0) && (chuc != 1))
    {
            KetQua += ChuSo[chuc] + " mươi";
            if ((chuc == 0) && (donvi != 0)) KetQua = KetQua + " linh ";
    }
    if (chuc == 1) KetQua += " mười ";
    switch (donvi)
    {
        case 1:
            if ((chuc != 0) && (chuc != 1))
            {
                KetQua += " mốt ";
            }
            else
            {
                KetQua += ChuSo[donvi];
            }
            break;
        case 5:
            if (chuc == 0)
            {
                KetQua += ChuSo[donvi];
            }
            else
            {
                KetQua += " lăm ";
            }
            break;
        default:
            if (donvi != 0)
            {
                KetQua += ChuSo[donvi];
            }
            break;
        }
    return KetQua;
}

//2. Hàm đọc số thành chữ (Sử dụng hàm đọc số có ba chữ số)

function DocTienBangChu(SoTien)
{
    var lan=0;
    var i=0;
    var so=0;
    var KetQua="";
    var tmp="";
    var ViTri = new Array();
    if(SoTien<0) return "Số tiền âm !";
    if(SoTien==0) return "Không đồng !";
    if(SoTien>0)
    {
        so=SoTien;
    }
    else
    {
        so = -SoTien;
    }
    if (SoTien > 8999999999999999)
    {
        //SoTien = 0;
        return "Số quá lớn!";
    }
    ViTri[5] = Math.floor(so / 1000000000000000);
    if(isNaN(ViTri[5]))
        ViTri[5] = "0";
    so = so - parseFloat(ViTri[5].toString()) * 1000000000000000;
    ViTri[4] = Math.floor(so / 1000000000000);
     if(isNaN(ViTri[4]))
        ViTri[4] = "0";
    so = so - parseFloat(ViTri[4].toString()) * 1000000000000;
    ViTri[3] = Math.floor(so / 1000000000);
     if(isNaN(ViTri[3]))
        ViTri[3] = "0";
    so = so - parseFloat(ViTri[3].toString()) * 1000000000;
    ViTri[2] = parseInt(so / 1000000);
     if(isNaN(ViTri[2]))
        ViTri[2] = "0";
    ViTri[1] = parseInt((so % 1000000) / 1000);
     if(isNaN(ViTri[1]))
        ViTri[1] = "0";
    ViTri[0] = parseInt(so % 1000);
  if(isNaN(ViTri[0]))
        ViTri[0] = "0";
    if (ViTri[5] > 0)
    {
        lan = 5;
    }
    else if (ViTri[4] > 0)
    {
        lan = 4;
    }
    else if (ViTri[3] > 0)
    {
        lan = 3;
    }
    else if (ViTri[2] > 0)
    {
        lan = 2;
    }
    else if (ViTri[1] > 0)
    {
        lan = 1;
    }
    else
    {
        lan = 0;
    }
    for (i = lan; i >= 0; i--)
    {
       tmp = DocSo3ChuSo(ViTri[i]);
       KetQua += tmp;
       if (ViTri[i] > 0) KetQua += Tien[i];
       if ((i > 0) && (tmp.length > 0)) KetQua += ',';//&& (!string.IsNullOrEmpty(tmp))
    }
   if (KetQua.substring(KetQua.length - 1) == ',')
   {
        KetQua = KetQua.substring(0, KetQua.length - 1);
   }
   KetQua = KetQua.substring(1,2).toUpperCase()+ KetQua.substring(2);
   return KetQua;//.substring(0, 1);//.toUpperCase();// + KetQua.substring(1);
}

 

Lập trình với SQL ::Tính tổng

Bài này mình hướng dẫn bạn lập trình bằng SQL sử dụng vòng lặp. Mô tả bằng việc tính tổng của n số nguyên

Mình đã đọc trên các diễn đàn và có nhiều bạn chưa biết dùng vòng lặp trong SQL. Ở đây mình sử dụng SQL dùng vòng lặp để tính tổng của n số nguyên.
Nếu bạn đã từng học lập trình chắc bạn đã làm bài tập tính tổng của n số bằng ngôn ngữ cơ bản như Pascal, C, ... Giải thuật của bài này thì không có gì để bàn vì nó dễ.
Cách  thực hiện trong SQL như sau:

-- =============================================
-- Author:        webmaster@hmweb.com.vn
-- Description:   <Tínt tổng>
-- =============================================

 CREATE FUNCTION [dbo].[fuTinhTong]
(
      @n int
)
RETURNS bigint
AS
BEGIN
      DECLARE @i int
      SET @i=0
      DECLARE @Tong bigint
      SET @Tong=0
        -- Dùng vòng lặp
      WHILE @i<=@n
      BEGIN
            SET @Tong = @Tong+@i 
            SET @i=@i+1
      END
      RETURN  @Tong
END
Bạn chạy thử hàm trên như sau:
SELECT dbo.fuTinhTong(20) AS Tong20 -->210
SELECT dbo.fuTinhTong(10) AS Tong20 -->55
Áp dụng bài này: Trong bài viết trước mình đã viết hàm Tính số ngày trong tháng; Khi bạn cần tính số liệu thống kê theo tháng bạn có thể thực hiện như mô tả dưới đây
DECLARE @DayOfMonth int
SET @DayOfMonth = dbo.DaysInMonth(@Thang,@nam)
IF @DayOfMonth IS NULL SET @DayOfMonth=0
DECLARE @i int
SET @i=1
WHILE @i<=@DayOfMonth
BEGIN
      -- {Khối lệnh cần tính toán}
      SET @i=@i+1
END

Lập trình với SQL : Phương trình bậc 2

Bài này mình hướng dẫn bạn lập trình bằng SQL; mô tả bằng việc giải phương trình bậc 2 trong SQL. Đây không phải là bài toán khó nhưng cái mình muốn giới thiệu đó là cách dùng ngôn ngữ SQL để lập trình.

Bạn đã quen với phương trình bậc 2  ax2+bx+c=0 với thuật giải:

Nếu a=0
    Không phải bậc 2
Nếu a>0
    Tình delta=b2-4*a*c
    Nếu delta>0
        Phương trình có 2 nghiệm, x1,x2
    Nếu delta=0
        Phương trình có nghiệm kép x=...
    Nếu delta<0
        Phương trình vô nghiệm

Thuật toán thì dễ nhưng có thể có nhiều bạn chưa biết lập trình trong SQL.

-- =============================================
-- Author:        webmaster@hmweb.com.vn
-- Description:   <Giải PT bậc 2>
-- =============================================

CREATE FUNCTION fuPhuongTrinhBac2
(
      @a decimal(18,2),
      @b decimal(18,2),
      @c decimal(18,2)
)
RETURNS nvarchar(2000)
AS
BEGIN
      DECLARE @delta decimal(18,2)
      SET @delta=0.00
      DECLARE @Result nvarchar(2000)
      SET @Result=''
      IF @a=0
            SET @Result=N'Phương trình không phải bậc 2'
      ELSE
      BEGIN
           SET @delta=@b*@b-4*@a*@c
           IF @delta>0
           BEGIN
                SET @Result=@Result+ N'Phương trình có 2 nghiệm:
                x1='+ Cast(((-@b)+SQRT(@delta))/(2*@a) AS nvarchar(300))+';'
                SET @Result=@Result+ N'
                x2='+ Cast(((-@b)-SQRT(@delta))/(2*@a) AS nvarchar(300))+''
           END
           IF @delta=0
           BEGIN
                SET @Result=@Result+ N'Phương trình có nghiệm kép
                x ='+ Cast( ((-@b)/(2*@a)) AS nvarchar(300))+';'
           END
           IF @delta<0
               SET @Result=@Result+ N'Phương trình vô nghiệm'
            END
      RETURN @Result
END
Bạn chạy thử hàm trên với lệnh:
SELECT dbo.fuPhuongTrinhBac2 (1,4,-3) AS PTB2  
--Phương trình có 2 nghiệm: x1=0.645751; x2=-4.64575
SELECT dbo.fuPhuongTrinhBac2 (1,2,-3) AS PTB2  
-- Phương trình có 2 nghiệm: x1=1; x2=-3
SELECT dbo.fuPhuongTrinhBac2 (1,4,0) AS PTB2   
-- Phương trình có 2 nghiệm: x1=0; x2=-4