Code:
-- ref: http://dotnet-assembly.blogspot.com/...t-numbers.html
CREATE FUNCTION fnNumberToWords
(
@Number AS BIGINT
) RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @Below20 TABLE (ID INT IDENTITY(0,1), Word VARCHAR(32))
DECLARE @Below100 TABLE (ID INT IDENTITY(2,1), Word VARCHAR(32))
DECLARE @BelowHundred AS VARCHAR(126)
INSERT @Below20 (Word) VALUES ('zero')
INSERT @Below20 (Word) VALUES ('one')
INSERT @Below20 (Word) VALUES ('two')
INSERT @Below20 (Word) VALUES ('three')
INSERT @Below20 (Word) VALUES ('four')
INSERT @Below20 (Word) VALUES ('five')
INSERT @Below20 (Word) VALUES ('six')
INSERT @Below20 (Word) VALUES ('seven')
INSERT @Below20 (Word) VALUES ('eight')
INSERT @Below20 (Word) VALUES ('nine')
INSERT @Below20 (Word) VALUES ('ten')
INSERT @Below20 (Word) VALUES ('eleven')
INSERT @Below20 (Word) VALUES ('twelve')
INSERT @Below20 (Word) VALUES ('thirteen')
INSERT @Below20 (Word) VALUES ('fourteen')
INSERT @Below20 (Word) VALUES ('fifteen')
INSERT @Below20 (Word) VALUES ('sixteen')
INSERT @Below20 (Word) VALUES ('seventeen')
INSERT @Below20 (Word) VALUES ('eighteen')
INSERT @Below20 (Word) VALUES ('nineteen')
INSERT @Below100 VALUES ('twenty')
INSERT @Below100 VALUES ('thirty')
INSERT @Below100 VALUES ('forty')
INSERT @Below100 VALUES ('fifty')
INSERT @Below100 VALUES ('sixty')
INSERT @Below100 VALUES ('seventy')
INSERT @Below100 VALUES ('eighty')
INSERT @Below100 VALUES ('ninety')
IF @Number > 99
BEGIN
SELECT @belowHundred = dbo.fnNumberToWords(@Number % 100)
END
DECLARE @NumberInWords VARCHAR(MAX)
SET @NumberInWords =
(
SELECT
CASE
WHEN @Number = 0 THEN ''
WHEN @Number BETWEEN 1 AND 19
THEN (SELECT Word FROM @Below20 WHERE ID = @Number)
WHEN @Number BETWEEN 20 AND 99
THEN (SELECT Word FROM @Below100 WHERE ID = @Number/10) + '-' + dbo.fnNumberToWords(@Number % 10)
WHEN @Number BETWEEN 100 AND 999
THEN (dbo.fnNumberToWords(@Number / 100)) + ' hundred ' +
CASE
WHEN @belowHundred <> ''
THEN 'and ' + @belowHundred ELSE @belowHundred
END
WHEN @Number BETWEEN 1000 AND 999999
THEN (dbo.fnNumberToWords(@Number / 1000)) + ' thousand ' + dbo.fnNumberToWords(@Number % 1000)
WHEN @Number BETWEEN 1000000 AND 999999999
THEN (dbo.fnNumberToWords(@Number / 1000000)) + ' million ' + dbo.fnNumberToWords(@Number % 1000000)
WHEN @Number BETWEEN 1000000000 AND 999999999999
THEN (dbo.fnNumberToWords(@Number / 1000000000)) + ' billion ' + dbo.fnNumberToWords(@Number % 1000000000)
ELSE ' INVALID INPUT'
END
)
SELECT @NumberInWords = RTRIM(@NumberInWords)
SELECT @NumberInWords = RTRIM(LEFT(@NumberInWords, LEN(@NumberInWords) - 1)) WHERE RIGHT(@NumberInWords, 1) = '-'
RETURN (@NumberInWords)
END
---------------------------------------------------------------------------------------
-- CREATE BY HienPTT - 2013.05.07
ALTER FUNCTION fnAmountToWords
(
@Amount NUMERIC(19,5)
) RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @AmountP1 BIGINT
DECLARE @AmountP2 BIGINT
DECLARE @AmountInWords NVARCHAR(4000)
SELECT @AmountP1 = CAST(SUBSTRING(CAST(@Amount AS NVARCHAR(50)), 1, CHARINDEX('.',CAST(@Amount AS NVARCHAR(50))) - 1) AS BIGINT),
@AmountP2 = CAST(SUBSTRING(CAST(@Amount AS NVARCHAR(50)), CHARINDEX('.',CAST(@Amount AS NVARCHAR(50))) + 1, 5) AS BIGINT)
--SELECT @AmountP1, @AmountP2
SELECT @AmountP2 =
CASE
WHEN @AmountP2 % 100000 = 0 THEN @AmountP2 / 100000
WHEN @AmountP2 % 10000 = 0 THEN @AmountP2 / 10000
WHEN @AmountP2 % 1000 = 0 THEN @AmountP2 / 1000
WHEN @AmountP2 % 100 = 0 THEN @AmountP2 / 100
WHEN @AmountP2 % 10 = 0 THEN @AmountP2 / 10
ELSE @AmountP2
END
--SELECT @AmountP1, @AmountP2
--SELECT dbo.fnNumberToWords(@AmountP1), dbo.fnNumberToWords(@AmountP2)
IF dbo.fnNumberToWords(@AmountP1) = ''
SELECT @AmountInWords = NULL
ELSE
SELECT @AmountInWords = dbo.fnNumberToWords(@AmountP1) + ' dollars'
IF dbo.fnNumberToWords(@AmountP2) = ''
SELECT @AmountInWords = @AmountInWords
ELSE
SELECT @AmountInWords = ISNULL(@AmountInWords + ', ', '') + dbo.fnNumberToWords(@AmountP2) + ' cents'
IF ISNULL(@AmountInWords, '') <> ''
SELECT @AmountInWords = @AmountInWords + ' only.'
IF ISNULL(@AmountInWords, '') <> ''
SELECT @AmountInWords = UPPER(LEFT(@AmountInWords, 1)) + RIGHT(@AmountInWords, LEN(@AmountInWords) - 1)
RETURN (@AmountInWords)
END
GO
SELECT dbo.fnAmountToWords(505424555141.20100)
GO
-----------------------------------------------------------------------------------------
-- ref: http://dotnet-assembly.blogspot.com/...t-numbers.html
-- CREATE by HienPTT - 2013.05.10 - ref fnNumberToWords
CREATE FUNCTION fnNumberToWords_VN
(
@Number AS BIGINT,
@Exception AS INT -- 0: @Below20, 1: @Below20_VN
) RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @Below20 TABLE (ID INT IDENTITY(0,1), Word NVARCHAR(32))
DECLARE @Below100 TABLE (ID INT IDENTITY(2,1), Word NVARCHAR(32))
DECLARE @Below20_VN TABLE (ID INT IDENTITY(0,1), Word NVARCHAR(32))
DECLARE @BelowHundred AS NVARCHAR(MAX)
INSERT @Below20 (Word) VALUES (N'không')
INSERT @Below20 (Word) VALUES (N'một')
INSERT @Below20 (Word) VALUES (N'hai')
INSERT @Below20 (Word) VALUES (N'ba')
INSERT @Below20 (Word) VALUES (N'bốn')
INSERT @Below20 (Word) VALUES (N'năm')
INSERT @Below20 (Word) VALUES (N'sáu')
INSERT @Below20 (Word) VALUES (N'bảy')
INSERT @Below20 (Word) VALUES (N'tám')
INSERT @Below20 (Word) VALUES (N'chín')
INSERT @Below20 (Word) VALUES (N'mười')
INSERT @Below20 (Word) VALUES (N'mười một')
INSERT @Below20 (Word) VALUES (N'mười hai')
INSERT @Below20 (Word) VALUES (N'mười ba')
INSERT @Below20 (Word) VALUES (N'mười bốn')
INSERT @Below20 (Word) VALUES (N'mười lăm')
INSERT @Below20 (Word) VALUES (N'mười sáu')
INSERT @Below20 (Word) VALUES (N'mười bảy')
INSERT @Below20 (Word) VALUES (N'mười tám')
INSERT @Below20 (Word) VALUES (N'mười chín')
INSERT @Below100 VALUES (N'hai mươi')
INSERT @Below100 VALUES (N'ba mươi')
INSERT @Below100 VALUES (N'bốn mươi')
INSERT @Below100 VALUES (N'năm mươi')
INSERT @Below100 VALUES (N'sáu mươi')
INSERT @Below100 VALUES (N'bảy mươi')
INSERT @Below100 VALUES (N'tám mươi')
INSERT @Below100 VALUES (N'chín mươi')
INSERT @Below20_VN (Word) VALUES (N'không')
INSERT @Below20_VN (Word) VALUES (N'mốt') -- be used
INSERT @Below20_VN (Word) VALUES (N'hai')
INSERT @Below20_VN (Word) VALUES (N'ba')
INSERT @Below20_VN (Word) VALUES (N'tư') -- be used
INSERT @Below20_VN (Word) VALUES (N'lăm') -- be used
IF @Number > 99
BEGIN
SELECT @belowHundred = dbo.fnNumberToWords_VN(@Number % 100, 0)
END
DECLARE @NumberInWords NVARCHAR(MAX)
SET @NumberInWords =
(
SELECT
CASE
WHEN @Number = 0 THEN ''
WHEN @Number BETWEEN 1 AND 19
THEN (
CASE
WHEN @Exception = 0 THEN (SELECT Word FROM @Below20 WHERE ID = @Number)
ELSE (SELECT Word FROM @Below20_VN WHERE ID = @Number)
END
)
WHEN @Number BETWEEN 20 AND 99
THEN (SELECT Word FROM @Below100 WHERE ID = @Number/10) + ' ' + dbo.fnNumberToWords_VN(@Number % 10, 1)
WHEN @Number BETWEEN 100 AND 999
THEN (dbo.fnNumberToWords_VN(@Number / 100, 0)) + N' trăm ' +
(
CASE
WHEN (@Number % 100) < 10 THEN N'linh '
ELSE ''
END
) + @belowHundred
WHEN @Number BETWEEN 1000 AND 999999
THEN (dbo.fnNumberToWords_VN(@Number / 1000, 0))+ N' nghìn '+ dbo.fnNumberToWords_VN(@Number % 1000, 0)
WHEN @Number BETWEEN 1000000 AND 999999999
THEN (dbo.fnNumberToWords_VN(@Number / 1000000, 0)) + N' triệu '+ dbo.fnNumberToWords_VN(@Number % 1000000, 0)
WHEN @Number BETWEEN 1000000000 AND 999999999999
THEN (dbo.fnNumberToWords_VN(@Number / 1000000000, 0))+ N' tỷ '+ dbo.fnNumberToWords_VN(@Number % 1000000000, 0)
ELSE N' INVALID INPUT'
END
)
RETURN (@NumberInWords)
/**
Hỏi một câu các bác đừng cười. Quả thật là mình không còn nhớ quy tắc viết số 5 trong một dãy số như thế nào cho đúng nữa rồi ~X(
Nhờ bác nào còn nhớ thì có thể nhắc lại cho biết được không
Ví dụ dãy số này chẳng hạn thì viết thế nào : 1.505.555.005
15, 205 ...
Viết? Ý bạn là "viết bằng chữ" như cái dòng ký nhận tiền khi ... ra ngân hàng ý hả ;))
1.505.555.005: Một tỉ, năm trăm linh năm triệu, năm trăm năm mươi lăm nghìn, không trăm linh năm
15: mười lăm
205: hai trăm linh năm
Còn gì nữa không? đang muốn ngủ chiều, tiện thể đỡ phải đếm cừu :))
p/s còn quy tắc ý hả, ví dụ trong cụm 3 số ***
- Nếu là 5XX: viết là năm
- Nếu là X5X: viết là năm
- Nếu là XY5: Y>0: lăm; Y=0: năm
**/
END
GO
-----------------------------------------------------------------------------------------
-- CREATE BY HienPTT - 2013.05.10
CREATE FUNCTION fnAmountToWords_VN
(
@Amount BIGINT
) RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @AmountInWords NVARCHAR(4000)
IF dbo.fnNumberToWords_VN(@Amount, 0) <> ''
SELECT @AmountInWords = dbo.fnNumberToWords_VN(@Amount, 0) + N' đồng chẵn.'
IF ISNULL(@AmountInWords, '') <> ''
SELECT @AmountInWords = UPPER(LEFT(@AmountInWords, 1)) + RIGHT(@AmountInWords, LEN(@AmountInWords) - 1)
RETURN (@AmountInWords)
END
GO
SELECT dbo.fnAmountToWords_VN(505424555141)
GO
Bookmarks