Имя пользователя:
Пароль:
 

Название темы: Перевод числа в пропись
Показать сообщение отдельно

Аватара для 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

Название темы: Перевод числа в пропись