|
... snad jen párkrát opravit If na IIf : Imports System.Text
Namespace IMP.N2TNET
''' <summary>
''' Výčet slovesných rodů pro určení koncovek
''' </summary>
Public Enum NtotRod
Muzsky
Zensky
Stredni
End Enum
''' <summary>
''' Třída ntot slouží k převodu celého čísla na jeho slovní vyjádření
''' </summary>
Public Class N2T
#Region "constants"
''' <summary>
''' Kmeny jednotek do 19-ti
''' </summary>
Private arrJednotky As String() = {"", "jed", "dv", "tři", "čtyři", "pět", _
"šest", "sedm", "osm", "devět", "deset", "jedenáct", _
"dvanáct", "třináct", "čtrnáct", "patnáct", "šestnáct", "sedmnáct", _
"osmnáct", "devatenáct"}
''' <summary>
''' Kmeny desítek
''' </summary>
Private arrDesitky As String() = {"", "deset", "dvacet", "třicet", "čtyřicet", "padesát", _
"šedesát", "sedmdesát", "osmdesát", "devadesát"}
''' <summary>
''' Kmeny řádů
''' </summary>
Private arrStoTisMil As String(,) = {{"", "sto", "stě", "sta", "sta", "set"}, {"tisíc", "tisíc", "tisíce", "tisíce", "tisíce", "tisíc"}, {"milionů", "milion", "miliony", "miliony", "miliony", "milionů"}}
''' <summary>
''' Koncovky pro rody
''' </summary>
Private arrKoncovky As String(,) = {{"", "", ""}, {"en", "na", "no"}, {"a", "ě", "ě"}}
#End Region
#Region "member variable and default property initialization"
''' <summary>
''' Příznak pro oddělení mezer
''' </summary>
Private m_Mezery As Boolean
''' <summary>
''' Slovesný rod
''' </summary>
Private m_Rod As NtotRod
''' <summary>
''' Hodnota převáděného čísla
''' </summary>
Private m_Cislo As Long
''' <summary>
''' Hodnota slovního vyjádření
''' </summary>
Private m_Text As StringBuilder
#End Region
#Region "constructors and destructors"
Public Sub New()
m_Rod = NtotRod.Muzsky
End Sub
#End Region
#Region "property getters/setters"
''' <summary>
''' Příznak určující zda se ve slovním vyjádření mají vyplňovat mezery
''' </summary>
Public Property Mezery() As Boolean
Get
Return m_Mezery
End Get
Set(ByVal value As Boolean)
m_Mezery = value
End Set
End Property
''' <summary>
''' Nastavuje nebo vrací rod (mužský, ženský střední), určující koncovku slovního vyjádření čísla.
''' </summary>
Public Property Rod() As NtotRod
Get
Return m_Rod
End Get
Set(ByVal value As NtotRod)
m_Rod = value
End Set
End Property
''' <summary>
''' Nastavuje číslo, pro které je potřeba slovní vyjádření
''' </summary>
Public WriteOnly Property Cislo() As Long
Set(ByVal value As Long)
m_Cislo = value
End Set
End Property
''' <summary>
''' Vrací slovní vyjádření čísla
''' </summary>
Public ReadOnly Property Text() As String
Get
Prevod()
Return m_Text.ToString()
End Get
End Property
#End Region
#Region "private member functions"
''' <summary>
''' funkce volaná pro převod čísla na slovní vyjádření
''' </summary>
Private Sub Prevod()
Dim i As Integer
i = IIf(m_Cislo Mod 100 > 19, CInt(m_Cislo Mod 10), (IIf(m_Cislo Mod 100 <= 2, CInt(m_Cislo Mod 10), 0)))
m_Text = New StringBuilder("")
SetText(CULng(m_Cislo), 0)
m_Text.Append(arrKoncovky(IIf(i > 2, 0, i), CInt(m_Rod)))
End Sub
''' <summary>
''' Funkce, která se rekurzívně volá a provádí pársování čísla
''' </summary>
''' <param name="cislo">Převáděné číslo</param>
''' <param name="rad">Řád čísla</param>
Private Sub SetText(ByVal cislo As ULong, ByVal rad As Short)
If cislo > 0 Then
If rad Mod 3 = 0 AndAlso cislo Mod 100 <= 19 Then
SetText((cislo \ 100), CShort(rad + 2))
WriteText((cislo Mod 100), rad)
Else
SetText((cislo \ 10), CShort(rad + 1))
WriteText((cislo Mod 10), rad)
End If
End If
End Sub
''' <summary>
''' Provádí vlastní převod samostatných číslic na slovní vyjádření
''' a toto vyjádření připojí do proměnné m_text
''' </summary>
''' <param name="cislo">Převáděná číslice</param>
''' <param name="rad">řád číslice</param>
Private Sub WriteText(ByVal cislo As ULong, ByVal rad As Short)
Dim i As Integer
Select Case rad Mod 3
Case 2
m_Text.Append(arrJednotky(IIf(cislo <> 1, cislo, 0)))
If cislo = 2 Then
m_Text.Append("ě")
End If
If m_Mezery Then
m_Text.Append(" ")
End If
m_Text.Append(arrStoTisMil(0, IIf(cislo < 5, cislo, 5)))
Exit Select
Case 1
m_Text.Append(arrDesitky(cislo))
Exit Select
Case 0
m_Text.Append(arrJednotky(cislo))
i = CInt(rad \ 3)
If i = 1 OrElse i = 2 Then
m_Text.Append(IIf(cislo = 1, "en", (IIf(cislo = 2, "a", ""))))
If m_Mezery Then
m_Text.Append(" ")
End If
m_Text.Append(arrStoTisMil(CInt(rad \ 3), IIf(cislo < 5, CInt(cislo), 5)))
End If
Exit Select
End Select
If m_Mezery AndAlso rad <> 0 Then
m_Text.Append(" ")
End If
End Sub
#End Region
End Class
End Namespace
|