CREATE FUNCTION dbo.ConvertToVietnameseDongWords (@number DECIMAL(18,2))
RETURNS NVARCHAR(1000)
AS
BEGIN
DECLARE @result NVARCHAR(1000) = ''
DECLARE @integerPart INT = FLOOR(@number)
DECLARE @decimalPart INT = (@number - @integerPart) * 100
-- 定义数字对应的越南语单词
DECLARE @units TABLE (num INT, word NVARCHAR(20))
INSERT INTO @units VALUES
(0, N'không'), (1, N'một'), (2, N'hai'), (3, N'ba'), (4, N'bốn'),
(5, N'năm'), (6, N'sáu'), (7, N'bảy'), (8, N'tám'), (9, N'chín')
DECLARE @tens TABLE (num INT, word NVARCHAR(20))
INSERT INTO @tens VALUES
(10, N'mười'), (20, N'hai mươi'), (30, N'ba mươi'), (40, N'bốn mươi'), (50, N'năm mươi'),
(60, N'sáu mươi'), (70, N'bảy mươi'), (80, N'tám mươi'), (90, N'chín mươi')
DECLARE @placeValues TABLE (place INT, word NVARCHAR(20))
INSERT INTO @placeValues VALUES
(1000000, N'triệu'), (1000, N'nghìn'), (100, N'trăm'), (10, N'mươi'), (1, N'')
-- 处理整数部分
IF @integerPart > 0
BEGIN
-- 处理百万部分
IF @integerPart >= 1000000
BEGIN
DECLARE @millions INT = @integerPart / 1000000
SET @result = @result + (SELECT word FROM @units WHERE num = @millions) + N' triệu '
SET @integerPart = @integerPart % 1000000
END
-- 处理千部分
IF @integerPart >= 1000
BEGIN
DECLARE @thousands INT = @integerPart / 1000
IF @thousands > 0
BEGIN
-- 处理百位
DECLARE @hundreds INT = @thousands / 100
IF @hundreds > 0
SET @result = @result + (SELECT word FROM @units WHERE num = @hundreds) + N' trăm '
-- 处理十位和个位
DECLARE @tensAndOnes INT = @thousands % 100
IF @tensAndOnes > 0
BEGIN
IF @tensAndOnes < 10
SET @result = @result + (SELECT word FROM @units WHERE num = @tensAndOnes) + N' '
ELSE IF @tensAndOnes < 20
SET @result = @result + N'mười ' + (SELECT word FROM @units WHERE num = @tensAndOnes % 10) + N' '
ELSE
BEGIN
DECLARE @tensPart INT = (@tensAndOnes / 10) * 10
DECLARE @onesPart INT = @tensAndOnes % 10
SET @result = @result + (SELECT word FROM @tens WHERE num = @tensPart) + ' '
IF @onesPart > 0
SET @result = @result + (SELECT word FROM @units WHERE num = @onesPart) + N' '
END
END
SET @result = @result + N'nghìn '
END
SET @integerPart = @integerPart % 1000
END
-- 处理百位
IF @integerPart >= 100
BEGIN
DECLARE @hundred INT = @integerPart / 100
SET @result = @result + (SELECT word FROM @units WHERE num = @hundred) + N' trăm '
SET @integerPart = @integerPart % 100
END
-- 处理十位和个位
IF @integerPart > 0
BEGIN
IF @integerPart < 10
SET @result = @result + (SELECT word FROM @units WHERE num = @integerPart) + N' '
ELSE IF @integerPart < 20
SET @result = @result + N'mười ' + (SELECT word FROM @units WHERE num = @integerPart % 10) + N' '
ELSE
BEGIN
DECLARE @ten INT = (@integerPart / 10) * 10
DECLARE @one INT = @integerPart % 10
SET @result = @result + (SELECT word FROM @tens WHERE num = @ten) + ' '
IF @one > 0
SET @result = @result + (SELECT word FROM @units WHERE num = @one) + N' '
END
END
SET @result = @result + N'đô la Mỹ'
END
ELSE
BEGIN
SET @result = N'không đô la Mỹ'
END
-- 处理小数部分
IF @decimalPart > 0
BEGIN
SET @result = @result + N' và '
-- 处理十位和个位
IF @decimalPart < 10
SET @result = @result + N'không mươi ' + (SELECT word FROM @units WHERE num = @decimalPart) + N' '
ELSE IF @decimalPart < 20
SET @result = @result + N'mười ' + (SELECT word FROM @units WHERE num = @decimalPart % 10) + N' '
ELSE
BEGIN
DECLARE @decimalTen INT = (@decimalPart / 10) * 10
DECLARE @decimalOne INT = @decimalPart % 10
SET @result = @result + (SELECT word FROM @tens WHERE num = @decimalTen) + ' '
IF @decimalOne > 0
SET @result = @result + (SELECT word FROM @units WHERE num = @decimalOne) + N' '
END
SET @result = @result + N'xu'
END
-- 清理多余的空格
SET @result = REPLACE(REPLACE(REPLACE(@result, ' ', ' '), ' ', ' '), ' ', ' ')
SET @result = RTRIM(LTRIM(@result))
-- 首字母大写
SET @result = UPPER(LEFT(@result, 1)) + SUBSTRING(@result, 2, LEN(@result))
RETURN @result
END
SELECT ConvertToVietnameseDongWords(56838.65) AS VietnameseDongWords