číslo, měna na slovní vyjádření   otázka

VB.NET

Zdravím řešil někdo převod čísla na slovní vyjádření? Měna např. 55,50 a slovy "padesátpětpadesát"...

Asi by to šlo šílenou skladbou podmínek a nadefinování polí, ale taky možná jednodušeji... poradí někdo?

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kolega to kdysi dělal tenkrát ještě v .NETu 1.1, takže to asi bude chtít trochu upravit. A taky to neumí desetinná čísla, ale jen int. Prozkoumejte to.

Tady je kód:

using System;
using System.Text;

namespace IMP.N2TNET
{
    /// <summary>
    /// Výčet slovesných rodů pro určení koncovek
    /// </summary>
    public enum NtotRod { Muzsky, Zensky, Stredni }

    /// <summary>
    /// Třída ntot slouží k převodu celého čísla na jeho slovní vyjádření
    /// </summary>
    public class Ntot
    {
        #region constants
        /// <summary>
        /// Kmeny jednotek do 19-ti
        /// </summary>
        private string[] arrJednotky = 
        {
            "", 
            "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 string[] arrDesitky = 
        {
            "", 
            "deset",
            "dvacet",
            "třicet",
            "čtyřicet",
            "padesát",
            "šedesát",
            "sedmdesát",
            "osmdesát",
            "devadesát"
        };

        /// <summary>
        /// Kmeny řádů
        /// </summary>
        private string[,] arrStoTisMil = 
        {
            {"", "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 string[,] arrKoncovky = 
        {
            {"", "", ""}, 
            {"en", "na", "no"}, 
            {"a", "ě", "ě"}
        };
        #endregion

        #region member variable and default property initialization
        /// <summary>
        /// Příznak pro oddělení mezer
        /// </summary>
        private bool m_Mezery;

        /// <summary>
        /// Slovesný rod
        /// </summary>
        private NtotRod m_Rod;

        /// <summary>
        /// Hodnota převáděného čísla
        /// </summary>
        private long m_Cislo;

        /// <summary>
        /// Hodnota slovního vyjádření
        /// </summary>
        private StringBuilder m_Text;
        #endregion

        #region constructors and destructors
        public Ntot()
        {
            m_Rod = NtotRod.Muzsky;
        }
        #endregion

        #region property getters/setters
        /// <summary>
        /// Příznak určující zda se ve slovním vyjádření mají vyplňovat mezery
        /// </summary>
        public bool Mezery
        {
            get
            {
                return m_Mezery;
            }
            set
            {
                m_Mezery = value;
            }
        }

        /// <summary>
        /// Nastavuje nebo vrací rod (mužský, ženský střední), určující koncovku slovního vyjádření čísla.
        /// </summary>
        public NtotRod Rod
        {
            get
            {
                return m_Rod;
            }
            set
            {
                m_Rod = value;
            }
        }

        /// <summary>
        /// Nastavuje číslo, pro které je potřeba slovní vyjádření
        /// </summary>
        public long Cislo
        {
            set
            {
                m_Cislo = value;
            }
        }

        /// <summary>
        /// Vrací slovní vyjádření čísla
        /// </summary>
        public string Text
        {
            get
            {
                Prevod();
                return m_Text.ToString();
            }
        }
        #endregion

        #region private member functions
        /// <summary>
        /// funkce volaná pro převod čísla na slovní vyjádření
        /// </summary>
        private void Prevod()
        {
            int i;

            i = m_Cislo % 100 > 19 ? (int)(m_Cislo % 10) : (m_Cislo % 100 <= 2 ? (int)(m_Cislo % 10) : 0);
            m_Text = new StringBuilder("");
            SetText((ulong)m_Cislo, 0);
            m_Text.Append(arrKoncovky[i > 2 ? 0 : i, (int)m_Rod]);
        }

        /// <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 void SetText(ulong cislo, short rad)
        {
            if (cislo > 0)
                if (rad % 3 == 0 && cislo % 100 <= 19)
                {
                    SetText((cislo / 100), (short)(rad + 2));
                    WriteText((cislo % 100), rad);
                }
                else
                {
                    SetText((cislo / 10), (short)(rad + 1));
                    WriteText((cislo % 10), rad);
                }

        }

        /// <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 void WriteText(ulong cislo, short rad)
        {
            int i;

            switch (rad % 3)
            {
                case 2:
                    m_Text.Append(arrJednotky[cislo != 1 ? cislo : 0]);
                    if (cislo == 2)
                        m_Text.Append("ě");
                    if (m_Mezery)
                        m_Text.Append(" ");
                    m_Text.Append(arrStoTisMil[0, cislo < 5 ? cislo : 5]);
                    break;
                case 1:
                    m_Text.Append(arrDesitky[cislo]);
                    break;
                case 0:
                    m_Text.Append(arrJednotky[cislo]);
                    i = (int)(rad / 3);
                    if (i == 1 || i == 2)
                    {
                        m_Text.Append(cislo == 1 ? "en" : (cislo == 2 ? "a" : ""));
                        if (m_Mezery)
                            m_Text.Append(" ");
                        m_Text.Append(arrStoTisMil[(int)(rad / 3), cislo < 5 ? (int)cislo : 5]);
                    }
                    break;
            }
            if (m_Mezery && rad != 0)
                m_Text.Append(" ");
        }
        #endregion
    }
}
nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

díky, mrknu na to a jestli se tím prokoušu, určitě vystavím funkční kod :-) díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

tak jsem se tím nějak nedokazal překousat a převést na vb.net kod... je pravda že některé věci jsem pochytil jak se to asi dělá, ale, kdyby měl někdo funkční kod, byl bych vděčen

děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

http://www.developerfusion.com/tools/con... to zvládl :)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

moc díky... vyzkouším :-) tohle jsem neznal :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

... 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
nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback