Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: 

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: сумма прописью
 
 автор: Силblч   (02.11.2009 в 17:49)   личное сообщение
 
 

чисто поржать, а может и найдёт своё продолжение в ваших разрабтках/усовершенствованиях!

создаем таблицу :)
pcode = числовой
pname = текст
pmask = текст
lang = текст
capcur = текст
capcop = текст
cap2 = текст
cap3 = текст
cap4 = текст

данные в csv:


pcode;pname;pmask;lang;capcur;capcop;cap2;cap3;cap4
0;ноль;0;ru;рублей;копеек;тисяч;миллионов;миллиардов
1;одна;0;ru;рублей;копейка;тысяча;;
2;две;0;ru;рублей;копейки;тысячи;;
3;три;0;ru;рублей;копейки;тысячи;миллиона;миллиарда
4;четыре;0;ru;рублей;копейки;тысячи;миллиона;миллиарда
5;пять;0;ru;рублей;копейки;тысяч;миллионов;миллиардов
6;шесть;0;ru;рублей;копейки;тысяч;миллионов;миллиардов
7;семь;0;ru;рублей;копейки;тысяч;миллионов;миллиардов
8;восемь;0;ru;рублей;копейки;тысяч;миллионов;миллиардов
9;девять;0;ru;рублей;копейки;тысяч;миллионов;миллиардов
10;десять;00;ru;рублей;копейки;тысяч;миллионов;миллиардов
11;одиннадцать;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
12;двенадцать;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
13;тринадцать;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
14;четирнадцать;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
15;пятнадцать;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
16;шестнадцать;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
17;семнадцать;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
18;восемнадцать;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
19;девятнадцать;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
20;двадцать;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
30;тридцать;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
40;сорок;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
50;пятьдесят;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
60;шестьдесят;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
70;семьдесят;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
80;восемьдесят;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
90;девяносто;00;ru;рублей;копеек;тысяч;миллионов;миллиардов
100;сто;000;ru;рублей;копеек;тысяч;миллионов;миллиардов
200;двести;000;ru;рублей;копеек;тысяч;миллионов;миллиардов
300;триста;000;ru;рублей;копеек;тысяч;миллионов;миллиардов
400;четиреста;000;ru;рублей;копеек;тысяч;миллионов;миллиардов
500;пятьсот;000;ru;рублей;копеек;тысяч;миллионов;миллиардов
600;шестьсот;000;ru;рублей;копеек;тысяч;миллионов;миллиардов
700;семьсот;000;ru;рублей;копеек;тысяч;миллионов;миллиардов
800;восемьот;000;ru;рублей;копеек;тысяч;миллионов;миллиардов
900;девятьсот;000;ru;рублей;копеек;тысяч;миллионов;миллиардов
1000000;один;0000000;ru;рубль;;;миллион;
2000000;два;0000000;ru;рубля;;;миллиона;
3000000;три;0000000;ru;рубля;;;миллиона;
4000000;четыре;0000000;ru;рубля;;;миллиона;
1000000000;один;0000000000;ru;рублей;;;;миллиард
2000000000;два;0000000000;ru;рублей;;;;миллиарда
0;ноль;0;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
1;одна;0;ua;гривня;копiйка;тисяча;;
2;дві;0;ua;гривнi;копiйки;тисячi;;
3;три;0;ua;гривнi;копiйки;тисячi;мiльона;мiльярда
4;чотири;0;ua;гривнi;копiйки;тисячi;мiльона;мiльярда
5;п'ять;0;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
6;шість;0;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
7;сім;0;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
8;вісім;0;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
9;дев'ять;0;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
10;десять;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
11;одинадцать;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
12;дванадцять;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
13;тринадцять;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
14;чотирнадцять;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
15;п'ятнадцять;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
16;шістнадцять;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
17;сімнадцять;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
18;вісімнадцять;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
19;дев'ятнадцять;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
20;двадцять;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
30;тридцять;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
40;сорок;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
50;п'ятдесят;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
60;шістдесят;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
70;сімдесят;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
80;вісімдесят;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
90;дев'яносто;00;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
100;сто;000;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
200;двісті;000;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
300;триста;000;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
400;чотириста;000;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
500;п'ятьсот;000;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
600;шістьсот;000;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
700;сімсот;000;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
800;вісімсот;000;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
900;дев'ятьсот;000;ua;гривень;копiйок;тисяч;мiльонiв;мiльярдiв
1000000;один;0000000;ua;гривень;копiйок;;мiльон;
2000000;два;0000000;ua;гривень;копiйок;;мiльона;
1000000000;один;0000000000;ua;гривень;копiйок;;;мiльярд
2000000000;два;0000000000;ua;гривень;копiйок;;;мiльярда



вот функция :) вроде работает.... только копейки не выдает :) но место под них там в коде есть... я себе доработаю... а вы пока подЫвытесь (посмотрите по украински)

'?propeace(1971.26)
Public Function propeace(amount@, Optional lang$ = "ua")
    Dim rs As DAO.Recordset
    Dim varvar() As Variant
    Dim pp$, ret$, i&, ar, ad, am, vl, chk&
    
    amount = CCur(amount)
    am = Split(amount, Mid(amount, Len(CStr(Int(amount))) + 1, 1)) 'котлеты-отдельно, мухи-отдельно
    '-- триадим деньги :)
    pp = Format(Int(am(0)), "000\|000\|000\|000")
    ar = Split(pp, "|")
    '-- загрузить шаблоны на
    ReDim varvar(0)
    Set rs = CurrentDb.OpenRecordset("select * from _propeace where lang='" & lang & "' order by pcode")
    If Not rs.EOF Then
        rs.MoveLast: rs.MoveFirst
        ReDim varvar(rs.Fields.Count, rs.RecordCount)
        varvar = rs.GetRows(rs.RecordCount)
    End If
    If UBound(varvar) = 0 Then propeace = "#Ошибка инициализации: шаблон не найден": Exit Function
    '-- сразу считаем, что у нас в карманах нольнах :)
    ret = varvar(1, 0) & " " & varvar(4, 0)
    '-- а теперь разберемся, насколько это верно
    If UBound(ar) = 3 And am(0) > 0 Then
        ret = "": pp = ""
        If Int(ar(0)) > 0 Then 'миллиардыах@еть
            ad = Split(Format(Int(ar(0)), "0\|0\|0"), "|")
            If Int(ar(0)) > 0 Then
                vl = ad(0) * 100: GoSub s4var
                If chk >= 11 And chk <= 19 Then
                    vl = chk: pp = "1G": GoSub s4var
                Else
                    vl = ad(1) * 10: GoSub s4var
                    vl = ad(2) * 1: pp = "1G": GoSub s4var
                End If
            End If
        End If
        If Int(ar(1)) > 0 Then 'мульёны
            ad = Split(Format(Int(ar(1)), "0\|0\|0"), "|")
            If Int(ar(2)) > 0 Then
                vl = ad(0) * 100: GoSub s4var
                If chk >= 11 And chk <= 19 Then
                    vl = chk: pp = "1M": GoSub s4var
                Else
                    vl = ad(1) * 10: GoSub s4var
                    vl = ad(2) * 1: pp = "1M": GoSub s4var
                End If
            End If
        End If
        If Int(ar(2)) > 0 Then 'тыдыщи
            ad = Split(Format(Int(ar(2)), "0\|0\|0"), "|")
            If Int(ar(2)) > 0 Then
                vl = ad(0) * 100: GoSub s4var
                chk = (ad(1) & ad(2)) * 1
                If chk >= 11 And chk <= 19 Then
                    vl = chk: pp = "1K": GoSub s4var
                Else
                    vl = ad(1) * 10: GoSub s4var
                    vl = ad(2) * 1: pp = "1K": GoSub s4var
                End If
            End If
        End If
        If Int(ar(3)) > 0 Then 'ссотни
            ad = Split(Format(Int(ar(3)), "0\|0\|0"), "|")
            If Int(ar(3)) > 0 Then
                vl = ad(0) * 100: GoSub s4var
                chk = (ad(1) & ad(2)) * 1
                If chk >= 11 And chk <= 19 Then
                    vl = chk: pp = "end": GoSub s4var
                Else
                    vl = ad(1) * 10: GoSub s4var
                    vl = ad(2) * 1: pp = "end": GoSub s4var
                End If
            End If
        End If
    End If 'end-of-money
    '--если есть мелочь, то здесь разгребём
    If UBound(am) > 0 Then 'мелочь
        ad = Split(Format(Int(am(1)), "0\|0"), "|")
        If Int(am(1)) > 0 Then
            ad(0) = ad(0) * 10
            ad(1) = ad(1) * 1
            'vl = ad(1) * 1: GoSub s4var
            'ret = ret & " 00 " & varvar(5, 0)
        End If
    Else
        ret = ret & " 00 " & varvar(5, 0)
    End If
    propeace = ret
    Exit Function
s4var:
    If vl = 0 Then pp = "": Return
    For i = rs.RecordCount - 1 To 1 Step -1
        Select Case pp
        Case "1M"
            vl = IIf(vl = 1 Or vl = 2, vl * 1000000, vl)
        Case "1G"
            vl = IIf(vl = 1 Or vl = 2, vl * 1000000000, vl)
        Case "end"
            If lang = "ru" Then '--както некрасиво, но пока так :)
                vl = IIf(Choose(vl, 1, 2, 3, 4), vl * 1000000, vl)
            End If
        End Select
        If varvar(0, i) = vl Then
            If vl < 10 Then
                Select Case pp
                Case "end"
                    ret = ret & " " & varvar(1, i) & " " & varvar(4, i)
                Case "1K"
                    ret = ret & " " & varvar(1, i) & " " & varvar(6, i)
                Case "1M"
                    ret = ret & " " & varvar(1, i) & " " & varvar(7, i)
                Case "1G"
                    ret = ret & " " & varvar(1, i) & " " & varvar(8, i)
                Case Else
                    ret = ret & " " & varvar(1, i)
                End Select
            Else
                Select Case pp
                Case "end"
                    ret = ret & " " & varvar(1, i) & " " & varvar(4, i)
                Case "1K"
                    ret = ret & " " & varvar(1, i) & " " & varvar(6, i)
                Case "1M"
                    ret = ret & " " & IIf(vl = 1000000 Or vl = 2000000, varvar(7, i), "")
                Case "1G"
                    ret = ret & " " & IIf(vl = 1000000000 Or vl = 2000000, varvar(8, i), "")
                Case Else
                    ret = ret & " " & varvar(1, i)
                End Select
            End If
            Exit For
        End If
    Next i
    pp = ""
    Return
End Function


  Ответить  
 
 автор: Lukas   (02.11.2009 в 19:45)   личное сообщение
 
 

Магистр, я моск сломать.

А эти 4 кусочка в цикл не получится загнать?

        If Int(ar(0)) > 0 Then 'миллиардыах@еть
            ad = Split(Format(Int(ar(0)), "0\|0\|0"), "|")
            If Int(ar(0)) > 0 Then
                vl = ad(0) * 100: GoSub s4var
                If chk >= 11 And chk <= 19 Then
                    vl = chk: pp = "1G": GoSub s4var
                Else
                    vl = ad(1) * 10: GoSub s4var
                    vl = ad(2) * 1: pp = "1G": GoSub s4var
                End If
            End If
        End If
        If Int(ar(1)) > 0 Then 'мульёны
            ad = Split(Format(Int(ar(1)), "0\|0\|0"), "|")
            If Int(ar(2)) > 0 Then
                vl = ad(0) * 100: GoSub s4var
                If chk >= 11 And chk <= 19 Then
                    vl = chk: pp = "1M": GoSub s4var
                Else
                    vl = ad(1) * 10: GoSub s4var
                    vl = ad(2) * 1: pp = "1M": GoSub s4var
                End If
            End If
        End If
        If Int(ar(2)) > 0 Then 'тыдыщи
            ad = Split(Format(Int(ar(2)), "0\|0\|0"), "|")
            If Int(ar(2)) > 0 Then
                vl = ad(0) * 100: GoSub s4var
                chk = (ad(1) & ad(2)) * 1
                If chk >= 11 And chk <= 19 Then
                    vl = chk: pp = "1K": GoSub s4var
                Else
                    vl = ad(1) * 10: GoSub s4var
                    vl = ad(2) * 1: pp = "1K": GoSub s4var
                End If
            End If
        End If
        If Int(ar(3)) > 0 Then 'ссотни
            ad = Split(Format(Int(ar(3)), "0\|0\|0"), "|")
            If Int(ar(3)) > 0 Then
                vl = ad(0) * 100: GoSub s4var
                chk = (ad(1) & ad(2)) * 1
                If chk >= 11 And chk <= 19 Then
                    vl = chk: pp = "end": GoSub s4var
                Else
                    vl = ad(1) * 10: GoSub s4var
                    vl = ad(2) * 1: pp = "end": GoSub s4var
                End If
            End If
        End If 

  Ответить  
 
 автор: Силblч   (02.11.2009 в 20:39)   личное сообщение
 
 

да можно! :) я не хотелъ
пока рассматриваю просто идею :) вроде работоспособная :)
доделать бы ;)

табличку создай - всё поймёшь ;)

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList