You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

修改说明

  1. 移除主动添加的开头空格:删除所有分支中开头的空格(如原代码中的" Seratus"改为"Seratus")
  2. 条件拼接子部分:当子返回值为空时(如数值为整百、整千时),不添加多余空格,避免出现Puluh Ribu这类情况
  3. 统一空格清理:最后用正则\s+合并所有连续空格为单个,再用Trim()去除首尾空格,确保输出格式统一
  4. 增加输入验证:添加Integer.TryParse避免非整数输入报错

内容的提问来源于stack exchange,提问作者dlaksmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:09:59