VB.NET中如何处理TextBox结果中的多余空格问题
数字转印尼语文本Terbilang函数的空格问题修复
我在VB.NET中实现数字转印尼语文本的Terbilang函数时,遇到TextBox输出结果存在多余空格的问题:输入不同数值时,输出会出现开头空格或中间多空格的情况。尝试了@AndrewMorton和@WiktorStribiżew的代码修改方案,但仍有部分案例未解决,现需要可行的解决方案。
原代码
Public Class Form6 Public Function Terbilang(ByVal nilai As Integer) As String Dim bilangan As String() = {"", "Satu", "Dua", "Tiga", "Empat", "Lima", "Enam", "Tujuh", "Delapan", "Sembilan", "Sepuluh", "Sebelas"} If nilai < 12 Then Return " " & System.Text.RegularExpressions.Regex.Replace(bilangan(CInt(nilai)), "^\s+|\s+$", " ") ElseIf nilai < 20 Then Return System.Text.RegularExpressions.Regex.Replace(Terbilang(nilai - 10) & " Belas", "^\s+|\s+$", " ") ElseIf nilai < 100 Then Return System.Text.RegularExpressions.Regex.Replace((Terbilang(CInt((nilai \ 10))) & " Puluh") + Terbilang(nilai Mod 10), "^\s+|\s+$", " ") ElseIf nilai < 200 Then Return System.Text.RegularExpressions.Regex.Replace(" Seratus" & Terbilang(nilai - 100), "^\s+|\s+$", " ") ElseIf nilai < 1000 Then Return System.Text.RegularExpressions.Regex.Replace((Terbilang(CInt((nilai \ 100))) & " Ratus") + Terbilang(nilai Mod 100), "^\s+|\s+$", " ") ElseIf nilai < 2000 Then Return System.Text.RegularExpressions.Regex.Replace(" Seribu" & Terbilang(nilai - 1000), "^\s+|\s+$", " ") ElseIf nilai < 1000000 Then Return System.Text.RegularExpressions.Regex.Replace((Terbilang(CInt((nilai \ 1000))) & " Ribu") + Terbilang(nilai Mod 1000), "^\s+|\s+$", " ") ElseIf nilai < 1000000000 Then Return System.Text.RegularExpressions.Regex.Replace((Terbilang(CInt((nilai \ 1000000))) & " Juta") + Terbilang(nilai Mod 1000000), "^\s+|\s+$", " ") ElseIf nilai < 1000000000000 Then Return System.Text.RegularExpressions.Regex.Replace((Terbilang(CInt((nilai \ 1000000000))) & " Milyar") + Terbilang(nilai Mod 1000000000), "^\s+|\s+$", " ") ElseIf nilai < 1000000000000000 Then Return System.Text.RegularExpressions.Regex.Replace((Terbilang(CInt((nilai \ 1000000000000))) & " Trilyun") + Terbilang(CInt(nilai Mod 1000000000000)), "^\s+|\s+$", " ") Else Return "" End If End Function Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click TextBox2.Text = Terbilang(CInt(TextBox1.Text)) & " Rupiah" End Sub End Class
问题示例
- 输入350000,输出为
Tiga Ratus Lima Puluh Ribu Rupiah,期望为Tiga Ratus Lima Puluh Ribu Rupiah - 输入20000,输出为
Dua Puluh Ribu Rupiah,期望为Dua Puluh Ribu Rupiah - 输入100,输出为
Seratus Rupiah,期望为Seratus Rupiah
现有修改方案的问题
- @AndrewMorton的修改仅解决了案例3(开头空格问题),但中间多空格的问题依然存在
- @WiktorStribiżew的修改解决了开头和部分中间空格问题,但案例1出现字符粘连(输出
Tiga RatusLima Puluh Ribu Rupiah)
解决方案
问题根源在于递归拼接时的空格处理不当:部分分支开头主动添加空格,且正则替换仅处理首尾空格,未合并中间多余空格;同时当子返回值为空时,拼接会产生多余空格。
修改后的代码如下:
Public Class Form6 Public Function Terbilang(ByVal nilai As Integer) As String Dim bilangan As String() = {"", "Satu", "Dua", "Tiga", "Empat", "Lima", "Enam", "Tujuh", "Delapan", "Sembilan", "Sepuluh", "Sebelas"} Dim result As String = "" If nilai < 12 Then result = bilangan(CInt(nilai)) ElseIf nilai < 20 Then result = Terbilang(nilai - 10) & " Belas" ElseIf nilai < 100 Then Dim puluhPart As String = Terbilang(CInt(nilai \ 10)) & " Puluh" Dim satuanPart As String = Terbilang(nilai Mod 10) result = If(String.IsNullOrEmpty(satuanPart), puluhPart, puluhPart & " " & satuanPart) ElseIf nilai < 200 Then result = "Seratus" & If(nilai - 100 > 0, " " & Terbilang(nilai - 100), "") ElseIf nilai < 1000 Then Dim ratusPart As String = Terbilang(CInt(nilai \ 100)) & " Ratus" Dim sisaPart As String = Terbilang(nilai Mod 100) result = If(String.IsNullOrEmpty(sisaPart), ratusPart, ratusPart & " " & sisaPart) ElseIf nilai < 2000 Then result = "Seribu" & If(nilai - 1000 > 0, " " & Terbilang(nilai - 1000), "") ElseIf nilai < 1000000 Then Dim ribuPart As String = Terbilang(CInt(nilai \ 1000)) & " Ribu" Dim sisaPart As String = Terbilang(nilai Mod 1000) result = If(String.IsNullOrEmpty(sisaPart), ribuPart, ribuPart & " " & sisaPart) ElseIf nilai < 1000000000 Then Dim jutaPart As String = Terbilang(CInt(nilai \ 1000000)) & " Juta" Dim sisaPart As String = Terbilang(nilai Mod 1000000) result = If(String.IsNullOrEmpty(sisaPart), jutaPart, jutaPart & " " & sisaPart) ElseIf nilai < 1000000000000 Then Dim milyarPart As String = Terbilang(CInt(nilai \ 1000000000)) & " Milyar" Dim sisaPart As String = Terbilang(nilai Mod 1000000000) result = If(String.IsNullOrEmpty(sisaPart), milyarPart, milyarPart & " " & sisaPart) ElseIf nilai < 1000000000000000 Then Dim trilyunPart As String = Terbilang(CInt(nilai \ 1000000000000)) & " Trilyun" Dim sisaPart As String = Terbilang(CInt(nilai Mod 1000000000000)) result = If(String.IsNullOrEmpty(sisaPart), trilyunPart, trilyunPart & " " & sisaPart) End If ' 清理多余空格:合并多个空格为单个,去除首尾空格 Return System.Text.RegularExpressions.Regex.Replace(result, "\s+", " ").Trim() End Function Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim nilai As Integer If Integer.TryParse(TextBox1.Text, nilai) Then TextBox2.Text = Terbilang(nilai) & " Rupiah" Else TextBox2.Text = "输入无效,请输入整数" End If End Sub End Class
修改说明
- 移除主动添加的开头空格:删除所有分支中开头的空格(如原代码中的
" Seratus"改为"Seratus") - 条件拼接子部分:当子返回值为空时(如数值为整百、整千时),不添加多余空格,避免出现
Puluh Ribu这类情况 - 统一空格清理:最后用正则
\s+合并所有连续空格为单个,再用Trim()去除首尾空格,确保输出格式统一 - 增加输入验证:添加
Integer.TryParse避免非整数输入报错
内容的提问来源于stack exchange,提问作者dlaksmi
相关产品推荐
相关产品推荐

