Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Перевод числа в пропись

Ответить
Настройки темы
Перевод числа в пропись

Новый участник


Сообщения: 28
Благодарности: 2

Профиль | Отправить PM | Цитировать


Выручайте времени совсем нет.
Нужна подпрограмма, которая переводит деньги из числа в пропись. Например: 10598 р => десять тысяч пятьсот девяносто восемь рублей.
Как это сделать я понимаю, но не когда. Может уже есть готовый код?

Отправлено: 07:50, 16-04-2012

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата apozlevich:
Создается впечатление, что вы переписали код с VBA на AutoIt »
Так и сеть.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 18:32, 16-04-2012 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для AZJIO

Старожил


Сообщения: 265
Благодарности: 126

Профиль | Отправить PM | Цитировать


тест6

Код: Выделить весь код
#include <_NumberNumToName.au3>

$sRes = ''
For $i = 1 To 10
    $sRes &= _FuncName(Random(1, 10000000000, 1))
Next

$sRes &= _FuncName(000018)
$sRes &= _FuncName(118)
$sRes &= _FuncName(200)
$sRes &= _FuncName(5)
$sRes &= _FuncName(18000000000)
$sRes &= _FuncName(9223372036854775806) ; максимальное число
$sRes &= _FuncName(9223372036854775807) ; максимальное число поддерживаемое AutoIt3
$sRes &= _FuncName(0)

MsgBox(0, 'Сообщение', $sRes)

Func _FuncName($iNumber)
    Return StringRegExpReplace($iNumber, '(\A\d{1,3}(?=(\d{3})+\z)|\d{3}(?=\d))', '\1 ') & ' = ' & _NumberNumToName($iNumber) & @CRLF
EndFunc

; ============================================================================================
; Имя функции ...: _NumberNumToName
; Описание ........: Преобразует число в запись прописью
; Синтаксис.......: _NumberNumToName($iNumber)
; Параметры:
;       $iNumber - любое целое число от 0 до 9223372036854775806
; Возвращаемое значение: Успешно - число прописью
;                   Неудачно - пустая строка, @error = 1, если строка содержит не цифры
; Автор ..........: AZJIO, преобразование и модернизация VBS-скрипта, найденного в Google
; Ссылка ..........: http://forum.oszone.net/post-1900913.html#post1900913 обсуждение и добавление CreatoR'ом поддержки английского языка
; ============================================================================================
Func _NumberNumToName($iNumber)
    Local $aN, $aNum, $c, $i, $j, $n, $r, $sText
    $iNumber = StringStripWS($iNumber, 8) ; удаляем пробелы
    If $iNumber = '0' Then Return 'ноль'
    $iNumber = Int($iNumber) ; берём целую часть числа
    If Not StringIsDigit($iNumber) Or $iNumber>9223372036854775806 Or $iNumber=0 Then Return SetError(1, 0, '') ; если не цифры или огромное число, то вылет
    $iNumber = StringRegExpReplace($iNumber, '(\A\d{1,3}(?=(\d{3})+\z)|\d{3}(?=\d))', '\1 ') ; dwerf
    $aNum = StringSplit($iNumber, ' ')
    Local $a[4][10] = [[' десять', ' одиннадцать', ' двенадцать', ' тринадцать', ' четырнадцать', ' пятнадцать', ' шестнадцать', ' семнадцать', ' восемнадцать', ' девятнадцать'],['', ' сто', ' двести', ' триста', ' четыреста', ' пятьсот', ' шестьсот', ' семьсот', ' восемьсот', ' девятьсот'],['', '', ' двадцать', ' тридцать', ' сорок', ' пятьдесят', ' шестьдесят', ' семьдесят', ' восемьдесят', ' девяносто'],['', '', '', ' три', ' четыре', ' пять', ' шесть', ' семь', ' восемь', ' девять']]
    Local $razryad[7] = ['', ' тысяч', ' миллион', ' миллиард', ' триллион', ' квадриллион', ' квинтиллион']

    $aNum[1] = StringFormat('%03s', $aNum[1]) ; дополняем нулями недостающие разряды
    $sText = ''
    For $i = 1 To $aNum[0]
        If $aNum[$i]='000' Then ContinueLoop
        $aN = StringSplit($aNum[$i], '')
        $r=$aNum[0] - $i
        For $j = 1 To $aN[0]
            $n=Number($aN[$j])
            If Not $n Then ContinueLoop
            $c = $j
            Switch $j
                Case 3
                    Switch $n ; для чисел 1 или 2
                        Case 1
                            If $r = 1 Then ; разряд единиц (не десятков и сотен)
                                $sText &= " одна"
                            Else
                                $sText &= " один"
                            EndIf
                        Case 2
                            If $r = 1 Then
                                $sText &= " две"
                            Else
                                $sText &= " два"
                            EndIf
                    EndSwitch
                Case 2 ; для чисел от 10 до 19
                    If $n = 1 Then
                        $c = 0
                        $n = Number($aN[3])
                        $aN[3]=0
                    EndIf
            EndSwitch
            $sText &= $a[$c][$n] ; присоединения числа из массива
        Next
        $sText &= $razryad[$r]
        Switch $n ; окончания для раряда кратного 1000, при $j=3 в конце цикла
            Case 1
                If $r = 1 Then ; одна тысяч<а>
                    $sText &= "а"
                EndIf
            Case 2, 3, 4
                If $r = 1 Then ; 2,3,4 тысяч<и>
                    $sText &= "и"
                ElseIf $r > 1 Then ; 2,3,4 милион<а>
                    $sText &= "а"
                EndIf
            Case Else
                If $r > 1 Then ; 5-9 милион<ов>
                    $sText &= "ов"
                EndIf
        EndSwitch
    Next
    Return $sText
EndFunc

Последний раз редактировалось AZJIO, 04-06-2012 в 05:04.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:27, 16-04-2012 | #12


Аватара для apozlevich

Ветеран


Автор проектов


Сообщения: 1025
Благодарности: 180

Профиль | Отправить PM | Цитировать


http://chislopropisyu.appspot.com/
Простой сервис для сабжа.

-------
echo 127.0.0.1 google.ru >> %systemroot%\system32\drivers\etc\hosts && ipconfig /flushdns && echo Я ничего не трогал, оно само!


Отправлено: 19:18, 17-04-2012 | #13


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Цитата apozlevich:
Простой сервис »
Максимальное число 999 999 999.
Код: Выделить весь код
$iDig = 99999999
$sUrl = 'http://chislopropisyu.appspot.com/ajax?do_what=dig&dig=' & $iDig
$s_Sourse = InetRead($sUrl, 17)
If @error Then
    ConsoleWrite('Error' & @LF)
Else
    $s_Sourse = BinaryToString($s_Sourse, 4)
    $s_Sourse = StringRegExpReplace($s_Sourse, '.*string".*?"(.+?)"}.*', '$1')
    ConsoleWrite($s_Sourse & @LF)
EndIf

Последний раз редактировалось madmasles, 17-04-2012 в 21:06.


Отправлено: 20:56, 17-04-2012 | #14


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


AZJIO
Немного подредактировал код, теперь поддерживается и английский язык:

Код: Выделить весь код
$iNumber = Random(1, 10000000000, 1)
$sRus_Number = _NumberNumToName($iNumber, 1)
$sEng_Number = _NumberNumToName($iNumber, 0)

MsgBox(64, '_NumberNumToName', $iNumber & ' = ...' & @CRLF & @CRLF & 'Eng: ' & $sRus_Number & @CRLF & @CRLF & 'Rus: ' & $sEng_Number)



; AZJIO, преобразование и модернизация VBS-скрипта, найденного в Google
; http://forum.oszone.net/post-1900913.html#post1900913
; Преобразует число в запись прописью. Параметр $iNum - любое целое число от 1 до 9223372036854775806
Func _NumberNumToName($iNum, $iRusLng = 0)
    Local $aN, $aNum, $c, $i, $j, $n, $r, $sText

    $iNum = StringStripWS($iNum, 8) ; удаляем пробелы

    If $iNum = '0' Then
        If $iRusLng Then Return 'Ноль'
        Return 'Zero'
    EndIf

    $iNum = Int($iNum) ; берём целую часть числа
    If Not StringIsDigit($iNum) Or $iNum > 9223372036854775806 Or $iNum = 0 Then Return SetError(1, 0, '') ; если не цифры или огромное число, то вылет

    $iNum = StringRegExpReplace($iNum, '(\A\d{1,3}(?=(\d{3})+\z)|\d{3}(?=\d))', '\1 ') ; dwerf
    $aNum = StringSplit($iNum, ' ')

    If $iRusLng Then
        Dim $a[4][10] = _
            [ _
                [' десять', ' одиннадцать', ' двенадцать', ' тринадцать', ' четырнадцать', ' пятнадцать', ' шестнадцать', ' семнадцать', ' восемнадцать', ' девятнадцать'], _
                ['', ' сто', ' двести', ' триста', ' четыреста', ' пятьсот', ' шестьсот', ' семьсот', ' восемьсот', ' девятьсот'], _
                ['', '', ' двадцать', ' тридцать', ' сорок', ' пятьдесят', ' шестьдесят', ' семьдесят', ' восемьдесят', ' девяносто'], _
                ['', '', '', ' три', ' четыре', ' пять', ' шесть', ' семь', ' восемь', ' девять'] _
            ]

        Dim $aBitNum[7] = ['', ' тысяч', ' миллион', ' миллиард', ' триллион', ' квадриллион', ' квинтиллион']
    Else
        Dim $a[4][10] = _
            [ _
                [' ten', ' eleven', ' twelve', ' thirteen', ' fourteen',' fifteen', ' sixteen', ' seventeen', ' eighteen', ' nineteen'], _
                ['', 'hundred', ' two hundred', ' three hundred', ' four hundred', ' five hundred', ' six hundred', ' seven hundred', ' eight hundred', ' nine hundred'], _
                ['','', ' twenty', ' thirty', ' forty', ' fifty', ' sixty', ' seventy', ' eighty', ' ninety'], _
                ['','','', ' three', ' four', ' five', ' six', ' seven', ' eight', ' nine'] _
            ]

        Dim $aBitNum[7] = ['', ' thousand', ' million', ' billion', ' trillion', ' quadrillion', ' quintillion']
    EndIf

    $aNum[1] = StringFormat('%03s', $aNum[1]) ; дополняем нулями недостающие разряды
    $sText = ''

    For $i = 1 To $aNum[0]
        If $aNum[$i] = '000' Then ContinueLoop

        $aN = StringSplit($aNum[$i], '')
        $r = $aNum[0] - $i

        For $j = 1 To $aN[0]
            $n = Number($aN[$j])
            If Not $n Then ContinueLoop

            $c = $j

            Switch $j
                Case 3
                    Switch $n ; для чисел 1 или 2
                        Case 1
                            If $iRusLng Then
                                If $r = 1 Then ; разряд единиц (не десятков и сотен)
                                    $sText &= " одна"
                                Else
                                    $sText &= " один"
                                EndIf
                            Else
                                $sText &= " one"
                            EndIf
                        Case 2
                            If $iRusLng Then
                                If $r = 1 Then
                                    $sText &= " две"
                                Else
                                    $sText &= " два"
                                EndIf
                            Else
                                $sText &= " two"
                            EndIf
                    EndSwitch
                Case 2 ; для чисел от 10 до 19
                    If $n = 1 Then
                        $c = 0
                        $n = Number($aN[3])
                        $aN[3] = 0
                    EndIf
            EndSwitch

            $sText &= $a[$c][$n] ; присоединения числа из массива
        Next

        $sText &= $aBitNum[$r]

        Switch $n ; окончания для раряда кратного 1000, при $j=3 в конце цикла
            Case 1
                If $r = 1 And $iRusLng Then ; одна тысяч<а>
                    $sText &= "а"
                EndIf
            Case 2, 3, 4
                If $r = 1 Then ; 2,3,4 тысяч<и>
                    If $iRusLng Then
                        $sText &= "и"
                    Else
                        $sText &= "s"
                    EndIf
                ElseIf $r > 1 Then ; 2,3,4 милион<а>
                    If $iRusLng Then
                        $sText &= "а"
                    Else
                        $sText &= "s"
                    EndIf
                EndIf
            Case Else
                If $r > 1 Then ; 5-9 милион<ов>
                    If $iRusLng Then
                        $sText &= "ов"
                    Else
                        $sText &= "s"
                    EndIf
                EndIf
        EndSwitch
    Next

    Return StringStripWS($sText, 3)
EndFunc

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:57, 28-04-2012 | #15



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Перевод числа в пропись

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2007 - [решено] перевод числа в Excel 2007 в текстовую прописную форму andybus72 Microsoft Office (Word, Excel, Outlook и т.д.) 2 19-03-2012 21:27
Разное - Перевод 10ричного числа в 16ричное. Assembler dancheg Программирование и базы данных 1 17-11-2010 23:52
Числа и клетки 1.0 OSZone Software Новости программного обеспечения 0 06-08-2010 10:30
[решено] Excel, перевод числа во время. Как? Grub Хочу все знать 6 25-11-2009 10:57
Перевод десятичного числа в двойчное Guest Программирование и базы данных 2 13-03-2004 06:38




 
Переход