Войти

Показать полную графическую версию : Перевод числа в пропись


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

Creat0R
16-04-2012, 15:07
Вот вариант на английском, можно перевести значения:

$iNum = 10598
$sNumName = _NumberNumToName($iNum)
$sNumber = _NumberNameToNum($sNumName)

ConsoleWrite($sNumName & @LF)
ConsoleWrite($sNumber & @LF)

Func _NumberNameToNum($sWord)
Local $sDigits = "zero|one|two|three|four|five|six|seven|eight|nine"
Local $sTeens = "eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen"
Local $sTens = "ten|twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety"
Local $sBig = "thousand|million|billion|trillion|quadrillion|quintillion|sextillion|septillion|octillion|nonillion|" & _
"decillion|undecillion|duodecillion|tredecillion|quattuordecillion|quindecillion|sexdecillion|septend ecillion|octodecillion|novemdecillion|vigintillion"

Local $asDigits = StringSplit($sDigits, "|", 2)
Local $asTeens = StringSplit($sTeens, "|", 2)
Local $asTens = StringSplit($sTens, "|", 2)
Local $asBig = StringSplit($sBig, "|", 2)

Local $sRet = ""
Local $iTemp[3] = [0, 0, 0]
Local $aWords

; check...
If Not StringRegExp($sWord, "^(minus\s+)?((((" & $sTens & ")\s+)?(" & $sDigits & ")|(" & $sTeens & ")|(" & $sTens & "))\s+(hundred|" & $sBig & ")(\s+and)?(\s+|\z))*(((" & $sTens & ")\s+)?(" & $sDigits & ")?|(" & $sTeens & ")|(" & $sTens & "))(\s+point(\s+(" & $sDigits & "))+)?$") Then
Return SetError(1)
EndIf

$sWord = StringReplace($sWord, " and", "")

For $i = 0 To 8
$sWord = StringReplace($sWord, $asTeens[$i], "ten " & $asDigits[$i + 1])
Next

$aWords = StringSplit($sWord, " ")

If StringInStr($sWord, " point ") Then
Do
For $n = 0 To UBound($asDigits) - 1
If $asDigits[$n] = $aWords[$aWords[0]] Then
$sRet = $n & $sRet
ExitLoop
EndIf
Next

$aWords[0] -= 1
Until $aWords[$aWords[0]] <> "point"

$sRet = "." & $sRet
If $aWords[$aWords[0]] = "zero" Then $sRet = "0" & $sRet
EndIf

For $i = $aWords[0] To 1 Step -1
If $i = 1 And $aWords[1] = "minus" Then
$sRet = "-" & $sRet
ExitLoop
EndIf

If StringInStr("|" & $sDigits & "|", "|" & $aWords[$i] & "|") Then ; Digit
If $iTemp[0] <> 0 Then Return SetError(2, $i, "") ; Invalid word: @extended, expected large identifier not digit.

For $n = 0 To UBound($asDigits) - 1
If $asDigits[$n] = $aWords[$i] Then
$iTemp[0] = $n
ExitLoop
EndIf
Next
ElseIf StringInStr("|" & $sTens & "|", "|" & $aWords[$i] & "|") Then ; Tens
If $iTemp[1] <> 0 Then Return SetError(3, $i, "") ; Invalid word: @extended, expected large identifier not ten.

For $n = 0 To UBound($asTens) - 1
If $asTens[$n] = $aWords[$i] Then
$iTemp[1] = $n + 1
ExitLoop
EndIf
Next
ElseIf $aWords[$i] = "hundred" Then ; hundred
If $iTemp[2] <> 0 Then Return SetError(4, $i, "") ; Invalid word: @extended, expected large identifier not hundred.

For $n = 0 To UBound($asDigits) - 1
If $asDigits[$n] = $aWords[$i - 1] Then
$iTemp[2] = $n
$i -= 1
ExitLoop
EndIf
Next
ElseIf StringInStr("|" & $sBig & "|", "|" & $aWords[$i] & "|") Then ; BIG
$sRet = $iTemp[2] & $iTemp[1] & $iTemp[0] & $sRet

$iTemp[0] = 0
$iTemp[1] = 0
$iTemp[2] = 0
Else
Return SetError(4, $i, "") ; Invalid word: @extended, word not recognized.
EndIf
Next

$sRet = $iTemp[2] & $iTemp[1] & $iTemp[0] & $sRet

; No leading 0's
While StringLeft($sRet, 1) = "0" And StringLeft($sRet, 2) <> "0."
$sRet = StringTrimLeft($sRet, 1)
WEnd

; No trailing 0's if decimal
If StringInStr($sRet, ".") Then
While StringRight($sRet, 1) = "0"
$sRet = StringTrimRight($sRet, 1)
WEnd

If StringRight($sRet, 1) = "." Then $sRet = StringTrimRight($sRet, 1)
EndIf

Return $sRet
EndFunc

Func _NumberNumToName($iNum)
$iNum = String($iNum)
$iNum = StringStripWS($iNum, 8)
If Not StringRegExp($iNum, "^-?\d+?(\.\d+)?$") Then Return SetError(2, 0, "")
If $iNum = "0" Then Return "zero"

Local $asDigits[10] = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
Local $asTeens[9] = ["eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
Local $asTens[9] = ["ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]
Local $asBig[21] = ["thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion", "septillion", "octillion", "nonillion", _
"decillion", "undecillion", "duodecillion", "tredecillion", "quattuordecillion", "quindecillion", "sexdecillion", "septendecillion", "octodecillion", "novemdecillion", "vigintillion"]

; No leading 0's
While StringLeft($iNum, 1) = "0" And StringLeft($iNum, 2) <> "0."
$iNum = StringTrimLeft($iNum, 1)
WEnd

; No trailing 0's if decimal
If StringInStr($iNum, ".") Then
While StringRight($iNum, 1) = "0"
$iNum = StringTrimRight($iNum, 1)
WEnd

If StringRight($iNum, 1) = "." Then $iNum = StringTrimRight($iNum, 1)
EndIf

Local $iTemp
Local $iLen
Local $sRet = ""
Local $nDec = ""

; Do decimal places later
If StringInStr($iNum, ".") Then
$nDec = StringMid($iNum, StringInStr($iNum, ".") + 1)
$iNum = StringLeft($iNum, StringInStr($iNum, ".") - 1)
EndIf

; Check negative
If StringLeft($iNum, 1) = "-" Then
$iNum = StringTrimLeft($iNum, 1)
$sRet &= "minus "
EndIf

; Very big numbers
For $i = 21 To 1 Step -1
If StringLen($iNum) > $i * 3 Then
$iLen = Mod(StringLen($iNum), 3)
If $iLen = 0 Then $iLen = 3

$iTemp = StringLeft($iNum, $iLen)
$iNum = StringTrimLeft($iNum, $iLen)

$iTemp = _NumberNumToName($iTemp)
If $iTemp = "" Or $iTemp = "0" Then ContinueLoop
If Not @error Then $sRet &= $iTemp & " " & $asBig[$i - 1] & " "
EndIf
Next

; hundreds
If StringLen($iNum) >= 3 Then
$iTemp = StringLeft($iNum, 1)
$iNum = StringTrimLeft($iNum, 1)

If $iTemp <> "0" Then $sRet &= $asDigits[Int($iTemp)] & " hundred "
If $iNum <> "00" Then $sRet &= "and "
EndIf

If StringLen($iNum) = 2 And StringLeft($iNum, 1) = "1" And StringRight($iNum, 1) <> "0" Then
$iTemp = StringRight($iNum, 1)
$sRet &= $asTeens[Int($iTemp) - 1] & " "

$iNum = ""
Else
; Tens
If StringLen($iNum) = 2 Then
$iTemp = StringLeft($iNum, 1)
$iNum = StringTrimLeft($iNum, 1)

If $iTemp <> "0" Then $sRet &= $asTens[Int($iTemp) - 1] & " "
EndIf

; Digits
If StringLen($iNum) = 1 Then
If $iNum <> "0" Then $sRet &= $asDigits[Int($iNum)] & " "

$iNum = ""
EndIf
EndIf

If $nDec <> "" Then
If $sRet = "" Or $sRet = "minus " Then $sRet &= "zero "
$sRet &= "point "

Do
$iTemp = StringLeft($nDec, 1)
$nDec = StringTrimLeft($nDec, 1)

$sRet &= $asDigits[Int($iTemp)] & " "
Until $nDec = ""
EndIf

$sRet = StringTrimRight($sRet, 1)

Return $sRet
EndFunc

Iska
16-04-2012, 15:30
Creat0R, прямого перевода, вероятно, не получится, ибо у нас есть ещё такое понятие, как род: одна тысяча, но один миллион. Я думаю, проще будет взять любой из работоспособных макросов «число|сумма прописью VBA (http://www.google.ru/search?q=%D1%87%D0%B8%D1%81%D0%BB%D0%BE%7C%D1%81%D1%83%D0%BC%D0%BC%D0%B0+%D0%BF%D1%80%D0%BE%D0%BF%D0 %B8%D1%81%D1%8C%D1%8E+VBA)» и переложить его с VBA на AutoIt. Раньше их немало было на русскоязычных конкурсах Microsoft Office для разработчиков, да и так писал всяк кому не лень свой вариант (даже я ;)).

Creat0R
16-04-2012, 16:22
у нас есть ещё такое понятие, как род »
При сильном желании можно это предусмотреть.

apozlevich
16-04-2012, 16:26
Точно видел готовые программки со всеми заморочками.

Creat0R
16-04-2012, 16:51
проще будет взять любой из работоспособных макросов «число|сумма прописью VBA» и переложить его с VBA на AutoIt »
Переделал вроде:

ConsoleWrite(IntToWords(123))

Func ShortNum($num, $razr)
Dim $hundreds, $tens, $ones, $razryad
Dim $hundreds[10] = ["", " сто", " двести", " триста", " четыреста", " пятьсот", " шестьсот", " семьсот", " восемьсот", " девятьсот"]
Dim $tens[10] = ["", "", " двадцать", " тридцать", " сорок", " пятьдесят", " шестьдесят", " семьдесят", " восемьдесят", " девяносто"]
Dim $ones[20] = ["", "", "", " три", " четыре", " пять", " шесть", " семь", " восемь", " девять", " десять", " одиннадцать", " двенадцать", " тринадцать", " четырнадцать", " пятнадцать", " шестнадцать", " семнадцать", " восемнадцать", " девятнадцать"]
Dim $razryad[7] = ["", " тысяч", " миллион", " миллиард", " триллион", " квадриллион", " квинтиллион"]

Dim $t, $o

$result = $hundreds[$num / 100]

If $num = 0 Then Return

$t = Mod($num, 100) / 10
$o = Mod($num, 10)

If $t <> 1 Then
$result &= $tens[$t]

Switch $o
Case 1
If $razr = 1 Then
$result &= " одна"
Else
$result &= " один"
EndIf
Case 2
If $razr = 1 Then
$result &= " две"
Else
$result &= " два"
EndIf
Case 3, 4, 5, 6, 7, 8, 9
$result &= $ones[$o]
EndSwitch

$result &= $razryad[$razr]

Switch $o
Case 1
If $razr = 1 Then
$result &= "а"
EndIf
Case 2, 3, 4
If $razr = 1 Then
$result &= "и"
ElseIf $razr > 1 Then
$result &= "а"
EndIf
Case Else
If ($razr > 1) Then
$result &= "ов"
EndIf
EndSwitch

Else
$result &= $ones[Mod($num, 100)]
$result &= $razryad[$razr]

If $razr > 1 Then
$result &= "ов"
EndIf
EndIf

Return $result
EndFunc

Func IntToWords($s)
Dim $i, $count

If (StringLen($s) = 0) Or ($s = "0") Then
Return "ноль"
EndIf

$count = (StringLen($s) + 2) / 3

If $count > 7 Then
Return "Value is too large"
EndIf

$result = ""

For $i = 1 To $count
$result = ShortNum((StringMid($s, StringLen($s) - 3 * $i + 1, 3)), $i - 1) & $result
Next

If StringLen($result) > 0 Then
$result = StringRight($result, StringLen($result) - 1)
EndIf

If $result = "" Then $result = $s

Return $result
EndFunc

Но есть многие недоработки.

apozlevich
16-04-2012, 16:59
Продолжаю оффтопить: а зачем использовать именно AutoIt? Можно же и с VBA работать

Creat0R
16-04-2012, 17:06
Продолжаю оффтопить »
Заканчивай.

Можно же и с VBA работать »
Покажи мне нормально решение на нём, и будет решение на AutoIt.

apozlevich
16-04-2012, 17:38
проще будет взять любой из работоспособных макросов «число|сумма прописью VBA» и переложить его с VBA на AutoItПеределал вроде
Создается впечатление, что вы переписали код с VBA на AutoIt. Или это код из первого поста?

А вообще, я просто присоединился к Iska с его вторым постом
Я думаю, проще будет взять любой из работоспособных макросов «число|сумма прописью VBA (https://www.google.ru/search?q=%D1%87%D0%B8%D1%81%D0%BB%D0%BE%7C%D1%81%D1%83%D0%BC%D0%BC%D0%B0+%D0%BF%D1%80%D0%BE%D0%BF%D0 %B8%D1%81%D1%8C%D1%8E+VBA)» »
Но
Можно же и с VBA работать »

iDemon
16-04-2012, 18:16
У меня уже 30 кб кода куда нужно присобачить программу для перевода на autoit, а на vba это было бы раза в два больше. Можно и с VBA работать можно на ассемблере вообще писать, мне на autoit надо. Ладно деваться некуда пойду писать.

Creat0R
16-04-2012, 18:32
Создается впечатление, что вы переписали код с VBA на AutoIt »
Так и сеть.

AZJIO
16-04-2012, 19:27
тест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

apozlevich
17-04-2012, 19:18
http://chislopropisyu.appspot.com/
Простой сервис для сабжа.

madmasles
17-04-2012, 20:56
Простой сервис »Максимальное число 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

Creat0R
28-04-2012, 18:57
AZJIO
Немного подредактировал код, теперь поддерживается и английский язык:

$iNumber = Random (http://autoit-script.ru/autoit3_docs/functions/Random.htm)(1, 10000000000, 1)
$sRus_Number = _NumberNumToName($iNumber, 1)
$sEng_Number = _NumberNumToName($iNumber, 0)

MsgBox (http://autoit-script.ru/autoit3_docs/functions/MsgBox.htm)(64, '_NumberNumToName', $iNumber & ' = ...' & @CRLF (http://autoit-script.ru/autoit3_docs/macros.htm#@crlf) & @CRLF (http://autoit-script.ru/autoit3_docs/macros.htm#@crlf) & 'Eng: ' & $sRus_Number & @CRLF (http://autoit-script.ru/autoit3_docs/macros.htm#@crlf) & @CRLF (http://autoit-script.ru/autoit3_docs/macros.htm#@crlf) & 'Rus: ' & $sEng_Number)



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

$iNum = StringStripWS (http://autoit-script.ru/autoit3_docs/functions/StringStripWS.htm)($iNum, 8) ; удаляем пробелы

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iNum = '0' Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iRusLng Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 'Ноль'
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 'Zero'
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

$iNum = Int (http://autoit-script.ru/autoit3_docs/functions/Int.htm)($iNum) ; берём целую часть числа
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) StringIsDigit (http://autoit-script.ru/autoit3_docs/functions/StringIsDigit.htm)($iNum) Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) $iNum > 9223372036854775806 Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) $iNum = 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://autoit-script.ru/autoit3_docs/functions/SetError.htm)(1, 0, '') ; если не цифры или огромное число, то вылет

$iNum = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($iNum, '(\A\d{1,3}(?=(\d{3})+\z)|\d{3}(?=\d))', '\1 ') ; dwerf
$aNum = StringSplit (http://autoit-script.ru/autoit3_docs/functions/StringSplit.htm)($iNum, ' ')

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iRusLng Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $a[4][10] = _
[ _
[' десять', ' одиннадцать', ' двенадцать', ' тринадцать', ' четырнадцать', ' пятнадцать', ' шестнадцать', ' семнадцать', ' восемнадцать', ' девятнадцать'], _
['', ' сто', ' двести', ' триста', ' четыреста', ' пятьсот', ' шестьсот', ' семьсот', ' восемьсот', ' девятьсот'], _
['', '', ' двадцать', ' тридцать', ' сорок', ' пятьдесят', ' шестьдесят', ' семьдесят', ' восемьдесят', ' девяносто'], _
['', '', '', ' три', ' четыре', ' пять', ' шесть', ' семь', ' восемь', ' девять'] _
]

Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aBitNum[7] = ['', ' тысяч', ' миллион', ' миллиард', ' триллион', ' квадриллион', ' квинтиллион']
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#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 (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aBitNum[7] = ['', ' thousand', ' million', ' billion', ' trillion', ' quadrillion', ' quintillion']
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

$aNum[1] = StringFormat (http://autoit-script.ru/autoit3_docs/functions/StringFormat.htm)('%03s', $aNum[1]) ; дополняем нулями недостающие разряды
$sText = ''

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aNum[0]
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aNum[$i] = '000' Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)

$aN = StringSplit (http://autoit-script.ru/autoit3_docs/functions/StringSplit.htm)($aNum[$i], '')
$r = $aNum[0] - $i

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $j = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aN[0]
$n = Number (http://autoit-script.ru/autoit3_docs/functions/Number.htm)($aN[$j])
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) $n Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)

$c = $j

Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) $j
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 3
Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) $n ; для чисел 1 или 2
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 1
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iRusLng Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $r = 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ; разряд единиц (не десятков и сотен)
$sText &= " одна"
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$sText &= " один"
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$sText &= " one"
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 2
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iRusLng Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $r = 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sText &= " две"
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$sText &= " два"
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$sText &= " two"
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 2 ; для чисел от 10 до 19
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $n = 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$c = 0
$n = Number (http://autoit-script.ru/autoit3_docs/functions/Number.htm)($aN[3])
$aN[3] = 0
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)

$sText &= $a[$c][$n] ; присоединения числа из массива
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

$sText &= $aBitNum[$r]

Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) $n ; окончания для раряда кратного 1000, при $j=3 в конце цикла
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 1
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $r = 1 And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) $iRusLng Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ; одна тысяч<а>
$sText &= "а"
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 2, 3, 4
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $r = 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ; 2,3,4 тысяч<и>
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iRusLng Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sText &= "и"
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$sText &= "s"
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
ElseIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#ElseIf) $r > 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ; 2,3,4 милион<а>
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iRusLng Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sText &= "а"
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$sText &= "s"
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $r > 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ; 5-9 милион<ов>
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iRusLng Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sText &= "ов"
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$sText &= "s"
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) StringStripWS (http://autoit-script.ru/autoit3_docs/functions/StringStripWS.htm)($sText, 3)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)




© OSzone.net 2001-2012