修复将Double数值转换为印尼语金额单词的VB代码
修复Visual Basic印尼语金额数字转文字代码
原代码问题分析
- 11-19区间数字翻译错误:印尼语中11是
sebelas、12是dua belas,原代码直接复用十位数组导致翻译偏差 - 整十数处理时会多出无效空格(如20会返回
dua puluh) - 整数部分为0时,结果开头直接出现
koma,不符合语法逻辑 - 未考虑Double类型的浮点精度问题,可能导致小数部分计算偏差
修复后的完整代码
Imports System Public Function ConvertDecimalToWords(decimalNumber As Double) As String Dim result As String = "" ' 定义印尼语数字词汇 Dim units() As String = {"nol", "satu", "dua", "tiga", "empat", "lima", "enam", "tujuh", "delapan", "sembilan"} Dim tens() As String = {"", "sepuluh", "dua puluh", "tiga puluh", "empat puluh", "lima puluh", "enam puluh", "tujuh puluh", "delapan puluh", "sembilan puluh"} Dim teens() As String = {"sepuluh", "sebelas", "dua belas", "tiga belas", "empat belas", "lima belas", "enam belas", "tujuh belas", "delapan belas", "sembilan belas"} ' 用Decimal类型规避Double浮点精度误差,拆分整数与小数部分 Dim decimalValue As Decimal = Convert.ToDecimal(decimalNumber) Dim integerPart As Integer = CInt(Math.Floor(decimalValue)) Dim fractionalPart As Integer = CInt(Math.Round((decimalValue - integerPart) * 100)) ' 处理整数部分 If integerPart > 0 Then result = ConvertToWords(integerPart) & " rupiah" Else result = units(0) & " rupiah" End If ' 处理小数部分 If fractionalPart > 0 Then result &= " koma " & ConvertToWords(fractionalPart) & " sen" Else result &= " koma " & units(0) & " sen" End If ' 核心数字转文字函数 Function ConvertToWords(number As Integer) As String If number < 10 Then Return units(number) ElseIf number < 20 Then ' 专门处理10-19的特殊词汇 Return teens(number - 10) Else Dim digit As Integer = number \ 10 Dim remainder As Integer = number Mod 10 ' 余数为0时不拼接空字符串,避免多余空格 Return If(remainder = 0, tens(digit), tens(digit) & " " & units(remainder)) End If End Function Return result End Function
关键修改点
- 新增
teens数组,覆盖10-19区间的印尼语特殊表达方式,解决12这类数字的翻译错误 - 调整
units数组首元素为nol,统一处理0的显示逻辑 - 改用
Decimal类型处理输入值,避免Double浮点精度导致的小数计算误差 - 优化整十数处理逻辑,余数为0时仅返回十位词汇,消除无效空格
- 补充金额单位
rupiah(印尼盾)和sen(分),贴合金额描述场景;若不需要单位可自行删除对应字段 - 修复整数部分为0时的语法问题,确保结果开头不会直接出现
koma
测试验证
- 输入
12.2→ 输出:dua belas rupiah koma dua puluh sen - 输入
0.5→ 输出:nol rupiah koma lima puluh sen - 输入
15→ 输出:lima belas rupiah koma nol sen - 输入
20.05→ 输出:dua puluh rupiah koma lima sen
内容的提问来源于stack exchange,提问作者Sohil Bagwan
相关产品推荐
相关产品推荐

