How can I convert an integer into its verbal representation?

后端 未结 14 2274
走了就别回头了
走了就别回头了 2020-11-22 15:23

Is there a library or a class/function that I can use to convert an integer to it\'s verbal representation?

Example input:

4,567,788`

14条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-22 16:14

    Imports System.Text
    
    Public Class NumberWriter
    
        Public Shared Function Parse(ByVal Number As String) As String
            If Not AreNumbers(Number) Then Return ""
            Dim TempQueue As New Queue(Of String)
            For Each ItemA As Char In Number.Replace(",", "").Reverse
                TempQueue.Enqueue(ItemA)
            Next
            Dim Blocks As New List(Of String)
            Dim BlockEmpty As New List(Of Boolean)
            Do
                Dim TempBlock As New StringBuilder(3)
                TempBlock.Append(TempQueue.Dequeue)
                If TempQueue.Count > 0 Then
                    TempBlock.Append(TempQueue.Dequeue)
                    If TempQueue.Count > 0 Then
                        TempBlock.Append(TempQueue.Dequeue)
                    End If
                End If
                Blocks.Add(StrReverse(TempBlock.ToString))
                BlockEmpty.Add(TempBlock.ToString = "000")
                If TempQueue.Count < 1 Then Exit Do
            Loop
            Dim ResultStack As New Stack(Of String)
            For int1 As Integer = 0 To Blocks.Count - 1
                ResultStack.Push(ReadBlock(Blocks(int1)) & If(Not int1 = 0, If(Not BlockEmpty(int1), " " & CapitalizeWord(GetPlaceValueSet(int1)) & If(BlockEmpty(int1 - 1), "", ", "), ""), ""))
            Next
            Dim Result1 As String = ""
            Do Until ResultStack.Count < 1
                Result1 &= ResultStack.Pop
            Loop
            Return RemoveGrammarErrors(Result1)
        End Function
    
        Private Shared Function RemoveGrammarErrors(ByVal Str As String) As String
            Dim tstr As String = Str
            tstr.Replace("  ", " ")
            tstr.Replace(" , ", ", ")
            Return tstr
        End Function
    
        Private Shared Function AreNumbers(ByVal Str1 As String) As Boolean
            Dim Numbers() As String = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ","}
            For Each ItemA As Char In Str1
                Dim IsN As Boolean = False
                For Each ItemB As String In Numbers
                    If ItemA = ItemB Then IsN = True
                Next
                If Not IsN Then
                    Return False
                End If
            Next
            Return True
        End Function
    
        Private Shared Function ReadBlock(ByVal Block As String)
            Select Case Block.Length
                Case 1
                    Return ReadSingleDigit(Block)
                Case 2
                    Return ReadTwoDigits(Block)
                Case 3
                    Return ReadThreeDigits(Block)
                Case Else
                    Throw New Exception
            End Select
        End Function
    
        Private Shared Function ReadThreeDigits(ByVal Digits As String)
            If Digits.Length > 3 Then Throw New ArgumentException("There are too many digits.")
            Dim Result As String = ""
            If Not Digits(0) = "0" Then
                Result &= ReadSingleDigit(Digits(0)) & " Hundred "
            End If
            Result &= ReadTwoDigits(Digits.Substring(1))
            Return Result
        End Function
    
        Private Shared Function ReadTwoDigits(ByVal Digits As String)
            If Digits.Length > 2 Then Throw New ArgumentException("There are too many digits.")
            Select Case Digits(0)
                Case "0"
                    Return ReadSingleDigit(Digits(1))
                Case "1"
                    Return ReadTeenNumber(Digits)
                Case Else
                    Return ReadFirstInNumberPair(Digits(0)) & If(Digits(1) = "0", "", "-" & ReadSingleDigit(Digits(1)))
            End Select
        End Function
    
        Private Shared Function ReadSingleDigit(ByVal Digit As String) As String
            If Not Digit.Length = 1 Then Throw New ArgumentException("There must be only one digit and it must be more than zero.")
            Select Case Digit
                Case "0"
                    Return ""
                Case "1"
                    Return "One"
                Case "2"
                    Return "Two"
                Case "3"
                    Return "Three"
                Case "4"
                    Return "Four"
                Case "5"
                    Return "Five"
                Case "6"
                    Return "Six"
                Case "7"
                    Return "Seven"
                Case "8"
                    Return "Eight"
                Case "9"
                    Return "Nine"
                Case Else
                    Throw New Exception()
            End Select
        End Function
    
        Private Shared Function ReadTeenNumber(ByVal Num As String) As String
            Select Case Num
                Case "11"
                    Return "Eleven"
                Case "12"
                    Return "Twelve"
                Case "13"
                    Return "Thirteen"
                Case "14"
                    Return "Fourteen"
                Case "15"
                    Return "Fifteen"
                Case "16"
                    Return "Sixteen"
                Case "17"
                    Return "Seventeen"
                Case "18"
                    Return "Eighteen"
                Case "19"
                    Return "Nineteen"
                Case Else
                    Throw New Exception()
            End Select
        End Function
    
        Private Shared Function ReadFirstInNumberPair(ByVal Num As String) As String
            If Not (Num > 1 OrElse Num < 10) Then Throw New ArgumentException("Number must be more than 1 and less than 10")
            Select Case Num
                Case "2"
                    Return "Twenty"
                Case "3"
                    Return "Thirty"
                Case "4"
                    Return "Fourty"
                Case "5"
                    Return "Fifty"
                Case "6"
                    Return "Sixty"
                Case "7"
                    Return "Seventy"
                Case "8"
                    Return "Eighty"
                Case "9"
                    Return "Ninety"
                Case Else
                    Throw New Exception()
            End Select
        End Function
    
        Private Shared Function CapitalizeWord(ByVal Word As String) As String
            Return Word.Substring(0, 1).ToUpper & Word.Substring(1)
        End Function
    
        Private Shared Function GetPlaceValueSet(ByVal Num As Byte) As String
            Select Case Num
                Case 0
                    Return "" 'Hundreds
                Case 1
                    Return "Thousand"
                Case 2
                    Return "Million"
                Case 3
                    Return "Billion"
                Case 4
                    Return "Trillion"
                Case 5
                    Return "Quadrillion"
                Case 6
                    Return "Quintillion"
                Case 7
                    Return "Sextillion"
                Case 8
                    Return "Septillion"
                Case 9
                    Return "Octillion"
                Case 10
                    Return "Nonillion"
                Case 11
                    Return "octillion"
                Case 12
                    Return "nonillion"
                Case 13
                    Return "decillion"
                Case 14
                    Return "undecillion"
                Case 15
                    Return "dodecillion,"
                Case 16
                    Return "tredecillion"
                Case 17
                    Return "quattuordecillion"
                Case 18
                    Return "quindecillion"
                Case 19
                    Return "sexdecillion"
                Case 20
                    Return "septendecillion"
                Case 21
                    Return "octodecillion"
                Case 22
                    Return "novemdecillion"
                Case 23
                    Return "vigintillion"
                Case 24
                    Return "unvigintillion"
                Case 25
                    Return "dovigintillion"
                Case 26
                    Return "trevigintillion"
                Case 27
                    Return "quattuorvigintillion"
                Case 28
                    Return "quinvigintillion"
                Case 29
                    Return "sexvigintillion"
                Case 30
                    Return "septenvigintillion"
                Case 31
                    Return "octovigintillion"
                Case 32
                    Return "novemvigintillion"
                Case 33
                    Return "trigintillion"
                Case 34
                    Return "untrigintillion"
                Case 35
                    Return "dotrigintillion"
                Case 36
                    Return "tretrigintillion"
                Case 37
                    Return "quattuortrigintillion"
                Case 38
                    Return "quintrigintillion"
                Case 39
                    Return "sextrigintillion"
                Case 40
                    Return "septentrigintillion"
                Case 41
                    Return "octotrigintillion"
                Case Else
                    Throw New Exception
            End Select
        End Function
    End Class
    

    Sorry it's in VB.NET, but it works completely. It is one way. Number to Verbal. Handles numbers up to 123 characters long I believe.

提交回复
热议问题